对qt中的signal和slots使用另一个类对象
using another class object for signal and slots inside qt
考虑以下场景:
我已经在我的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继承的另一个类中,该类接受三个参数。
目前我只是在测试我是否能够正确调用该函数,但我不能。
感谢
这将不起作用。在SIGNAL或SLOT中,必须是类型,而不是对象或其引用。我是说这个
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所说,使用a
和ms
作为局部变量并不是一件好事。
错误在您的:中
QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));
必须是:
QObject::connect(button, SIGNAL(clicked(A)), &ms, SLOT(clickButton(A)));
在SIGNAL中发送的类型必须在接收该类型的SLOT中。
相关文章:
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 如何使用函数将一个对象的输入复制到另一个对象中
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 打印对象的映射,其中另一个对象作为键
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 复制赋值函数如何访问另一个对象的私有成员(Stroustroup 原则和实践书)?
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?
- C++将带有重载构造函数的对象添加到另一个对象
- 如何将指针从unique_ptr传递到另一个对象并管理寿命
- 如何将"this"的生命周期移动到C++中的另一个对象中?
- 2 个 COM 对象,并在另一个对象中使用其中一个对象的接口
- 将列表的对象C++移动到另一个对象