1

この方法で信号に接続しようとしています:

QObject::connect(myObj, SIGNAL(mySignal(std::list<MyClass*> myList)), this, SLOT(mySlot(std::list<MyClass*> myList)));

スロットは呼び出されません。それは間違っていますか?ペアstd::listで使えますか?signal/slot

編集:パラメータなしの同じペアが機能します

class TestThread : public QThread
{
    Q_OBJECT

public:
    .....
    protected:
     virtual void run();

private:
    std::list<MyClass*> myList;

signals:
    void mySignal(std::list<MyClass*>&);



};
Q_DECLARE_METATYPE (std::list<MyClass*>)

編集:

void mySlot(const std::list<MyClass*> &);

void 
MyManager::mySlot(const std::list<MyClass*> &theList)
{
    std::cout << "mySlot " << std::endl;
}

void mySignal(const std::list<MyClass*> &theList);

TestThread ::TestThread (std::list<MyClass*>&theList, QObject *parent)
    :  QThread(parent),  myList(theList)
{


}



void
TestThread ::run() 
{
   ...
   emit mySignal(myList);
}

最終的には:

QObject::connect(threadObj, SIGNAL(mySignal(std::list<MyClass*>)), this, SLOT(mySlot(std::list<MyClass*>)));
4

3 に答える 3

5

シグナル発信オブジェクトと受信オブジェクトが異なるスレッドにある場合、メタタイプを発信で使用する前にqRegisterMetaTypeに登録する必要があります。あなたの場合:

qRegisterMetaType<std::list< MyClass* > >("std::list<MyClass*>");

アプリの最初のどこかでそれを行う必要があります。

于 2012-07-30T14:02:05.303 に答える
3

変数の実際の名前ではなく、タイプのみが必要です。

QObject::connect(myObj, SIGNAL(mySignal(std::list<MyClass*>)), this, SLOT(mySlot(std::list<MyClass*>)));

を送信しようとしていた場合intは、

SIGNAL(mySignal(int))

いいえ

SIGNAL(mySignal(int x))

編集: @Chris が指摘するように、 と を一致させなくても違いはconstあり&ません。

以下のコードは、シグナルを正しく発信し、他のスレッドで受信します。を使用しない場合は、使用qRegisterMetaTypeするように指示するランタイム警告メッセージが表示されます。

class A
{
public:
    A(): i(1) {}
    int i;
};

class T : public QThread
{
    Q_OBJECT
public:
    void run()
    {
       emit mySignal(myList);
    }

    std::list<A*> myList;

signals:
    void mySignal(const std::list<A*>&);
};

Q_DECLARE_METATYPE (std::list<A*>)
class Test: public QDialog
{   
    Q_OBJECT//this macro flags the class for the moc tool

public:
    Test()
    {
       qRegisterMetaType<std::list< A* > >("std::list<A*>");

       t = new T;
       connect(t, SIGNAL(mySignal(std::list<A*>)), this, SLOT(mySlot(std::list<A*>)));
       printf("after connect\n");

       t->start();
    }

public slots:
    void mySlot(const std::list<A*>& list){printf("mySlot");}

protected:
    T* t;
};
于 2012-07-30T13:22:06.260 に答える
0

から派生し、クラス ヘッダーにマクロをQObject追加し、Q_OBJECT関連するシグナルとスロットに正しいアクセス修飾子 (つまりpublic slots) があることを確認した場合は、以下を追加する必要があることを意味する場合があります。

#include <QMetaType>
Q_DECLARE_METATYPE( std::list<MyClass*> );
于 2012-07-30T13:47:53.500 に答える