【问题标题】:Emit signal to update UI from thread发出信号以从线程更新 UI
【发布时间】:2020-05-30 15:11:08
【问题描述】:

我在继承自 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();
  • 通过调用worker->run();,您将在与 GUI 线程相同的线程中执行。 connect(worker, &MyThread::addNewItem, this, &Dialog::onAddNewItem); 发生在 run() 完成之后,所以不要指望得到你的信号。

标签: c++ qt


【解决方案1】:

线程运行后你已经连接了信号和槽。

  1. worker->run() 替换为worker->start()。一旦线程成功启动,start 成员立即调用run
  2. 按如下方式连接信号和插槽:
worker = new MyThread(filePath);
connect(worker, &MyThread::addNewItem, this, &Dialog::onAddNewItem);
worker->start();

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 2014-09-18
    • 1970-01-01
    • 2012-11-22
    • 2018-04-11
    • 2015-09-27
    • 1970-01-01
    • 2015-08-20
    • 2015-01-03
    相关资源
    最近更新 更多