2

多数のヘルプ ディスカッションを検索し、複数のチュートリアルを読みましたが、Qt シグナルとスロットの正しい構文をまだ理解していません。Qt Core 5.0 を使用して、この構文を理解しようとする 2 つのオブジェクトを持つ非常に単純なプログラムを作成しました。(下に示された)。このコードをコンパイルするたびに、次のエラーが発生します。

「int」の前に一次式が必要です

次の答えを教えてください。

  1. 私が書いたコードの問題は何ですか?

  2. Qt connect 関数は、オブジェクトを直接参照するのではなく、オブジェクト参照 (&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();
}
4

1 に答える 1

5

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 でも有効ですか?

そのとおり。古いコードをコンパイルしたい!

于 2013-09-23T07:48:43.680 に答える