簡體   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