gpt4 book ai didi

c++ - 调试未调用的 Qt 插槽

转载 作者:太空宇宙 更新时间:2023-11-04 13:55:39 27 4
gpt4 key购买 nike

我浪费了几个小时试图找出这个错误,但我仍然不知道为什么会发生...所以我求助于你!

我将一个对象移动到一个线程中,该线程执行一些工作,完成后会发出一个信号以供 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 正在运行吗?为了处理槽函数,相应的 EventLoop 必须通过 exec(...)(- 至少我认为它被称为 exec)函数运行。

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

编辑:我的猜测是您的线程(您创建的线程)没有执行事件循环。

关于c++ - 调试未调用的 Qt 插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21603926/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com