在qt中使用另一个类对象作为信号和插槽

时间:2016-05-18 13:17:36

标签: c++ qt

考虑以下情况:

我已在我的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继承的另一个类中,并接受三个参数

目前我正在测试我能否正确调用该功能,但不是。

由于

4 个答案:

答案 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所说,使用ams作为局部变量并不是一件好事。

答案 3 :(得分:0)

错误发生在:

QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));

必须是:

QObject::connect(button, SIGNAL(clicked(A)), &ms, SLOT(clickButton(A)));

您在SIGNAL中发送的类型必须位于接收该类型的SLOT中。