Qt正确connect()调用

时间:2015-07-05 07:58:34

标签: c++ qt signals-slots

我对connect()方法有疑问,以下调用不起作用:

connect(tutorial->back, SIGNAL(clicked()), this, SLOT(exit_button_clicked()));
connect(tutorial->back, &QPushButton::clicked(), this, &MyMainWindow::exit_button_clicked());

第一个没有调用exit_button_clicked(),第二个告诉我clicked()必须是静态的(在Clion中)并且不编译。backQPushButton tutorial是一个自定义QWidget类。通过调用自定义函数(进一步使用)来实现此方法很重要。任何人都可以告诉我实现这个的正确方法吗?

更新:

问题出在我的CMakeLists.txt上,我在课程中添加了set(CMAKE_AUTOMOC ON)Q_Object宏,现在效果很好。

2 个答案:

答案 0 :(得分:2)

在第一种情况下,exit_button_clicked()广告位一定有问题。它应该是一个简单的成员函数,slots说明符使用void并在void宏的类中返回Q_OBJECT。如果连接失败,它会在运行时将错误写入控制台(可能通过qDebug())。

在第二种情况下,很明显在函数名后面有额外的()。获取函数的地址如下所示:

connect(tutorial->back, &QPushButton::clicked, this, &MyMainWindow::exit_button_clicked);

&QPushButton::clicked()尝试调用该函数并获取返回值的地址,这当然在编译时失败,因为QPushButton::clicked不是static

我希望这能澄清它。查看文档不会对任何伤害更严重。

答案 1 :(得分:0)

我认为,您的exit_button_clicked()被声明为私有或公共功能(而不是插槽)。 Qt自定义信号和插槽必须以适当的方式声明。例如,您有类Tutorial:

class Tutorial : QWidget {
    Q_OBJECT
    // Your class members go here.
    // Add this slot declaration:
    private slots:
        void exit_button_clicked();
}

(请注意slots旁边的private关键字。

根据您的意愿,老虎机也可以是公共的或受保护的。