对qt中的signal和slots使用另一个类对象

using another class object for signal and slots inside qt

本文关键字:另一个 对象 slots qt 中的 signal      更新时间:2023-10-16

考虑以下场景:

我已经在我的c++应用程序中集成了QT。我希望从GUI而不是终端输入数据。为此,我为QT创建了一个函数。我的对话框窗口由三行文本和一个按钮组成,单击该按钮后,我想调用其他类的特定方法。我在SINGAL和SLOTS方面遇到了问题。

考虑以下文件:

main.cpp has 
a.h -> a.cpp
a.cpp has 
a.h
myslots.h

a.pp中的QT应用程序方法为:

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)

实际上,我想通过点击按钮,将三个文本行中的三个双值(比如:1.3、2.4、4.5)传递给一个函数,其中要调用的函数位于myslots.h继承的另一个类中,该类接受三个参数。

目前我只是在测试我是否能够正确调用该函数,但我不能。

感谢

这将不起作用。在SIGNALSLOT中,必须是类型,而不是对象或其引用。我是说这个

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

必须是

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

但是,您必须发现另一个错误-信号中的A在哪里?你为什么在信号中使用A?

一些问题:

1-当tou从QObject派生时,总是把Q_OBJECT宏放在类的私有部分,做一些类似的事情

class MyClass: public QObject {
    Q_OBJECT
public:
   ...

这个Q_OBJECT宏对于具有信号和槽的类是重要的。

2-在connect语句中,你必须告诉Qt参数的类型,而不是你使用的名称,也就是说,如果你的slot函数是

void myslots::clickButton(A &a);

你用连接到它

connect(emiterObject, SIGNAL(someSignal(A)), targetObject, SLOT(clickButton(A)));

由于Qt5.x,您可以使用lambda表达式作为slot。

所以你的连接语句应该看起来像:

QObject::connect(button, &QPushButton::clicked, [a, ms](){ms.clickButton(&a);});

但是,正如Karsten Koop所说,使用ams作为局部变量并不是一件好事。

错误在您的:中

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

必须是:

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

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

相关文章: