如何使用qt线程访问小部件?

时间:2011-09-05 13:04:35

标签: qt4 qthread qtextedit

在我的程序中,我有一个带有文本框和qthread指针的widget类。使用qthread指针我想通过文本选择不断更新文本框而不影响应用程序。但我无法访问文本框。虽然我通过将参数传递给qthread来访问文本框。我可以访问文本框并更新文本选择几次,然后我的应用程序自动终止并显示错误

list_thread:../../ src / XlibInt.c:596:_XPrivSyncFunction:断言`(dpy-> flags&(1L<< 3))!= 0'失败。

1 个答案:

答案 0 :(得分:3)

在Qt中,你不能(或不应该)在主线程之外的另一个线程中调用任何GUI函数。你可以做的是在工作线程中发出一个信号并在主线程中接收它。

例如,如果您在创建线程后只需调用

connect(thread, SIGNAL(newText(QString)), lineEdit, SLOT(setText(QString)));

默认情况下,这将建立Qt::AutoConnection类型的连接。无论何时在接收器所在的同一线程中发出信号,它都相当于一个简单的函数调用。但是当你在另一个线程(就像你的新线程)中发出那个信号时,它会排队,然后在主线程被再次调度时继续传递并继续其事件循环,因此槽函数将始终在线程中调用接收者生活。但请确保使用值参数(无指针或引用)声明信号,因此您确实获得了QString的副本,而不是指向线程字符串的指针/引用(可能已被覆盖了线程)。

...
signals:
    void newText(QString);
...

您还可以配置连接,以便线程在发出之后等待(块),直到接收器完成处理信号(从插槽函数返回),使用Qt::BlockingQueuedConnection作为连接类型。但在你的情况下,这不应该是必要的。

有关更多信息,请查看Qt的excelent documentation