Автор Гілка: Допоможіть спростити приклад ( boost, Qt)  (Прочитано 1566 раз)

Відсутній motya

  • Новачок
  • *
  • дописів: 33
  • Карма: +0/-0
  • I Love YaBB 2!
Потрібно продемонструвати роботу boost::signal у себе на роботі.

Створив "простий" приклад інкременту лічильника при натисканні на QPushButton.
Але виходить якось не дуже "просто". Особливо не подобається мій setParent і вказівник MyPushButton* parent у тілі делегату.
Я новачок в boost, що я пропустив? Як спростити приклад до природнього вигляду?.

P.S. Я знаю що в Qt існують свої класні signals & slots, прохання цю тему не підіймати.

#include <boost/signal.hpp>
#include <boost/bind.hpp>
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#define QT_NO_KEYWORDS

class MyPushButton : public QPushButton
{
public:
      MyPushButton()
      {
            slotButtonClick.setParent(this);
            signalPress.connect(slotButtonClick);
            clC = 0;
      }
      
private:
      void mousePressEvent ( QMouseEvent * e )
      {
            QPushButton::mousePressEvent(e);
      }
      void mouseReleaseEvent ( QMouseEvent * e )
      {      
            QPushButton::mouseReleaseEvent(e);
            ++clC;
            signalPress();
      }

      boost::signal<void()> signalPress;
      unsigned long clC;
      
      struct onButtonClick
      {
            void setParent(MyPushButton* aParent)
            {
                  parent = aParent;
            }
            void operator()()const
            {
                  if ( parent->clC == 1)
                        parent->setText(tr("You clicked this button "));
                  else
                        parent->setText(tr("Clicked this button ") + QString::number(parent->clC) + tr(" times!"));
            }
            MyPushButton* parent;
      } slotButtonClick;

};

int main(int argc, char ** argv)
{
      QApplication app (argc, argv);
      MyPushButton *mbtn = new MyPushButton();
      mbtn->setText("Untouched button");
      mbtn->show();

      return app.exec();
}