Вы не должны изменять (понимать и создавать) графический интерфейс из другого потока, идея состоит в том, чтобы посылать информацию о вторичном потоке через сигналы, чтобы мы могли сделать 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)
Если вы делаете обертывание очень просто, вы можете уйти с помощью P / Invoke . Если вам действительно нужны управляемые объекты, ваше простейшее решение - написать оболочку на C ++ / CLI (ранее Managed C ++), поскольку это обеспечивает полный набор функций для управляемого / неуправляемого взаимодействия.
вот как я это делаю Взаимодействие . В нем показано, как выполнять простые случаи (от BOOL до bool), а также немного более сложные случаи (передача структуры с указателями в управляемую память). Удачи.