Nic*_*zak 2 c++ syntax qt signals slot
我已经搜索了大量的帮助讨论并阅读了多个教程,但我仍然不理解Qt信号和插槽的正确语法,使用Qt Core 5.0我创建了一个非常简单的程序,有两个对象来尝试理解这个语法.(如下所示).每次编译此代码时,都会收到以下错误:
'int'之前的预期primary-expression
请帮我解答以下问题:
我写的代码有什么问题?
Qt connect函数是否需要指向对象引用(&mySig)而不是直接指向对象?
当我使用包含参数的插槽和信号时,在连接功能中,我是否需要为这些参数提供变量,或者只是说明数据类型,如下面的代码所示?
最后,我想使用插槽和信号在我正在编写的程序中的对象之间传递数据.插槽和信号是否允许我传递从QObject派生的其他对象?或者我需要做一些额外的事情吗?
我看到许多对使用的connect语句格式的引用
QObject :: contect(&mySig,SIGNAL(sig_1(int)),&mySlot,SLOT(slot1(int)));
这种格式在Qt 5.0 Core下仍然有效吗?
非常感谢所有的帮助!简单程序代码如下.
#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();
}
Run Code Online (Sandbox Code Playgroud)
1.我写的代码有什么问题?
这一行:
QObject::connect(&mySig, testSig::sig_1(int), &mySlot, testSlot::slot1(int));
Run Code Online (Sandbox Code Playgroud)
这是非法的C++.如果要使用新的信号/插槽语法,则需要获取信号和插槽功能的指针:
QObject::connect(&mySig, &testSig::sig_1, &mySlot, &testSlot::slot1);
Run Code Online (Sandbox Code Playgroud)
2. Qt connect函数是否需要指向对象引用(&mySig)而不是对象的指针?
是的,请参阅文档.
3.当我使用包含参数的插槽和信号时,在连接功能中,我是否需要为这些参数提供变量,或者只是说明数据类型,如下面的代码所示?
使用"旧"语法,是的.使用新语法,no(参见上文:未指定参数).但是如果您的信号或插槽有过载,您可能会遇到麻烦.
最后,我想使用插槽和信号在我正在编写的程序中的对象之间传递数据.插槽和信号是否允许我传递从QObject派生的其他对象?或者我需要做一些额外的事情吗?
当然,您可以传递任何数据类型.如果使用排队连接,则适用限制,但我们将其保留为高级主题.
我看到许多引用了一个使用的connect语句的格式
Run Code Online (Sandbox Code Playgroud)QObject::contect(&mySig, SIGNAL(sig_1(int)), &mySlot, SLOT(slot1(int)));这种格式在Qt 5.0 Core下仍然有效吗?
是的,一点没错.我们确实希望编译旧代码!