C++ 从线程发出更新UI的信号
我在继承自QThread的类中定义了一个新插槽: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类中,我定义
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();