[英]How to create GUI widget in a non-main thread
我有一個簡單的服務器-客戶端聊天程序,其中使用線程在后台從服務器接收數據。 問題是當客戶端收到消息時,必須為聊天創建一個新標簽。 但是我在線程中接收數據,因此可以檢查數據並在線程中創建數據。 因為我的窗口在主線程中,所以我無法創建窗口小部件並設置其父窗口。 所以看起來像這樣:
class MainWindow(QWidget):
...
def addChatTab(self, nick, target, parent):
tab = ChatTab(target)
tab.setParent(parent) #where I get the eror
self.chatTabWidget.addTab(tab, nick)
self.chatTabs[nick] = tab
class ServerManagement():
...
def clientLoop(self): #runs in a different thread
...
if sender == settingsManager.getUserNick():
targetTab = receiver
else:
targetTab = sender
if targetTab in mainWindow.chatTabs.keys(): #if tab is already there
mainWindow.getChatTab(targetTab).write(message)
else:
mainWindow.addChatTab(targetTab, sender, mainWindow) #create and add it to QTabWidget
mainWindow.getChatTab(targetTab).write(message)
錯誤:
QObject::setParent: Cannot set parent, new parent is in a different thread
我了解這種情況的發生方式和原因,但我沒有解決方案。 有人能幫我嗎?
提前致謝...
您不應該從另一個線程修改(理解也可以創建)GUI,其想法是通過信號發送輔助線程的信息,因為它可以使ServerManagement從QObject繼承,以便它可以創建信號,並且可以在ServerManagement和MainWindow的對象以建立連接:
class MainWindow(QWidget):
# ...
def addChatTab(self, nick, target, parent):
tab = ChatTab(target)
tab.setParent(parent) #where I get the eror
self.chatTabWidget.addTab(tab, nick)
self.chatTabs[nick] = tab
def foo_function(self, another_args)
# ... foo function is the method where you create the Server Management object
self.management = ServerManagement()
self.management.targetChanged.connect(self.update_gui)
#
@pyqtSlot(str)
def update_gui(self, targetTab):
if targetTab in self.chatTabs.keys(): #if tab is already there
self.getChatTab(targetTab).write(message)
else:
self.addChatTab(targetTab, sender, self) #create and add it to QTabWidget
self.getChatTab(targetTab).write(message)
class ServerManagement(QObject):
targetChanged = pyqtSignal(str)
def __init__(self, others_arguments):
super(ServerManagement, self).__init__()
# ...
def clientLoop(self): #runs in a different thread
# ...
if sender == settingsManager.getUserNick():
targetTab = receiver
else:
targetTab = sender
self.targetChanged.emit(targetTab)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.