Qt: Лучший механизм для захвата и передачи сигналов - PullRequest
2 голосов
/ 21 июня 2011

У меня есть класс, расширяющий класс QWidget, и этот класс использует класс Ui, сгенерированный QtDesigner. Примерно так:

class MyWidget : public QWidget
{
   signals:
            void pushButtonClicked();
   // ....
   private:
            Ui::MyUi ui;

}

MyWidget::MyWidget()
{
    ui = new Ui::MyUi();
    ui->setupUi(this);
}

Теперь предположим, что внутри Ui::MyUi есть поле QPushButton * pushButton. Интерфейс для этого виджета не имеет сложной бизнес-логики.

Теперь требуется, чтобы при нажатии на pushButton этот виджет генерировал сигнал (назовем его pushButtonClicked(). Теперь я могу представить, что этого можно достичь только следующим образом:

  1. соединяет clicked() сигнал объекта pushButton с локальной ячейкой и передает сигнал pushButtonClicked() оттуда.

  2. Установите MyWidget как mouseEventFilter для pushButton и обработайте его внутри MyWidget::mouseClickedEvent

Есть ли другие варианты? Например, позволить Qt Framework использовать MyWidget :: pushButtonClicked () вместо pushButton->clicked()

В проекте у меня есть много подобных сценариев, когда такая передача сигналов необходима от классов-оболочек, таких как MyWidget, которые обертывают / абстрагируют UI путем агрегации или наследования. В целом, который считается лучшим подходом для лучшего дизайна, повторное использование кода esp. когда проект находится на начальной стадии, и неизвестно, какой из этих интерфейсов может нуждаться в сложной бизнес-логике в будущем.

Обратите внимание, что расширение QPushButton не является опцией.

1 Ответ

7 голосов
/ 21 июня 2011

Вы можете подключить сигналы напрямую =)

connect(pushButton , SIGNAL(clicked()), this, SIGNAL(pushButtonClicked()));
...