繁体   English   中英

Qt插槽和信号语法

[英]Qt Slots and Signals Syntax

我搜索了许多帮助讨论并阅读了多个教程,但是我仍然不了解Qt信号和插槽的正确语法,使用Qt Core 5.0我创建了一个非常简单的程序,其中包含两个对象以尝试理解此语法。 (如下所示)。 每次编译此代码时,都会出现以下错误:

预期在“ int”之前的主要表达式

请为我提供以下答案:

  1. 我编写的代码有什么问题?

  2. Qt connect函数是否期望对象引用(&mySig)的指针而不是对象的指针?

  3. 当我在连接功能中使用包含参数的插槽和信号时,是否需要为这些参数提供变量,或者仅声明数据类型,如下面的代码所示?

  4. 最终,我想使用插槽和信号在我正在编写的程序中的对象之间传递数据。 插槽和信号是否允许我传递从QObject派生的其他对象? 还是我需要做些额外的事情?

  5. 我看到许多对使用的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();
}

1.我编写的代码有什么问题?

这行:

QObject::connect(&mySig, testSig::sig_1(int), &mySlot, testSlot::slot1(int));

这是非法的C ++。 如果要使用新的信号/插槽语法,则需要使用信号和插槽功能的指针:

QObject::connect(&mySig, &testSig::sig_1, &mySlot, &testSlot::slot1);

2. Qt connect函数是否期望对象引用(&mySig)的指针而不是对象的指针?

是的, 请参阅文档

3.当我在连接功能中使用包含参数的插槽和信号时,是否需要为这些参数提供变量,或者仅声明数据类型,如下面的代码所示?

使用“旧”语法,是的。 使用新语法时,请使用no(请参见上文:未指定任何参数)。 但是,如果您的信号或插槽过载,您可能会遇到麻烦

4.最终,我想使用插槽和信号在我正在编写的程序中的对象之间传递数据。 插槽和信号是否允许我传递从QObject派生的其他对象? 还是我需要做些额外的事情?

当然,您可以传递任何数据类型。 如果您使用排队连接,则存在限制,但我们将其保留为高级主题。

5.我看到了很多关于connect语句格式的引用,该语句使用

 QObject::contect(&mySig, SIGNAL(sig_1(int)), &mySlot, SLOT(slot1(int))); 

这种格式在Qt 5.0 Core下仍然有效吗?

是的,一点没错。 我们确实希望编译旧代码!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM