Qt 正确的 connect() 调用
Posted
技术标签:
【中文标题】Qt 正确的 connect() 调用【英文标题】:Qt proper connect() calling 【发布时间】:2015-07-05 07:58:33 【问题描述】:我对@987654322@ 方法有疑问,以下这些调用均不起作用:
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 中)并且不能编译。back
是QPushButton
,tutorial
是自定义@ 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() 调用的主要内容,如果未能解决你的问题,请参考以下文章
学习笔记——mail发送javax.mail.AuthenticationFailedException: failed to connect at javax.mail.Service.connec