当前位置: 首页 > 面试题库 >

从后台工作线程修改Qt GUI

滑弘扬
2023-03-14
问题内容

我在Qt工作,当我按下GO按钮时,我需要不断将软件包发送到网络并使用收到的信息修改界面。

问题是我while(1)在按钮中有一个,所以按钮永不结束,所以界面永不更新。我想在按钮中创建一个线程并将while(){}代码放在那里。

我的问题是如何从线程修改接口?(例如,如何从线程修改textBox?


问题答案:

关于Qt的重要一点是, 必须 仅从GUI线程(即主线程)使用Qt GUI。

这就是为什么执行此操作的正确方法是从worker 通知 主线程,并且主线程中的代码实际上将更新文本框,进度栏或其他内容。

我认为,做到这一点的最佳方法是使用QThread而不是posix线程,并使用Qt 信号
在线程之间进行通信。这将是您的工作人员,是以下人员的替代者thread_func

class WorkerThread : public QThread {
    void run() {
        while(1) {
             // ... hard work
             // Now want to notify main thread:
             emit progressChanged("Some info");
        }
    }
    // Define signal:
    signals:
    void progressChanged(QString info);
};

在窗口小部件中,定义一个与.h中的信号具有相同原型的 插槽

class MyWidget : public QWidget {
    // Your gui code

    // Define slot:
    public slots:
    void onProgressChanged(QString info);
};

在.cpp中实现此功能:

void MyWidget::onProgressChanged(QString info) {
    // Processing code
    textBox->setText("Latest info: " + info);
}

现在在您要生成线程的位置(单击按钮):

void MyWidget::startWorkInAThread() {
    // Create an instance of your woker
    WorkerThread *workerThread = new WorkerThread;
    // Connect our signal and slot
    connect(workerThread, SIGNAL(progressChanged(QString)),
                          SLOT(onProgressChanged(QString)));
    // Setup callback for cleanup when it finishes
    connect(workerThread, SIGNAL(finished()),
            workerThread, SLOT(deleteLater()));
    // Run, Forest, run!
    workerThread->start(); // This invokes WorkerThread::run in a new thread
}

将信号和插槽连接后,emit progressChanged(...)在工作线程中发出带有插槽的插槽将向主线程发送消息,并且主线程将在onProgressChanged此处调用与该信号连接的插槽。

附言:我尚未html" target="_blank">测试代码,所以如果我在某处输入错误,请随时提出修改建议



 类似资料:
  • 问题内容: 我刚刚为iPhone和新的Xcode下载了iOS 13。我想测试适用于iOS 13的应用程序,但是当我尝试运行应用程序时,几秒钟后会出现错误。错误: 由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“从主线程访问布局引擎后,不得从后台线程对其进行修改。” ***第一掷调用堆栈:(0x191ea9c30 0x191bc40c8

  • 我需要在我的GWT应用程序中使用Kie Workbench中使用guided rules editor定义的规则。我相信一旦用户添加/修改并保存规则,它就会被保存到git存储库中。 我已经尝试了这样一种方法,我可以修改规则,然后构建和部署,它将作为一个工件部署到本地maven存储库,可以通过HTTP访问,并执行前面提到的规则,直接从存储库中加载Drools/Kie Workbench工件。但是这种

  • 通过此功能可以设置网站后台的访问路径 这里填写你需要设置的后台访问域名,例如:admin.domain.com 在该域名解析到您的网站服务器后,只能通过该域名登陆 配置保存在/caches/configs/system.php中,修改参数admin_url可手动取消绑定

  • 线索工作台 市场人员在营销通也可以查看所有市场渠道获取的线索列表,在这里可以查看线索的来源、来自于哪场市场活动,当前所在线索池,以及线索状态等; 选中线索或点击线索名称进入线索详情页面,可对线索进行管理;

  • 我在理解中线程安全的细节时遇到了问题。我知道Hibernate会话本身不是线程安全的,所以我不会从多个线程访问它们。但是,我找不到任何有关Hibernate实体的线程安全的信息。我可以在多个线程中修改它们,而它们仍然连接到用于加载它们的会话吗? 我不会使用延迟加载(我知道这会导致并发问题)。实体将被正确同步,Hibernate将通过同步的getters访问它们。 我设想的情景是: 使用Hibern

  • 问题内容: 使用swift在我的OS X中经常遇到此错误: “此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃。这将在以后的版本中引发异常。” 我有一个 NSWindow ,正在交换视图到窗口的视图。尝试在窗口上执行操作或在窗口上添加操作时,都会收到 错误消息 。试图禁用自动调整大小的东西,并且我没有使用自动布局的东西。有什么想法吗? 有时候很好,什么也没发生,其他时候却完