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

我相信,你应该在你的运行实现中调用 exec 。Exec 启动事件循环,它应该允许发送信号。

看一眼:

int QThread::exec() [protected] 进入事件循环并等待直到 exit() 被调用,返回传递给 exit() 的值。如果通过 quit() 调用 exit(),则返回值为 0。需要调用此函数来启动事件处理。

我希望这有帮助。

于 2013-11-03T00:34:29.457 回答
0

解决了!事实证明,只有 GUI 元素可以与线程通信。线程可以从其他类型的线程继承,信号和槽都没有问题。问题在于对象 GfxMapItem。由于某种原因,它无法处理正常的通信。

于 2013-11-03T19:14:44.697 回答