Qt正确的connect()调用

Qt proper connect() calling

本文关键字:调用 connect Qt      更新时间:2023-10-16

我有一个关于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宏,现在它工作得很好。

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

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

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

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

我希望这能澄清这一点。查阅文档不会对邻居造成任何伤害。

我想,您的exit_button_clicked()被声明为私有或公共函数(而不是槽(。Qt自定义信号和插槽必须以正确的方式声明。例如,你有你的课程教程:

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

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

插槽也可以是公共的或受保护的,根据您的意愿。