6

我对 PyQt 还是有点陌生​​,但我真的不知道为什么会这样。

我有一个这样创建的主窗口:

class MainWindow(QtGui.QMainWindow):
    #initialize
    def __init__(self):
        #Call parent constructor
        super(MainWindow, self).__init__()

        #Load the interface
        self.ui = uic.loadUi(r"Form Files/rsleditor.ui")

        #Show the ui
        self.ui.show()

当我想用以下方法覆盖关闭事件时:

def closeEvent(self, event):
    quit_msg = "Are you sure you want to exit the program?"
    reply = QtGui.QMessageBox.question(self, 'Message', 
              quit_msg, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

    if reply == QtGui.QMessageBox.Yes:
        self.saveSettings()
        event.accept()
    else:
        event.ignore()

我读到我必须将uic.loadUI调用更改为:

self.ui = uic.loadUi(r"Form Files/rsleditor.ui", self)

但是当我这样做时,我所有的动作都开始被触发三遍。我很确定我在添加之前正确设置了信号和插槽,因为它们正在工作。有什么帮助吗?

pyuic 文件:

    RSLEditorClass.setIconSize(QtCore.QSize(24, 24))
    self.centralWidget = QtGui.QWidget(RSLEditorClass)
    sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,    QtGui.QSizePolicy.Preferred)
    sizePolicy.setHorizontalStretch(0)
    sizePolicy.setVerticalStretch(0)
    sizePolicy.setHeightForWidth(self.centralWidget.sizePolicy().hasHeightForWidth())
    self.centralWidget.setSizePolicy(sizePolicy)
    self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
    self.vLayMain = QtGui.QVBoxLayout(self.centralWidget)
    self.vLayMain.setObjectName(_fromUtf8("vLayMain"))
    self.hLayFilePath = QtGui.QHBoxLayout()
    self.hLayFilePath.setObjectName(_fromUtf8("hLayFilePath"))
    self.lbFilePath = QtGui.QLabel(self.centralWidget)
    self.lbFilePath.setObjectName(_fromUtf8("lbFilePath"))
    self.hLayFilePath.addWidget(self.lbFilePath)
    self.txtFilePath = QtGui.QLineEdit(self.centralWidget)
    self.txtFilePath.setObjectName(_fromUtf8("txtFilePath"))
    self.hLayFilePath.addWidget(self.txtFilePath)
    self.vLayMain.addLayout(self.hLayFilePath)
    self.splitTxt = QtGui.QSplitter(self.centralWidget)
    sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
    sizePolicy.setHorizontalStretch(0)
    sizePolicy.setVerticalStretch(1)
    sizePolicy.setHeightForWidth(self.splitTxt.sizePolicy().hasHeightForWidth())
    self.splitTxt.setSizePolicy(sizePolicy)
    self.splitTxt.setLineWidth(0)
    self.splitTxt.setMidLineWidth(0)
    self.splitTxt.setOrientation(QtCore.Qt.Vertical)
    self.splitTxt.setHandleWidth(10)
    self.splitTxt.setObjectName(_fromUtf8("splitTxt"))
    self.tabMain = QtGui.QTabWidget(self.splitTxt)
    self.tabMain.setBaseSize(QtCore.QSize(0, 0))
    self.tabMain.setElideMode(QtCore.Qt.ElideNone)
    self.tabMain.setTabsClosable(True)
    self.tabMain.setMovable(False)
    self.tabMain.setObjectName(_fromUtf8("tabMain"))
    self.tabOutput = QtGui.QTabWidget(self.splitTxt)
    self.tabOutput.setObjectName(_fromUtf8("tabOutput"))
    self.tabRSLOut = QtGui.QWidget()
    self.tabRSLOut.setObjectName(_fromUtf8("tabRSLOut"))
    self.vLayRSL = QtGui.QVBoxLayout(self.tabRSLOut)
    self.vLayRSL.setObjectName(_fromUtf8("vLayRSL"))
    self.txtRSLOut = QtGui.QTextEdit(self.tabRSLOut)
    self.txtRSLOut.setTextInteractionFlags(QtCore.Qt.TextEditable)
    self.txtRSLOut.setObjectName(_fromUtf8("txtRSLOut"))
    self.vLayRSL.addWidget(self.txtRSLOut)
    self.tabOutput.addTab(self.tabRSLOut, _fromUtf8(""))
    self.tabRIBOut = QtGui.QWidget()
    self.tabRIBOut.setObjectName(_fromUtf8("tabRIBOut"))
    self.vLayRib = QtGui.QVBoxLayout(self.tabRIBOut)
    self.vLayRib.setObjectName(_fromUtf8("vLayRib"))
    self.txtRIBOut = QtGui.QTextEdit(self.tabRIBOut)
    self.txtRIBOut.setTextInteractionFlags(QtCore.Qt.TextEditable)
    self.txtRIBOut.setObjectName(_fromUtf8("txtRIBOut"))
    self.vLayRib.addWidget(self.txtRIBOut)
    self.tabOutput.addTab(self.tabRIBOut, _fromUtf8(""))
    self.vLayMain.addWidget(self.splitTxt)
    RSLEditorClass.setCentralWidget(self.centralWidget)
    self.menuBar = QtGui.QMenuBar(RSLEditorClass)
    self.menuBar.setGeometry(QtCore.QRect(0, 0, 750, 21))
    self.menuBar.setObjectName(_fromUtf8("menuBar"))
    self.menuFile = QtGui.QMenu(self.menuBar)
    self.menuFile.setObjectName(_fromUtf8("menuFile"))
    self.menuRecent_Files = QtGui.QMenu(self.menuFile)
    self.menuRecent_Files.setObjectName(_fromUtf8("menuRecent_Files"))
    self.menuEdit = QtGui.QMenu(self.menuBar)
    self.menuEdit.setObjectName(_fromUtf8("menuEdit"))
    self.menuSearch_Options = QtGui.QMenu(self.menuEdit)
    self.menuSearch_Options.setObjectName(_fromUtf8("menuSearch_Options"))
    self.menuView = QtGui.QMenu(self.menuBar)
    self.menuView.setObjectName(_fromUtf8("menuView"))
    self.menuSearch = QtGui.QMenu(self.menuBar)
    self.menuSearch.setObjectName(_fromUtf8("menuSearch"))
    self.menuDebug = QtGui.QMenu(self.menuBar)
    self.menuDebug.setObjectName(_fromUtf8("menuDebug"))
    self.menuHelp = QtGui.QMenu(self.menuBar)
    self.menuHelp.setObjectName(_fromUtf8("menuHelp"))
    RSLEditorClass.setMenuBar(self.menuBar)
    self.mainToolBar = QtGui.QToolBar(RSLEditorClass)
    self.mainToolBar.setObjectName(_fromUtf8("mainToolBar"))
    RSLEditorClass.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
    self.actionNew = QtGui.QAction(RSLEditorClass)
    icon1 = QtGui.QIcon()
    icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/new.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    self.actionNew.setIcon(icon1)
    self.actionNew.setObjectName(_fromUtf8("actionNew"))
    self.actionOpen = QtGui.QAction(RSLEditorClass)
    icon2 = QtGui.QIcon()
    icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/open.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    self.actionOpen.setIcon(icon2)
    self.actionOpen.setObjectName(_fromUtf8("actionOpen"))
    self.actionSave = QtGui.QAction(RSLEditorClass)
    icon3 = QtGui.QIcon()
    icon3.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/save.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    self.actionSave.setIcon(icon3)
    self.actionSave.setObjectName(_fromUtf8("actionSave"))
    self.actionSave_As = QtGui.QAction(RSLEditorClass)
    icon4 = QtGui.QIcon()
    icon4.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/save as.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    self.actionSave_As.setIcon(icon4)
    self.actionSave_As.setObjectName(_fromUtf8("actionSave_As"))
    self.actionUndo = QtGui.QAction(RSLEditorClass)
    icon5 = QtGui.QIcon()
    icon5.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/undo.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    self.actionUndo.setIcon(icon5)
    self.actionUndo.setObjectName(_fromUtf8("actionUndo"))
    self.actionRedo = QtGui.QAction(RSLEditorClass)
    icon6 = QtGui.QIcon()
    icon6.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/redo.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    self.actionRedo.setIcon(icon6)
    self.actionRedo.setObjectName(_fromUtf8("actionRedo"))
    self.actionCut = QtGui.QAction(RSLEditorClass)
    icon7 = QtGui.QIcon()
    icon7.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/cut.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    self.actionCut.setIcon(icon7)
    self.actionCut.setObjectName(_fromUtf8("actionCut"))
    self.actionCopy = QtGui.QAction(RSLEditorClass)
    icon8 = QtGui.QIcon()
    icon8.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/copy.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    self.actionCopy.setIcon(icon8)
    self.actionCopy.setObjectName(_fromUtf8("actionCopy"))
    self.actionPaste = QtGui.QAction(RSLEditorClass)
    icon9 = QtGui.QIcon()
    icon9.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/paste.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    self.actionPaste.setIcon(icon9)
    self.actionPaste.setObjectName(_fromUtf8("actionPaste"))
    self.actionSelect_All = QtGui.QAction(RSLEditorClass)
    self.actionSelect_All.setObjectName(_fromUtf8("actionSelect_All"))
    self.actionCompile = QtGui.QAction(RSLEditorClass)
    icon10 = QtGui.QIcon()
    icon10.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/compile.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    self.actionCompile.setIcon(icon10)
    self.actionCompile.setObjectName(_fromUtf8("actionCompile"))
    self.actionFind_Replace = QtGui.QAction(RSLEditorClass)
    self.actionFind_Replace.setObjectName(_fromUtf8("actionFind_Replace"))
    self.actionPreferences = QtGui.QAction(RSLEditorClass)
    icon11 = QtGui.QIcon()
    icon11.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/prefs.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    self.actionPreferences.setIcon(icon11)
    self.actionPreferences.setObjectName(_fromUtf8("actionPreferences"))
    self.actionAdd_Shader_Path = QtGui.QAction(RSLEditorClass)
    self.actionAdd_Shader_Path.setObjectName(_fromUtf8("actionAdd_Shader_Path"))
    self.actionAdd_Textures_Path = QtGui.QAction(RSLEditorClass)
    self.actionAdd_Textures_Path.setObjectName(_fromUtf8("actionAdd_Textures_Path"))
    self.actionAdd_Archives_Path = QtGui.QAction(RSLEditorClass)
    self.actionAdd_Archives_Path.setObjectName(_fromUtf8("actionAdd_Archives_Path"))
    self.actionAdd_PointCloud_Path = QtGui.QAction(RSLEditorClass)
    self.actionAdd_PointCloud_Path.setObjectName(_fromUtf8("actionAdd_PointCloud_Path"))
    self.actionAdd_BrickMap_Path = QtGui.QAction(RSLEditorClass)
    self.actionAdd_BrickMap_Path.setObjectName(_fromUtf8("actionAdd_BrickMap_Path"))
    self.actionAdd_PhotonMap_Path = QtGui.QAction(RSLEditorClass)
    self.actionAdd_PhotonMap_Path.setObjectName(_fromUtf8("actionAdd_PhotonMap_Path"))
    self.actionEditor_Docs = QtGui.QAction(RSLEditorClass)
    self.actionEditor_Docs.setObjectName(_fromUtf8("actionEditor_Docs"))
    self.actionDelight_Docs = QtGui.QAction(RSLEditorClass)
    self.actionDelight_Docs.setObjectName(_fromUtf8("actionDelight_Docs"))
    self.actionPRMan_Docs = QtGui.QAction(RSLEditorClass)
    self.actionPRMan_Docs.setObjectName(_fromUtf8("actionPRMan_Docs"))
    self.actionFundza = QtGui.QAction(RSLEditorClass)
    self.actionFundza.setObjectName(_fromUtf8("actionFundza"))
    self.actionColor_Picker = QtGui.QAction(RSLEditorClass)
    self.actionColor_Picker.setObjectName(_fromUtf8("actionColor_Picker"))
    self.actionClose_Tab = QtGui.QAction(RSLEditorClass)
    self.actionClose_Tab.setObjectName(_fromUtf8("actionClose_Tab"))
    self.actionExit = QtGui.QAction(RSLEditorClass)
    self.actionExit.setObjectName(_fromUtf8("actionExit"))
    self.menuRecent_Files.addSeparator()
    self.menuFile.addAction(self.actionNew)
    self.menuFile.addAction(self.actionOpen)
    self.menuFile.addAction(self.menuRecent_Files.menuAction())
    self.menuFile.addSeparator()
    self.menuFile.addAction(self.actionSave)
    self.menuFile.addAction(self.actionSave_As)
    self.menuFile.addSeparator()
    self.menuFile.addAction(self.actionClose_Tab)
    self.menuFile.addAction(self.actionExit)
    self.menuSearch_Options.addAction(self.actionAdd_Shader_Path)
    self.menuSearch_Options.addAction(self.actionAdd_Textures_Path)
    self.menuSearch_Options.addAction(self.actionAdd_Archives_Path)
    self.menuSearch_Options.addAction(self.actionAdd_PointCloud_Path)
    self.menuSearch_Options.addAction(self.actionAdd_BrickMap_Path)
    self.menuSearch_Options.addAction(self.actionAdd_PhotonMap_Path)
    self.menuEdit.addAction(self.actionUndo)
    self.menuEdit.addAction(self.actionRedo)
    self.menuEdit.addSeparator()
    self.menuEdit.addAction(self.actionCut)
    self.menuEdit.addAction(self.actionCopy)
    self.menuEdit.addAction(self.actionPaste)
    self.menuEdit.addSeparator()
    self.menuEdit.addAction(self.actionSelect_All)
    self.menuEdit.addSeparator()
    self.menuEdit.addAction(self.menuSearch_Options.menuAction())
    self.menuEdit.addAction(self.actionColor_Picker)
    self.menuSearch.addAction(self.actionFind_Replace)
    self.menuDebug.addAction(self.actionCompile)
    self.menuDebug.addSeparator()
    self.menuDebug.addAction(self.actionPreferences)
    self.menuHelp.addAction(self.actionEditor_Docs)
    self.menuHelp.addSeparator()
    self.menuHelp.addAction(self.actionDelight_Docs)
    self.menuHelp.addSeparator()
    self.menuHelp.addAction(self.actionPRMan_Docs)
    self.menuHelp.addSeparator()
    self.menuHelp.addAction(self.actionFundza)
    self.menuBar.addAction(self.menuFile.menuAction())
    self.menuBar.addAction(self.menuEdit.menuAction())
    self.menuBar.addAction(self.menuView.menuAction())
    self.menuBar.addAction(self.menuSearch.menuAction())
    self.menuBar.addAction(self.menuDebug.menuAction())
    self.menuBar.addAction(self.menuHelp.menuAction())
    self.mainToolBar.addAction(self.actionNew)
    self.mainToolBar.addAction(self.actionOpen)
    self.mainToolBar.addAction(self.actionSave)
    self.mainToolBar.addAction(self.actionSave_As)
    self.mainToolBar.addAction(self.actionUndo)
    self.mainToolBar.addAction(self.actionRedo)
    self.mainToolBar.addAction(self.actionCut)
    self.mainToolBar.addAction(self.actionCopy)
    self.mainToolBar.addAction(self.actionPaste)
    self.mainToolBar.addAction(self.actionCompile)
    self.mainToolBar.addAction(self.actionPreferences)

    self.retranslateUi(RSLEditorClass)
    self.tabMain.setCurrentIndex(-1)
    self.tabOutput.setCurrentIndex(0)
    QtCore.QMetaObject.connectSlotsByName(RSLEditorClass)

