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