¿Manera correcta de convertir la SEÑAL y la RANURA antiguas al nuevo estilo?

Actualmente estoy intentando convertir un progtwig Python antiguo de Python 2 a Python 3, y actualizar de PyQt4 a PyQt5. La aplicación utiliza la señal de estilo antiguo y las ranuras que no son compatibles con PyQt5. He descubierto la mayor parte de lo que se necesita hacer, pero a continuación hay algunas líneas en las que parece que no puedo trabajar:

self.emit(SIGNAL('currentChanged'), row, col) self.emit(SIGNAL("activated(const QString &)"), self.currentText()) self.connect(self,SIGNAL("currentChanged(const QString&)"), self.currentChanged) 

Las dos líneas superiores, no tengo idea de por dónde empezar ya que no parecen estar atadas a nada. El último ejemplo no estoy muy seguro de qué hacer con ( const QString & ).

No estoy completamente seguro de cómo abordar esto, y todavía estoy aprendiendo python, pero cualquier ayuda sería apreciada.

EDITAR: La documentación realmente no parece profundizar en estos casos, al menos de una manera que yo entiendo.

La respuesta exacta a esto dependerá de qué tipo de objeto es el self . Si es una clase Qt que ya define esas señales, entonces la syntax de nuevo estilo sería esta:

 self.currentChanged[int, int].emit(row, col) self.activated[str].emit(self.currentText()) self.currentChanged[str].connect(self.handleCurrentChanged) 

Sin embargo, si alguno de ellos no está predefinido, deberá definir señales personalizadas para ellos, como esto:

 class MyClass(QWidget): # this defines two overloads for currentChanged currentChanged = QtCore.pyqtSignal([int, int], [str]) activated = QtCore.pyqtSignal(str) def __init__(self, parent=None): super(MyClass, self).__init__(parent) self.currentChanged[str].connect(self.handleCurrentChanged) def handleCurrentChanged(self, text): print(text) 

La syntax de estilo antiguo permitió que las señales personalizadas se emitieran dinámicamente (es decir, sin definirlas primero), pero eso ya no es posible. Con la syntax de nuevo estilo, las señales personalizadas siempre deben definirse explícitamente.

Tenga en cuenta que, si solo hay una sobrecarga definida para una señal, se puede omitir el selector:

  self.activated.emit(self.currentText()) 

Para obtener más información, consulte estos artículos en los documentos de PyQt:

  • Soporte para señales y slots (PyQt5)
  • Señal de estilo antiguo y soporte de ranura (PyQt4)
  • Señal de nuevo estilo y soporte de ranura (PyQt4)

EDITAR :

Para su código real, necesita hacer los siguientes cambios para las señales currentChanged :

  1. En Multibar.py (alrededor de la línea 30):

    Esto define una señal personalizada (porque QWidget no la tiene):

     class MultiTabBar(QWidget): # add the following line currentChanged = pyqtSignal(int, int) 
  2. En Multibar.py (alrededor de la línea 133):

    Esto emite la señal personalizada definida en (1):

     # self.emit(SIGNAL('currentChanged'), row, col) self.currentChanged.emit(row, col) 
  3. En ScWindow.py (alrededor de la línea 478):

    Esto conecta la señal definida en (1):

      # self.connect(self.PieceTab,SIGNAL("currentChanged"),self.pieceTabChanged) self.PieceTab.currentChanged.connect(self.pieceTabChanged) 
  4. En ItemList.py (alrededor de la línea 73):

    La clase QFileDialog ya define esta señal , y solo hay una sobrecarga de ella. Pero el nombre de la ranura debe cambiarse, ya que está siguiendo el nombre de la señal incorporada (que se ha convertido en un atributo en la syntax de nuevo estilo). Así que la conexión debe hacerse así:

      # self.connect(self,SIGNAL("currentChanged(const QString&)"),self.currentChanged) self.currentChanged.connect(self.onCurrentChanged) 
  5. En ItemList.py (alrededor de la línea 78):

    Esto cambia el nombre de la ranura para la conexión hecha en (4):

      # def currentChanged(self, file): def onCurrentChanged(self, file):