0

スレッドが開始されたときにスレッドオブジェクトでスロットを呼び出そうとしましたが、このエラーが発生しました:

Object::connect: No such slot Worker::doWork(pFoo)

スレッド実行コード:

// main class   

            m_WorkerThread = new QThread();

             FooStack* pfooStack = InternalStorageManager::getInstance()->getStack();
             m_Worker = new Worker();
             bool done = connect(m_WorkerThread,
                                    SIGNAL(started()),
                                    m_Worker,
                                    SLOT(doWork(pfooStack))); 

             m_Worker->moveToThread(m_WorkerThread);          
             m_WorkerThread->start();



// class Worker
 // cpp imple            
void Worker::doWork(FooStack *& rp_urlsStack)
{

}
// header 
class Worker : public QObject
{

    Q_OBJECT

    public :

        Worker();
        ~Worker();
    public slots:
        void doWork(FooStack *&);

};
4

4 に答える 4

3
Object::connect: No such slot Worker::doWork(pFoo)

接続宣言でオブジェクトを渡すことはできません。

コンストラクタpfooStackに渡せませんか?Worker

編集:

class Main : ...
{
    ...
    void startThread();  // The method in your example.
private slots:
     void startWork();
    ...
};

void Main::startThread()
{
     m_WorkerThread = new QThread();
     m_Worker = new Worker();
     bool done = connect(m_WorkerThread, SIGNAL(started()),
                         this, SLOT(startWork())); 

     m_Worker->moveToThread(m_WorkerThread);          
     m_WorkerThread->start();
}

void Main::startWork()
{
     m_Worker->doWork(InternalStorageManager::getInstance()->getStack());
}
于 2012-10-26T07:33:08.577 に答える
1

そのようにすることはできません。現在の変数を接続のスロットメソッドパラメーターとして渡すことはできません。また、スロットはシグナルよりも多くのパラメーターを持つことはできません。他の答えに加えて、QSignalMapperを使用してこれを達成できますが、スロットへの接続が1つしかない場合は、やり過ぎのようです。

Qt5とC++11を使用できる場合は、スロットだけでなくラムダ関数にシグナルを接続できますが、クロージャの作成をサポートしているかどうかは完全にはわかりません(つまり、ラムダ関数でローカル変数を使用します。ここで必要になります)。

于 2012-10-26T07:56:08.730 に答える
1

私は自分のコンピューターでコードをコンパイルしていませんが、必要なものを暗示しているはずです:

     m_WorkerThread = new QThread();

             FooStack* pfooStack = InternalStorageManager::getInstance()->getStack();
             m_Worker = new Worker(pfooStack);
             bool done = connect(m_WorkerThread,
                                    SIGNAL(started()),
                                    m_Worker,
                                    SLOT(doWork())); 

             m_Worker->moveToThread(m_WorkerThread);          
             m_WorkerThread->start();




void Worker::doWork()
{
      //use stack here
}

class Worker : public QObject
{

    Q_OBJECT

    public :

        Worker(FooStack *& rp_urlsStack):stack(rp_urlsStack);
        ~Worker();
    public slots:
        void doWork();
    private:
        FooStack*& stack;

};
于 2012-10-26T07:38:36.603 に答える
0

シグナルとスロットの署名を変更する必要があると思います。QT ドキュメントから:

引数にデフォルト値がある場合、SIGNAL() および SLOT() マクロに引数を含めるかどうかに関する規則は、SIGNAL() マクロに渡される署名が、SLOT に渡される署名よりも少ない引数を持ってはならないということです。 () 大きい。

于 2012-10-26T07:34:44.150 に答える