C++ 为qt内的信号和插槽使用另一个类对象
考虑以下场景: <>我在C++应用程序中集成了Qt。我希望从GUI而不是终端输入数据。为此,我为QT创建了一个函数。我的对话框窗口由三行文本和一个按钮组成,单击该按钮我想调用其他类的特定方法。我的信号和插槽有问题 考虑以下文件:C++ 为qt内的信号和插槽使用另一个类对象,c++,qt,C++,Qt,考虑以下场景: 我在C++应用程序中集成了Qt。我希望从GUI而不是终端输入数据。为此,我为QT创建了一个函数。我的对话框窗口由三行文本和一个按钮组成,单击该按钮我想调用其他类的特定方法。我的信号和插槽有问题 考虑以下文件: 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(butto
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();
}
实际上,我想通过单击按钮将三个文本行中的三个双值传递给函数,即:1.3、2.4、4.5,其中要调用的函数位于myslot.h继承的另一个类中,并接受三个参数
目前我正在测试我是否能够正确调用该函数,但我没有
谢谢一些问题:
1-当您从QObject派生时,始终将Q_OBJECT宏放在类的私有部分,执行如下操作
class MyClass: public QObject {
Q_OBJECT
public:
...
此Q_对象宏对于具有信号和插槽的类很重要
2-在connect语句中,您必须告诉Qt参数的类型,而不是您使用的名称,也就是说,如果插槽函数是
void myslots::clickButton(A &a);
您连接到它的
connect(emiterObject, SIGNAL(someSignal(A)), targetObject, SLOT(clickButton(A)));
一些问题:
1-当您从QObject派生时,始终将Q_OBJECT宏放在类的私有部分,执行如下操作
class MyClass: public QObject {
Q_OBJECT
public:
...
此Q_对象宏对于具有信号和插槽的类很重要
2-在connect语句中,您必须告诉Qt参数的类型,而不是您使用的名称,也就是说,如果插槽函数是
void myslots::clickButton(A &a);
您连接到它的
connect(emiterObject, SIGNAL(someSignal(A)), targetObject, SLOT(clickButton(A)));
这是行不通的。在信号中或插槽必须是类型,而不是对象或其引用。我是说这个
QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));
一定是
QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(A)));
但是,您必须捕获另一个错误-信号中的A在哪里?为什么在信号中使用A?这不起作用。在信号中或插槽必须是类型,而不是对象或其引用。我是说这个
QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));
一定是
QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(A)));
但是,您必须捕获另一个错误-信号中的A在哪里?为什么在信号中使用A?因为Qt 5.x,所以可以使用lambda表达式作为插槽 因此,您的connect语句应该如下所示:
QObject::connect(button, &QPushButton::clicked, [a, ms](){ms.clickButton(&a);});
但是,正如Karsten Koop所说,使用
a
和ms
作为局部变量并不是一件好事。因为Qt 5.x可以使用lambda表达式作为插槽
因此,您的connect语句应该如下所示:
QObject::connect(button, &QPushButton::clicked, [a, ms](){ms.clickButton(&a);});
但是,正如Karsten Koop所说,使用a
和ms
作为局部变量并不是一件好事。错误在于:
QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));
它必须是:
QObject::connect(button, SIGNAL(clicked(A)), &ms, SLOT(clickButton(A)));
您在信号中发送的类型必须在接收该类型的插槽中。错误在您的:
QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));
它必须是:
QObject::connect(button, SIGNAL(clicked(A)), &ms, SLOT(clickButton(A)));
您在信号中发送的类型必须在接收该类型的插槽中。您的类中有
Q\u对象
宏吗?是的,我在myslot中有。HY您不能在connect
语句中传递参数。您只能在发出信号时执行此操作:emit mySignal(&a)
。是否要将局部变量a
作为参数传递给插槽?这无法工作,因为调用插槽时局部变量不再存在。您可以做的是将单击的信号连接到类a
中的一个插槽,并从该插槽发出一个新信号,包括此
作为参数。您的类中是否有Q\u对象
宏?是的,我在myslot中有。您无法在connect
语句中传递参数。您只能在发出信号时执行此操作:emit mySignal(&a)
。是否要将局部变量a
作为参数传递给插槽?这无法工作,因为调用插槽时局部变量不再存在。您可以做的是将单击的信号连接到类a
中的插槽,并从此插槽发出新信号,包括此
作为参数。注意:在信号中传递对局部变量的引用是一件坏事。注意:在信号中传递对局部变量的引用是一件坏事。