【问题标题】:Qt Slots and Signals SyntaxQt 插槽和信号语法
【发布时间】:2013-09-27 19:04:18
【问题描述】:

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

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

请帮我回答以下问题:

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

  2. Qt 连接函数是否需要指向对象引用 (&mySig) 而不是直接指向对象的指针?

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

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

  5. 我看到很多对连接语句格式的引用

    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();
}

【问题讨论】:

标签: c++ qt syntax signals slot


【解决方案1】:

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) 的指针,而不是直接指向对象?

是的,see the docs

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

使用“旧”语法,是的。使用新语法,否(见上文:未指定参数)。 But you can find yourself in trouble if your signal or slot have overloads.

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

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

5。我看到许多对使用的连接语句格式的引用

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

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

是的,当然。我们确实希望编译旧代码!

【讨论】:

    猜你喜欢
    • 2012-10-15
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多