调试QT插槽未调用

Debug Qt slots not called

本文关键字:调用 插槽 QT 调试      更新时间:2023-10-16

我浪费了几个小时来识别此错误,但是我仍然不知道为什么会发生...所以我求助于您!

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

您确定,应执行插槽函数的线程的事件环正在运行吗?为了处理插槽函数,相应的EventLoop必须通过Exec(...)运行( - 至少我认为它称为Exec)函数。

更多的澄清:每个Q_Object属于线程。这可以通过movetothread()函数更改。相应的线程的事件循环必须运行才能处理插槽函数。

编辑:我的猜测是您的线程(您创建的内容)没有Eventloop执行。

您确定mainwin的标头文件已添加到.pro文件的标题吗?

HEADERS += "Header file of mainwin declaration"