我遇到以下问题: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:
...
};
任何想法?请,我已经没有想法了。
什么是InterruptibleThread,你应该从'QThread'继承' – Ramez
'InterruptibleThread'继承自'QThread'。 –
我看到ImportMapThread包含自定义插槽。请注意,这些插槽将在CALLING线程中运行,而不是新线程。从[QThread文档](http://doc-snapshot.qt-project.org/qt5-stable/qthread.html):_“请务必记住,QThread实例位于实例化它的旧线程中,而不是在调用run()的新线程中,这意味着所有QThread的排队插槽将在旧线程中执行,因此,希望在新线程中调用插槽的开发人员必须使用worker-object方法;新插槽应该不能直接实现到子类QThread中。“_ – JKSH