#python #pyqt #signals
#python #pyqt #сигналы
Вопрос:
У меня есть графический интерфейс, и я хочу установить некоторую связь между двумя классами
.
.
.
mainWidget = QtGui.QWidget()
mainWidget.setLayout( mainLayout )
self.setCentralWidget( mainWidget )
self.show()
""" Creating class """
self.server = MCCommunication.MCCommunication()
self.connect( self.server, QtCore.SIGNAL( "textUpdated" ), self.insertText );
sys.exit( self.app.exec_() )
класс MCCommunication является следующим:
МАКкоммуникация класса (QtCore.QObject ): «‘ classdocs»‘
def __init__( self ):
'''
Constructor
'''
HOST, PORT = socket.gethostbyname( socket.gethostname() ), 31000
self.server = SocketServer.ThreadingTCPServer( ( HOST, PORT ), MCRequestHandler )
ip, port = self.server.server_address
# Start a thread with the server
# Future task: Make the server a QT-Thread...
self.server_thread = threading.Thread( target = self.server.serve_forever )
self.server_thread.start()
self.emit( QtCore.SIGNAL( "textUpdated" ), ( "TCPServer listening on" ) )
но я получаю следующую ошибку:
self.emit( QtCore.SIGNAL( "textUpdated" ), ( "TCPServer listening on" ) )
RuntimeError: underlying C/C object has been deleted
Ответ №1:
Вам необходимо инициализировать базовый QObject в вашем классе MCCommunication. Добавьте эту строку в начало __init__
метода:
super(MCCommunication,self).__init__()
Комментарии:
1. 1. Никогда, никогда не забывайте вызывать
__init__
метод super при создании подкласса и переопределении__init__
.
Ответ №2:
Я не использую синтаксис старого стиля для сигналов и слотов.
Вы можете использовать новый стиль:
class MCCommunication( QtCore.QObject ):
textUpdated = pyqtSignal(str)
def __init__( self ):
super(MCCommunication,self).__init__()
...
self.textUpdated.emit("TCPServer listening on")
В экземпляре GUI:
self.server.textUpdated.connect(self.insertText)
ОБНОВЛЕНО: я добавил предложение Стивена Терри.
PS ( «TCPServer прослушивает») не является кортежем. В нем не хватает запятой.
( «TCPServer прослушивает» ,) представляет собой одноэлементный кортеж.