Qt 正确的 connect() 调用

Posted

技术标签:

【中文标题】Qt 正确的 connect() 调用【英文标题】:Qt proper connect() calling 【发布时间】:2015-07-05 07:58:33 【问题描述】:

我对@9​​87654322@ 方法有疑问,以下这些调用均不起作用:

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 中)并且不能编译。backQPushButtontutorial 是自定义@ 987654329@上课。通过调用自定义函数(以供进一步使用)来实现此方法很重要。谁能告诉我实现这个的正确方法?

更新:

问题出在我的CMakeLists.txt 上,我在我的课程中添加了set(CMAKE_AUTOMOC ON)Q_Object 宏,现在它工作正常。

【问题讨论】:

您的exit_button_clicked() 是否在您的头文件中声明为插槽? "谁能告诉我正确的实现方法??" Qt 文档有大约数万亿个。 @Slyps 是的,我知道(我已经阅读了一百遍)但是第一种方法必须生成正确的答案,我认为它没有任何问题。我只是想不通为什么它不起作用 @kefir500 是的,这是我的实现:link 【参考方案1】:

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

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

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

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

我希望这可以澄清它。查看文档不会造成任何伤害。

【讨论】:

感谢您的回复,但它仍然不起作用(第二种方法),它给了我不理解的编译错误:link 关于第一个,这就是我的方式实现它:link 我的CMakeLists.txt 文件是问题所在,我添加了set(CMAKE_AUTOMOC ON),现在它工作正常(两种方法),谢谢您的回复:-)【参考方案2】:

我想,您的 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 关键字)。

插槽也可以是公开的或受保护的,如您所愿。

【讨论】:

你的班级缺少Q_OBJECT 是的,我已经删除了它,因为它给我编译错误:undefined reference to 'vtable for MyMenu' 好的,我的CMakeLists.txt 文件有问题,我添加了set(CMAKE_AUTOMOC ON),现在它工作正常,谢谢您的回复:-)

以上是关于Qt 正确的 connect() 调用的主要内容,如果未能解决你的问题,请参考以下文章

调用未定义函数 oci_connect()

学习笔记——mail发送javax.mail.AuthenticationFailedException: failed to connect at javax.mail.Service.connec

Qt Connect 无法连接到插槽

我的世界联机:出现了这串字母 Java.net.connect.exception:connec

Qt信号槽原理(链接)

致命错误:调用未定义函数 oci_connect()