我有一个类扩展QWidget
类,这个类使用 QtDesigner 生成的 Ui 类。如下所示:
class MyWidget : public QWidget
{
signals:
void pushButtonClicked();
// ....
private:
Ui::MyUi ui;
}
MyWidget::MyWidget()
{
ui = new Ui::MyUi();
ui->setupUi(this);
}
现在让我们假设里面有一个QPushButton * pushButton
字段Ui::MyUi
。此小部件的 UI 没有复杂的业务逻辑。
现在要求无论何时pushButton
单击此小部件都应该发出一个信号(让我们称之为它pushButtonClicked()
。现在我可以想象实现这一点的唯一方法是:
将对象的
clicked()
信号连接pushButton
到本地插槽并pushButtonClicked()
从那里发出信号。安装
MyWidget
为 mouseEventFilterpushButton
并在里面处理它MyWidget::mouseClickedEvent
还有其他选择吗?就像以某种方式让 Qt 框架使用 'MyWidget::pushButtonClicked()' 而不是pushButton->clicked()
在项目中,我有很多这样的场景,其中需要从包装类(如 )中传递此类信号,这些类MyWidget
通过聚合或继承来包装/抽象 UI。一般来说,这被认为是更好设计的最佳方法,尤其是代码重用。当项目处于初期阶段并且不知道将来哪些 UI 可能需要复杂的业务逻辑时。
请注意,扩展 QPushButton 不是一种选择。