У меня есть класс, расширяющий класс 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()
. Теперь я могу представить, что этого можно достичь только следующим образом:
соединяет clicked()
сигнал объекта pushButton
с локальной ячейкой и передает сигнал pushButtonClicked()
оттуда.
Установите MyWidget
как mouseEventFilter для pushButton
и обработайте его внутри MyWidget::mouseClickedEvent
Есть ли другие варианты? Например, позволить Qt Framework использовать MyWidget :: pushButtonClicked () вместо pushButton->clicked()
В проекте у меня есть много подобных сценариев, когда такая передача сигналов необходима от классов-оболочек, таких как MyWidget
, которые обертывают / абстрагируют UI путем агрегации или наследования. В целом, который считается лучшим подходом для лучшего дизайна, повторное использование кода esp. когда проект находится на начальной стадии, и неизвестно, какой из этих интерфейсов может нуждаться в сложной бизнес-логике в будущем.
Обратите внимание, что расширение QPushButton не является опцией.