2013-11-02 45 views
2

我遇到以下问题:QT5中的信号和时隙

我有一个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: 
... 
}; 

任何想法?请,我已经没有想法了。

+0

什么是InterruptibleThread,你应该从'QThread'继承' – Ramez

+0

'InterruptibleThread'继承自'QThread'。 –

+1

我看到ImportMapThread包含自定义插槽。请注意,这些插槽将在CALLING线程中运行,而不是新线程。从[QThread文档](http://doc-snapshot.qt-project.org/qt5-stable/qthread.html):_“请务必记住,QThread实例位于实例化它的旧线程中,而不是在调用run()的新线程中,这意味着所有QThread的排队插槽将在旧线程中执行,因此,希望在新线程中调用插槽的开发人员必须使用worker-object方法;新插槽应该不能直接实现到子类QThread中。“_ – JKSH

回答

0

解决!事实证明,只有GUI元素可以与线程进行通信。该线程可以从其他类型的线程继承,并且信号和插槽都不存在任何问题。问题出现在对象GfxMapItem中。由于某种原因,它无法处理正常的通信。

0

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

看看:

INT的QThread :: EXEC()[保护]进入事件循环,等待,直到 退出()被调用,返回传递给退出值()。如果通过quit()调用exit(),则返回的 值为0。有必要调用这个函数来启动事件处理。

我希望这会有所帮助。

+1

您需要接收信号的事件循环,但您不需要发送信号。 – JKSH