【问题标题】:Qt: Best mechanism to capture and pass signalsQt:捕获和传递信号的最佳机制
【发布时间】: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()。现在我可以想象实现这一点的唯一方法是:

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

  2. MyWidget 安装为pushButton 的mouseEventFilter 并在MyWidget::mouseClickedEvent 中处理它

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

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

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

【问题讨论】:

    标签: qt signals-slots qwidget


    【解决方案1】:

    你可以直接连接信号 =)

    connect(pushButton , SIGNAL(clicked()), this, SIGNAL(pushButtonClicked()));
    

    【讨论】:

    • 谢谢。我应该知道的更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2022-01-18
    相关资源
    最近更新 更多