【问题标题】:Connecting to signals of private widgets连接到私有小部件的信号
【发布时间】:2012-05-30 15:27:25
【问题描述】:

当您创建一个小部件时,QtCreator 设置为默认设置,它的类会创建该类私有的表单。所以你有例如这样的东西:

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

//...

private:
    Ui::MainWindow *ui;
};

现在我想知道的是如何连接到ui 中的信号。例如,如果此小部件嵌入到 QStackedWidget 中,并且当按下按钮时,显示的页面需要更改。我会考虑连接到按钮,但ui 是私人的,所以我不能。

我是否必须在MainWindow 中创建信号,然后在其中将“ui”信号连接到它们,从而使层次结构冒泡?还是我错过了一些简单的事情?

【问题讨论】:

    标签: qt


    【解决方案1】:

    你不能让一个不相关的对象连接到聚合组件的信号/槽,即使你可以这样做会破坏封装并成为维护的噩梦。

    您需要通过将聚合组件的信号/槽添加到MainWindow API 来公开它们,然后在定义中调用相关的ui 组件方法。

    例如,在MainWindow 定义中,添加:

    signals:
        void buttonClicked();
    

    然后在构造函数中,做:

    connect( ui->button, SIGNAL( clicked() ), this, SIGNAL( buttonClicked() ) );
    

    这样,您的 MainWindow 类会从它的聚合中传播信号 - 但会精确调整到您打算如何使用该类。

    【讨论】:

    • 感谢您的回复。我已经意识到维护这将是一场噩梦,这就是为什么我要努力做到正确,所以我会学习最好的流程:-)所以如果我理解正确你的意思是在我的聚合组件中我需要创建表示按钮单击的信号,然后我的MainWindow 将连接到该信号,然后在聚合组件中它只是将信号连接在一起的情况?
    • @Firedragon 我已经编辑了我的答案以添加一个示例。对于插槽,请将您的插槽添加到标题中,然后在其定义中直接调用聚合组件(您不能在 connect() 调用中将插槽链接在一起)。
    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    相关资源
    最近更新 更多