2011-09-05 29 views
2

在我的程序中,我有一个带有文本框和qthread指针的小部件类。使用qthread指针我想通过文本选择连续更新文本框,而不会影响应用程序。但我不能访问文本框。尽管我通过将参数传递给qthread来访问文本框。我可以访问文本框,并做更新文本选择几次然后我的应用程序自动终止并指示错误如何使用qt线程访问小部件?

list_thread:../../src/XlibInt.c:596:_XPrivSyncFunction:声明`(dpy->标志&(1L < < 3))!= 0'失败。

+0

欢迎来到本网站,希望您阅读[常见问题](http://stackoverflow.com/faq)。 –

回答

3

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

例如,如果你创建线程后,只需拨打

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

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

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

也可以配置连接,使得直到冒落的接收机与处理信号(已经从槽函数返回),通过使用作为Qt::BlockingQueuedConnection连接类型结束后的线程等待(块)。但在你的情况下,这不应该是必要的。

欲了解更多信息,请看Qt的excelent documentation