2

我有一个类扩展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()。现在我可以想象实现这一点的唯一方法是:

  1. 将对象的clicked()信号连接pushButton到本地插槽并pushButtonClicked()从那里发出信号。

  2. 安装MyWidget为 mouseEventFilterpushButton并在里面处理它MyWidget::mouseClickedEvent

还有其他选择吗?就像以某种方式让 Qt 框架使用 'MyWidget::pushButtonClicked()' 而不是pushButton->clicked()

在项目中,我有很多这样的场景,其中需要从包装类(如 )中传递此类信号,这些类MyWidget通过聚合或继承来包装/抽象 UI。一般来说,这被认为是更好设计的最佳方法,尤其是代码重用。当项目处于初期阶段并且不知道将来哪些 UI 可能需要复杂的业务逻辑时。

请注意,扩展 QPushButton 不是一种选择。

4

1 回答 1

7

您可以直接连接信号 =)

connect(pushButton , SIGNAL(clicked()), this, SIGNAL(pushButtonClicked()));
于 2011-06-21T15:30:06.790 回答