C++ QT5中的信号和插槽

C++ QT5中的信号和插槽,c++,multithreading,qt,user-interface,signals-slots,C++,Multithreading,Qt,User Interface,Signals Slots,我遇到了以下问题: 我有一个GUI元素类和一个线程类。我想在他们之间交换信号。然而,它只在一个方向上起作用。我可以成功地从主GUI窗口向线程发送信号。但是,当我想从线程向调用该线程的进程发送信号时,它不起作用。我是这样做的: bool GfxMapItem::mapSwitch(int seqidx) { ... importMapThread_ = new ImportMapThread(sequence_->item(seqidx)); connect(GUI_UI->

我遇到了以下问题:

我有一个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 
    ... 
} 
线程头如下所示:

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中。由于某种原因,它无法处理正常的通信

什么是
interruptablethread
,您应该从
QThread
继承
interruptablethread
是从
QThread
继承的。我看到ImportMapThread包含自定义插槽。请注意,这些插槽将在调用线程中运行,而不是在新线程中运行。来自:“记住QThread实例位于实例化它的旧线程中,而不是位于调用run()的新线程中,这一点很重要。这意味着所有QThread的排队插槽都将在旧线程中执行。因此,希望在新线程中调用插槽的开发人员必须使用工作对象方法;新插槽不应直接实现到子类QThread中。“我无法从您的代码片段中看出问题的确切原因,但是,由于您的代码在错误的线程中运行,因此可能有某些内容被损坏。如果希望线程之间进行双向通信,则需要使用辅助对象QObject(请参见示例)。实际上,线程中的这个自定义插槽工作,问题在于信号(不是在线程本身,而是在运行线程的进程中)或者更可能使用插槽
loadMap
,该插槽应该由线程的信号调用。在错误线程中运行的代码是什么意思?您需要一个事件循环来接收信号,但不需要一个事件循环来发送信号。
class GfxMapItem : public QObject, public QGraphicsPixmapItem
{
Q_OBJECT
...

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

private slots: 
void loadMap(int); 

protected:
...
};