没有调用调试Qt插槽

时间:2014-02-06 13:08:52

标签: c++ multithreading qt

我浪费了几个小时试图识别这个错误,但我仍然不知道为什么会发生这种情况......所以我诉诸于你!

我有一个对象移动到一个做一些工作的线程,当完成发出一个信号被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();
}

2 个答案:

答案 0 :(得分:0)

你确定,应该执行插槽功能的线程的EventLoop正在运行吗?为了处理槽函数,相应的EventLoop必须通过exec(...)运行( - 至少我认为它被称为exec)函数。

更多说明:每个Q_OBJECT都属于一个线程。这可以通过moveToThread()函数来改变。必须运行相应线程的事件循环才能处理槽函数。

编辑:我的猜测是你的线程(你创建的)没有执行eventloop。

答案 1 :(得分:0)

您确定将mainwin的头文件添加到.pro文件的HEADERS中吗?

HEADERS += "Header file of mainwin declaration"