C++ 从线程发出更新UI的信号

C++ 从线程发出更新UI的信号,c++,qt,C++,Qt,我在继承自QThread的类中定义了一个新插槽: class MyThread : public QThread { Q_OBJECT public: MyThread(QString fileName); void run() override; signals: void addNewItem(int row, int col, QString text); private: QString fileName; }; 在Dialog类中,我定义

我在继承自QThread的类中定义了一个新插槽:

class MyThread : public QThread
{
    Q_OBJECT

public:
    MyThread(QString fileName);
    void run() override;

signals:
    void addNewItem(int row, int col, QString text);

private:
    QString fileName;
};
在Dialog类中,我定义了当发出上述信号时应该调用的插槽。此插槽更新UI上的小部件:

void Dialog::onAddNewItem(int row, int col, QString text)
{
    ui->tableWidget->setItem(row, col, new QTableWidgetItem(text));
}
在Dialog类的构造函数中,我创建了工作线程并将信号连接到插槽:

worker = new MyThread(filePath);
worker->run();

connect(worker, &MyThread::addNewItem, this, &Dialog::onAddNewItem);

run()
函数中,我发出addNewItem信号,但从未调用onAddNewItem插槽。为什么会这样?

线程运行后,您已经连接了信号和插槽

  • worker->run()
    替换为
    worker->start()
    。一旦线程成功启动,
    start
    成员立即调用
    run
  • 按如下方式连接信号和插槽:

  • 扑通一声。。。。。更改
    worker->run()
    工作者->开始()通过调用
    worker->run()查看答案中的示例您在与GUI线程相同的线程中执行。和
    connect(worker,&MyThread::addNewItem,this,&Dialog::onAddNewItem)在run()完成后发生,因此不要期望收到您的信号。
    
    worker = new MyThread(filePath);
    connect(worker, &MyThread::addNewItem, this, &Dialog::onAddNewItem);
    worker->start();