qthread里能不能含有qwidget對象


我有一個QThread子類,在類中生成了QDialog對象,但運行程序時,報出“Widgets must be created in the GUI thread”,網上找了資料沒有解決。看了qwidget.cpp源碼,還是沒有解決。
#ifndef QT_NO_THREAD
    if (!parent) {
        Q_ASSERT_X(q->thread() == qApp->thread(), "QWidget",
                   "Widgets must be created in the GUI thread.");
    }
#endif

9 个解决方案

#1


所有對gui的操作只能在主線程中進行

#2


Manual 中說的其實很清楚了:

QObject is reentrant. Most of its non-GUI subclasses, such as QTimer, QTcpSocket, QUdpSocket, QFtp, and QProcess, are also reentrant, making it possible to use these classes from multiple threads simultaneously. ...

Although QObject is reentrant, the GUI classes, notably QWidget and all its subclasses, are not reentrant.  They can only be used from the main thread.

In practice, the impossibility of using GUI classes in other threads than the main thread can easily be worked around by putting time-consuming operations in a separate worker thread and displaying the results on screen in the main thread when the worker thread is finished. 

#3


to darkdong dbzhang800 現在我遇到一個問題 程序運行到某處,就會導致CPU占有率為100%,此時界面上無法操作,有沒有一種辦法來解決這種問題。

#4


不能,用信號槽的方式通知主線程操作界面對象。

#5


現在的問題是界面因為CPU過高而不能響應的用戶的操作 該怎么辦

#6


引用 5 樓 wxj120bw 的回復:
現在的問題是界面因為CPU過高而不能響應的用戶的操作 該怎么辦

沒代碼估計沒人能幫的上你。好好調試程序,找找原因。

題外:首先確保你的QThread的用法是對的。

#7


to dbzhang800 代碼貼出來比較多,因為無法確定出錯的地點。感謝你的意見。

#8


to all 另外一個地方,已經解決。地址如下
http://topic.csdn.net/u/20101019/19/a92117d6-b963-4c99-8c5d-fa135623df6b.html

#9


引用 8 樓 wxj120bw 的回復:
to all 另外一個地方,已經解決。地址如下
http://topic.csdn.net/u/20101019/19/a92117d6-b963-4c99-8c5d-fa135623df6b.html

恩,果然是栽在QThread的使用上。不過你的結論應該不對,如果次線程的事件循環會阻塞主線程的事件循環,那么Qt的設計也太差了(^_^)

因為只有描述沒有代碼,只能猜一下了:"使用事件循環時,你在 QThread 定義了slot",如果這樣
 * 你沒有使用 moveToThread,那么,槽函數其實都是在主線程中執行的(你的次線程並沒做工作)
 * 如果你在QThread中使用了 moveToThread,那么你的程序會工作,但會被“Qt開發人員”斥責

可以參考:
http://hi.baidu.com/cyclone/blog/item/5fac3bc7ab1b90d1d10060f2.html

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: