我对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中)并且不编译。back
是QPushButton
tutorial
是一个自定义QWidget
类。通过调用自定义函数(进一步使用)来实现此方法很重要。任何人都可以告诉我实现这个的正确方法吗?
问题出在我的CMakeLists.txt
上,我在课程中添加了set(CMAKE_AUTOMOC ON)
和Q_Object
宏,现在效果很好。
答案 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
关键字。
根据您的意愿,老虎机也可以是公共的或受保护的。