考虑以下情况:
我已在我的c ++应用程序中集成了QT。我希望从GUI而不是终端输入数据。为此,我为QT创建了一个功能。我的对话窗口由三个文本行和一个按钮组成,点击后我想调用其他类的特定方法。我在使用SINGAL和SLOTS时遇到了麻烦。
考虑以下文件:
main.cpp has
a.h -> a.cpp
a.cpp has
a.h
myslots.h
和a.cpp中的QT app方法:
int A::inputData(){
...
A a
myslots ms;
QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));
....
}
myslots.h有:
a.h and inherited from A as:
class myslots : public QObject, public A {
Q_OBJECT
public slots:
void clickButton(A &a);
signals:
void buttonClicked();
};
myslots.cpp有:
myslots.h and the following method
void myslots::clickButton(A &a) {
cout <<"I am called successfully"<<endl;
a.perform_action(-2.3, 4.5, 4.4);
emit this->buttonClicked();
}
我收到以下错误:
QObject::connect: No such slot myslots::clickButton(&a)
实际上我想通过单击按钮将三个文本行中的三个double值传递给一个函数:1.3,2.4,4.5,其中要调用的函数位于myslots.h继承的另一个类中,并接受三个参数
目前我正在测试我能否正确调用该功能,但不是。
由于
答案 0 :(得分:2)
一些问题:
1 - 当tou从QObject派生时,总是将Q_OBJECT宏放在类的私有部分中,执行类似
的操作HF = zeros(NN, NN);
for j1=1:NN
for j2=1:NN
HF(j1,j2)=hf(mod((j1-j2),NN)+1);
end
end
这个Q_OBJECT宏对于有信号和插槽的类很重要。
2 - 在connect语句中,您必须告诉Qt参数的类型,而不是您使用的名称,也就是说,如果您的插槽功能是
class MyClass: public QObject {
Q_OBJECT
public:
...
您使用
连接到它void myslots::clickButton(A &a);
答案 1 :(得分:2)
这不起作用。 SIGNAL 或 SLOT 必须是类型,而不是对象或其引用。我是说这个
QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));
必须是
QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(A)));
但是你必须抓住另一个错误 - SIGNAL 中的A在哪里?为什么你在信号中使用A?
答案 2 :(得分:1)
从Qt 5.x开始,您可以将lambda表达式用作插槽。
所以你的连接语句应如下所示:
QObject::connect(button, &QPushButton::clicked, [a, ms](){ms.clickButton(&a);});
但是,正如Karsten Koop所说,使用a
和ms
作为局部变量并不是一件好事。
答案 3 :(得分:0)
错误发生在:
QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));
必须是:
QObject::connect(button, SIGNAL(clicked(A)), &ms, SLOT(clickButton(A)));
您在SIGNAL中发送的类型必须位于接收该类型的SLOT中。