簡體   English   中英

如何在非主線程中創建GUI小部件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM