Qt 插槽和信号语法
Qt Slots and Signals Syntax
我已经搜索了许多帮助讨论并阅读了多个教程,但我仍然不明白Qt信号和插槽的正确语法,使用Qt Core 5.0我创建了一个非常简单的程序,其中包含两个对象来尝试理解此语法。(如下所示)。 每次编译此代码时,都会收到以下错误:
"int"之前的预期主要表达式
请帮助我回答以下答案:
-
我写的代码有什么问题?
-
Qt connect 函数是否需要对象引用 (&mySig) 的指针,而不是直接指向对象?
-
当我在连接函数中使用包含参数的插槽和信号时,我是否需要为这些参数提供变量,或者仅声明数据类型,如下面的代码所示?
-
最终,我想使用插槽和信号在我正在编写的程序中的对象之间传递数据。 插槽和信号是否允许我传递从 QObject 派生的其他对象? 还是我需要做一些额外的事情?
-
我看到许多对连接语句格式的引用,该格式使用
QObject::contect(&mySig, SIGNAL(sig_1(int)), &mySlot, SLOT(slot1(int)));
这种格式在Qt 5.0核心下仍然有效吗?
非常感谢所有的帮助! 简单程序的代码如下。
#include <QCoreApplication>
#include <QObject>
#include <iostream>
using namespace std;
//================================================================================
class testSig : public QObject
{
Q_OBJECT
public:
explicit testSig(QObject *parent = 0) :
QObject(parent)
{
}
void getNum()
{
int t;
cout << endl << endl << "Please Enter Number: ";
cin >> t;
emit sig_1(t);
}
signals:
void sig_1(int i );
};
//================================================================================
class testSlot : public QObject
{
Q_OBJECT
public:
explicit testSlot(QObject *parent = 0) :
QObject(parent)
{
}
public slots:
void slot1(int i)
{
cout << "New Value is: " << i << endl;
}
};
//=================================================================================
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
testSig mySig;
testSlot mySlot;
QObject::connect(&mySig, testSig::sig_1(int), &mySlot, testSlot::slot1(int));
for( ; ; )
{
mySig.getNum();
}
return a.exec();
}
1. 我写的代码有什么问题?
这一行:
QObject::connect(&mySig, testSig::sig_1(int), &mySlot, testSlot::slot1(int));
这是非法C++。如果要使用新的信号/插槽语法,则需要获取信号和插槽函数的指针:
QObject::connect(&mySig, &testSig::sig_1, &mySlot, &testSlot::slot1);
2. Qt 连接函数是否需要对象引用 (&mySig) 的指针,而不是直接指向对象?
是的,请参阅文档。
3. 当我在连接函数中使用包含参数的插槽和信号时,我是否需要为这些参数提供变量,或者仅声明数据类型,如下面的代码所示?
使用"旧"语法,是的。使用新语法时,no (见上文:未指定参数)。但是,如果您的信号或插槽过载,您可能会发现自己遇到麻烦。
4. 最终,我想使用插槽和信号在我正在编写的程序中的对象之间传递数据。插槽和信号是否允许我传递从 QObject 派生的其他对象?还是我需要做一些额外的事情?
当然,您可以传递任何数据类型。如果使用排队连接,则存在限制,但让我们将其保留为高级主题。
5. 我看到许多对连接语句格式的引用,该格式使用
QObject::contect(&mySig, SIGNAL(sig_1(int)), &mySlot, SLOT(slot1(int)));
这种格式在Qt 5.0核心下仍然有效吗?
是的,绝对。我们确实需要编译旧代码!
- 1d 智能指针不适用于语法 (*)++
- Qt VTK交互风格的信号到小部件
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 如何使用新语法QT5将信号连接到信号?
- QObject::连接不起作用 - 使用函数语法找不到信号
- Qt的新信号/时隙语法问题 - 连接到一个简单的函数
- 禁用 Qt5 代码中的旧(Qt4 样式)信号槽语法
- QT和新的信号槽语法,QApplication::退出主功能外的插槽
- 使用具有新信号槽语法的Qt插件系统在接口类中声明信号
- 在Qt信号和插槽中使用lambda语法并访问传递的参数
- 信号槽的语法糖
- 如何在Qt 5中声明新信号槽语法作为函数参数
- 如何使用新的QObject::连接语法与函数指针将QSslSocket::错误信号连接到插槽
- Qt 插槽和信号语法
- 新的Qt信号语法错误与重载没有这个
- Qt5 信号/时隙语法,带过载信号和 lambda
- QSerialPort 新信号槽语法 没有匹配的成员函数,用于调用"连接"