在我的程序中,我有一个带有文本框和 qthread 指针的小部件类。使用 qthread 指针我想通过文本选择不断更新文本框而不影响应用程序。但我无法访问文本框。尽管我通过将参数传递给 qthread 来访问文本框。我可以访问文本框并更新文本选择几次然后我的应用程序自动终止并指示错误
list_thread: ../../src/XlibInt.c:596: _XPrivSyncFunction: Assertion `(dpy->flags & (1L << 3)) != 0' 失败。
在 Qt 中,您不能(或不应该)在主线程之外的另一个线程中调用任何 GUI 函数。您可以做的是在工作线程中发出信号并在主线程中接收它。
例如,如果您在创建线程后只需调用
connect(thread, SIGNAL(newText(QString)), lineEdit, SLOT(setText(QString)));
默认情况下,这将建立一个类型为 的连接Qt::AutoConnection
。每当您在接收者所在的同一线程中发出信号时,它就相当于一个简单的函数调用。但是,当您在另一个线程(如您的新线程)中发出该信号时,它会排队,然后在再次调度主线程并继续其事件循环时传递,因此槽函数将始终在线程中调用接收者生活。但是请确保您使用值参数(没有指针或引用)声明信号,因此您真正获得的是副本,QString
而不是线程字符串的指针/引用(可能已经被线程覆盖)。
...
signals:
void newText(QString);
...
您还可以配置连接,以便线程在发射后等待(阻塞),直到接收器完成处理信号(已从插槽函数返回),使用Qt::BlockingQueuedConnection
作为连接类型。但在你的情况下,这不应该是必要的。
有关更多信息,请查看 Qt 的优秀文档。