我浪费了几个小时试图识别这个错误,但我仍然不知道为什么会发生这种情况......所以我诉诸于你!
我有一个对象移动到一个做一些工作的线程,当完成发出一个信号被QMainWindow
捕获。就这么简单,我窗口中的插槽不会运行。但是,如果我将相同的信号连接到qApp
,则可以工作:
connect(objInThread_, SIGNAL(mySignal()), this, SLOT(about())); // Nothing happens
connect(objInThread_, SIGNAL(mySignal()), qApp, SLOT(aboutQt())); // Joy!
请注意,我实际上从其他基于QThread
的对象中复制并粘贴了此线程对象的代码,因为我有很多这样的对象,并且每个插槽都被调用...除了这个一个。
我可以做些什么来调试它?
这是重要插槽的声明:
class mainwin : public QMainWindow
{
Q_OBJECT
public:
mainwin(QWidget *parent = 0, Qt::WindowFlags flags = 0);
void setupThread()
{
// Thread
objThread_ = new QThread(this);
objThread_->start();
// Object in thread
objInThread_ = new myObject();
objInThread_->moveToThread(objThread_);
// Connect
connect(objInThread_, SIGNAL(mySignal()), this, SLOT(about()));
}
// ...
public slots:
void loadSettings();
void about();
// ...
}
about
广告位如下:
void mainwin::about()
{
qWarning("ABOUT");
}
线程对象功能如下:
void myObject::fire()
{
qWarning("this is threaded");
emit mySignal();
}
答案 0 :(得分:0)
你确定,应该执行插槽功能的线程的EventLoop正在运行吗?为了处理槽函数,相应的EventLoop必须通过exec(...)运行( - 至少我认为它被称为exec)函数。
更多说明:每个Q_OBJECT都属于一个线程。这可以通过moveToThread()函数来改变。必须运行相应线程的事件循环才能处理槽函数。
编辑:我的猜测是你的线程(你创建的)没有执行eventloop。
答案 1 :(得分:0)
您确定将mainwin的头文件添加到.pro文件的HEADERS中吗?
HEADERS += "Header file of mainwin declaration"