我目前正在尝试将旧的python程序从Python 2转换为Python 3,并从PyQt4更新为PyQt5。该应用程序使用PyQt5不支持的旧式信号和插槽。我已经找到了大部分需要做的事情,但下面是几行,我似乎无法工作:
self.emit(SIGNAL('currentChanged'), row, col)
self.emit(SIGNAL("activated(const QString &)"), self.currentText())
self.connect(self,SIGNAL("currentChanged(const QString&)"), self.currentChanged)
前两行,我不知道从哪里开始,因为它们似乎没有附加任何东西。最后一个例子我不太清楚如何处理(const QString &
)。
我不完全确定如何处理这些,我还在学习python,但任何帮助都会受到赞赏。
编辑:文档似乎并没有真正深入研究这些案例,至少以我理解的方式。
答案 0 :(得分:2)
对此的确切答案取决于self
的对象类型。如果它是已经定义了这些信号的Qt类,则新式语法将是:
self.currentChanged[int, int].emit(row, col)
self.activated[str].emit(self.currentText())
self.currentChanged[str].connect(self.handleCurrentChanged)
但是,如果中的任何未预先定义,则需要为它们定义自定义信号,如下所示:
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)
旧式语法允许动态发送自定义信号(即不首先定义它们),但这是不可能的。使用新式语法,必须始终明确定义自定义信号。
请注意,如果只为信号定义了一个重载,则可以省略选择器:
self.activated.emit(self.currentText())
有关详细信息,请参阅PyQt文档中的这些文章:
修改强>:
对于您的实际代码,您需要对currentChanged
信号进行以下更改:
在 Multibar.py (第30行):
这定义了一个自定义信号(因为QWidget
没有它):
class MultiTabBar(QWidget):
# add the following line
currentChanged = pyqtSignal(int, int)
在 Multibar.py (第133行):
这会发出(1)中定义的自定义信号:
# self.emit(SIGNAL('currentChanged'), row, col)
self.currentChanged.emit(row, col)
在 ScWindow.py (第478行附近):
这连接了(1)中定义的信号:
# self.connect(self.PieceTab,SIGNAL("currentChanged"),self.pieceTabChanged)
self.PieceTab.currentChanged.connect(self.pieceTabChanged)
在 ItemList.py (第73行):
QFileDialog
类already defines this signal,只有一个重载。但是必须更改插槽的名称,因为它隐藏了内置信号名称(它已成为新式语法中的属性)。所以连接应该是这样的:
# self.connect(self,SIGNAL("currentChanged(const QString&)"),self.currentChanged)
self.currentChanged.connect(self.onCurrentChanged)
在 ItemList.py (第78行):
这将重命名(4)中的连接插槽:
# def currentChanged(self, file):
def onCurrentChanged(self, file):