Сигналы в PyQt4

#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 прослушивает» ,) представляет собой одноэлементный кортеж.