def retranslateUi(self, RSLEditorClass):
    RSLEditorClass.setWindowTitle(_translate("RSLEditorClass", "RSLEditor", None))
    self.lbFilePath.setText(_translate("RSLEditorClass", "File Path:", None))
    self.tabOutput.setTabText(self.tabOutput.indexOf(self.tabRSLOut), _translate("RSLEditorClass", "RSL Output", None))
    self.tabOutput.setTabText(self.tabOutput.indexOf(self.tabRIBOut), _translate("RSLEditorClass", "RIB Output", None))
    self.menuFile.setTitle(_translate("RSLEditorClass", "File", None))
    self.menuRecent_Files.setTitle(_translate("RSLEditorClass", "Recent Files", None))
    self.menuEdit.setTitle(_translate("RSLEditorClass", "Edit", None))
    self.menuSearch_Options.setTitle(_translate("RSLEditorClass", "Search Options", None))
    self.menuView.setTitle(_translate("RSLEditorClass", "View", None))
    self.menuSearch.setTitle(_translate("RSLEditorClass", "Search", None))
    self.menuDebug.setTitle(_translate("RSLEditorClass", "Debug", None))
    self.menuHelp.setTitle(_translate("RSLEditorClass", "Help", None))
    self.actionNew.setText(_translate("RSLEditorClass", "New", None))
    self.actionNew.setToolTip(_translate("RSLEditorClass", "Create a new file", None))
    self.actionNew.setShortcut(_translate("RSLEditorClass", "Ctrl+N", None))
    self.actionOpen.setText(_translate("RSLEditorClass", "Open", None))
    self.actionOpen.setToolTip(_translate("RSLEditorClass", "Open a file", None))
    self.actionOpen.setShortcut(_translate("RSLEditorClass", "Ctrl+O", None))
    self.actionSave.setText(_translate("RSLEditorClass", "Save", None))
    self.actionSave.setToolTip(_translate("RSLEditorClass", "Save the current file", None))
    self.actionSave.setShortcut(_translate("RSLEditorClass", "Ctrl+S", None))
    self.actionSave_As.setText(_translate("RSLEditorClass", "Save As", None))
    self.actionSave_As.setToolTip(_translate("RSLEditorClass", "Save as a new file", None))
    self.actionSave_As.setShortcut(_translate("RSLEditorClass", "Ctrl+Alt+S", None))
    self.actionUndo.setText(_translate("RSLEditorClass", "Undo", None))
    self.actionUndo.setToolTip(_translate("RSLEditorClass", "Undo last action", None))
    self.actionUndo.setShortcut(_translate("RSLEditorClass", "Ctrl+Z", None))
    self.actionRedo.setText(_translate("RSLEditorClass", "Redo", None))
    self.actionRedo.setToolTip(_translate("RSLEditorClass", "Redo last action", None))
    self.actionRedo.setShortcut(_translate("RSLEditorClass", "Shift+Z", None))
    self.actionCut.setText(_translate("RSLEditorClass", "Cut", None))
    self.actionCut.setToolTip(_translate("RSLEditorClass", "Cut selected text", None))
    self.actionCut.setShortcut(_translate("RSLEditorClass", "Ctrl+X", None))
    self.actionCopy.setText(_translate("RSLEditorClass", "Copy", None))
    self.actionCopy.setToolTip(_translate("RSLEditorClass", "Copy selected text", None))
    self.actionCopy.setShortcut(_translate("RSLEditorClass", "Ctrl+C", None))
    self.actionPaste.setText(_translate("RSLEditorClass", "Paste", None))
    self.actionPaste.setToolTip(_translate("RSLEditorClass", "Paste text", None))
    self.actionPaste.setShortcut(_translate("RSLEditorClass", "Ctrl+V", None))
    self.actionSelect_All.setText(_translate("RSLEditorClass", "Select All", None))
    self.actionSelect_All.setToolTip(_translate("RSLEditorClass", "Select all text", None))
    self.actionSelect_All.setShortcut(_translate("RSLEditorClass", "Ctrl+A", None))
    self.actionCompile.setText(_translate("RSLEditorClass", "Compile", None))
    self.actionCompile.setToolTip(_translate("RSLEditorClass", "Compile current document", None))
    self.actionCompile.setShortcut(_translate("RSLEditorClass", "Alt+E", None))
    self.actionFind_Replace.setText(_translate("RSLEditorClass", "Find/Replace", None))
    self.actionFind_Replace.setToolTip(_translate("RSLEditorClass", "Open find/replace dialog", None))
    self.actionFind_Replace.setShortcut(_translate("RSLEditorClass", "Ctrl+F", None))
    self.actionPreferences.setText(_translate("RSLEditorClass", "Preferences", None))
    self.actionPreferences.setToolTip(_translate("RSLEditorClass", "Open the preferences dialog", None))
    self.actionPreferences.setShortcut(_translate("RSLEditorClass", "Ctrl+P", None))
    self.actionAdd_Shader_Path.setText(_translate("RSLEditorClass", "Add Shader Path", None))
    self.actionAdd_Textures_Path.setText(_translate("RSLEditorClass", "Add Textures Path", None))
    self.actionAdd_Archives_Path.setText(_translate("RSLEditorClass", "Add Archives Path", None))
    self.actionAdd_PointCloud_Path.setText(_translate("RSLEditorClass", "Add PointCloud Path", None))
    self.actionAdd_BrickMap_Path.setText(_translate("RSLEditorClass", "Add BrickMap Path", None))
    self.actionAdd_PhotonMap_Path.setText(_translate("RSLEditorClass", "Add PhotonMap Path", None))
    self.actionEditor_Docs.setText(_translate("RSLEditorClass", "Editor Docs", None))
    self.actionDelight_Docs.setText(_translate("RSLEditorClass", "3Delight Docs", None))
    self.actionPRMan_Docs.setText(_translate("RSLEditorClass", "PRMan Docs", None))
    self.actionFundza.setText(_translate("RSLEditorClass", "Fundza", None))
    self.actionColor_Picker.setText(_translate("RSLEditorClass", "Color Picker", None))
    self.actionColor_Picker.setShortcut(_translate("RSLEditorClass", "Ctrl+I", None))
    self.actionClose_Tab.setText(_translate("RSLEditorClass", "Close Tab", None))
    self.actionExit.setText(_translate("RSLEditorClass", "Exit", None))

