Qt:捕获和传递信号的最佳机制

the*_*ark 2 qt signals-slots qwidget

我有一个类扩展QWidget类,这个类使用QtDesigner生成的Ui类.如下:

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

}

MyWidget::MyWidget()
{
    ui = new Ui::MyUi();
    ui->setupUi(this);
}
Run Code Online (Sandbox Code Playgroud)

现在让我们假设里面有一个QPushButton * pushButton字段Ui::MyUi.此窗口小部件的UI没有复杂的业务逻辑.

现在要求无论何时pushButton点击这个小部件都应该发出一个信号(让我们调用它pushButtonClicked().现在我能想象实现这个目的的唯一方法是:

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

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

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

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

请注意,不能选择扩展QPushButton.

Fez*_*vez 7

你可以直接连接信号=)

connect(pushButton , SIGNAL(clicked()), this, SIGNAL(pushButtonClicked()));
Run Code Online (Sandbox Code Playgroud)