2

次の問題が発生しました。

GUI要素クラスとThreadクラスがあります。それらの間で信号を交換したいと思います。ただし、一方向にしか機能しません。メイン GUI ウィンドウからスレッドにシグナルを正常に送信できます。ただし、スレッドからスレッドを呼び出すプロセスにシグナルを送信したいのですが、機能しません。これが私がそれを行う方法です:

bool GfxMapItem::mapSwitch(int seqidx)
{
    ...
importMapThread_ = new ImportMapThread(sequence_->item(seqidx)); 
connect(GUI_UI->analExportButton,  SIGNAL(clicked()), importMapThread_, SLOT(interrupt1()), Qt::QueuedConnection); //<-- this one works perfectly 
connect(importMapThread_,  SIGNAL(progress(int)), this, SLOT(loadMap(int)), , Qt::QueuedConnection); // <-- this one unfortunatelly doesn't 
    ... 
} 

スレッド コードは非常に単純で、シグナルを発するだけです (スレッドをそれ自体に接続したときに機能することを確認しました)。

void ImportMapThread::run()
{
QLOGX("Running ImportMapThread..."); 
QLOGINC; 
emit this->progress(100); 

QLOGX("Stopping ImportMapThread..."); 
} 

スレッド ヘッダーは次のようになります。

class ImportMapThread : public InterruptibleThread
{
Q_OBJECT

private: 
...

protected:
...

public:
ImportMapThread(SeqItem *p); 

signals: 
void progress(int value); 
void progressReset(int value); 

public slots: 
     virtual void interrupt1(); 
 void loadMap();  

protected: 
virtual void run(); 
}; 

そのスレッドを呼び出すクラスは次のようになります。

class GfxMapItem : public QObject, public QGraphicsPixmapItem
{
Q_OBJECT
...

signals:
void mouseOutside();
void mouseMove(const QPointF &pos);

private slots: 
void loadMap(int); 

protected:
...
}; 

何か案は?お願いします、アイデアが尽きてしまいました。

4

2 に答える 2

0

解決しました!スレッドと通信できるのは GUI 要素のみであることが判明しました。スレッドは他のタイプのスレッドから継承でき、シグナルもスロットも問題ありません。問題はオブジェクト GfxMapItem にありました。何らかの理由で、通常の通信を処理できませんでした。

于 2013-11-03T19:14:44.697 に答える
0

実行実装で exec を呼び出す必要があると思います。Exec は、シグナルの送信を許可するイベント ループを開始します。

を見てみましょう:

int QThread::exec() [保護] イベント ループに入り、exit() が呼び出されるまで待機し、exit() に渡された値を返します。exit() が quit() 経由で呼び出された場合、返される値は 0 です。イベント処理を開始するには、この関数を呼び出す必要があります。

これが役立つことを願っています。

于 2013-11-03T00:34:29.457 に答える