import rsleditor_rc
4

1 回答 1

5

如果您向下滚动到setupUiui 模块中方法的底部,您将看到这一行:

    QtCore.QMetaObject.connectSlotsByName(RSLEditorClass)

这样做的目的是根据插槽名称的格式自动将信号连接到插槽。插槽名称的格式为:

    on_[object name]_[signal name]

所以看看你连接你的行动的方式:

    self.ui.actionNew.triggered.connect(self.on_actionNew_triggered)

应该清楚的是,您在命名插槽时使用了这种格式,这就是问题所在。但是为什么这会导致 slot 被调用3次呢?好吧,在 PyQt 中,触发信号有两个重载:一个发送默认checked参数,一个不发送。如果您不指定要连接其中的哪一个,则两个重载都将连接。所以在你的情况下,发生的事情是通过你自己的显式on_actionNew_triggered连接两次connectSlotsByName连接一次,总共三个。据推测,其他行动也可以讲述类似的故事。

要解决此问题,您可以重命名插槽,使其不使用自动连接格式:

    self.ui.actionNew.triggered.connect(self.handleActionNew)
    ...

    def handleActionNew(self):
    ...

或摆脱显式连接,并使用pyqtSlot 装饰器为自动连接选择正确的重载:

    @QtCore.pyqtSlot()
    def on_actionNew_triggered(self):
    ...

或者:

    @QtCore.pyqtSlot(bool)
    def on_actionNew_triggered(self, checked):
    ...
于 2014-04-05T01:14:37.733 回答