在我的程序中,我有一个带有文本框和qthread指针的widget类。使用qthread指针我想通过文本选择不断更新文本框而不影响应用程序。但我无法访问文本框。虽然我通过将参数传递给qthread来访问文本框。我可以访问文本框并更新文本选择几次,然后我的应用程序自动终止并显示错误
list_thread:../../ src / XlibInt.c:596:_XPrivSyncFunction:断言`(dpy-> flags&(1L<< 3))!= 0'失败。
答案 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。