QT5 中的信号和插槽

SIGNALS and SLOTS in QT5

本文关键字:插槽 信号 QT5      更新时间:2023-10-16

我遇到了以下问题:

我有一个 GUI 元素类和一个线程类。我想在他们之间交换信号。但是,它只能在一个方向上工作。我可以成功地将信号从主 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:
...
}; 

有什么想法吗?拜托,我已经没有想法了。

我相信

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

看看:

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

我希望这有所帮助。

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