为什么 PyQt 执行我的操作三次?

2023-12-19

我对 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

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

    QtCore.QMetaObject.connectSlotsByName(RSLEditorClass)

这样做的目的是自动将信号连接到插槽 http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html#connecting-slots-by-name基于插槽名称的格式。插槽名称的格式为:

    on_[object name]_[signal name]

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

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

应该清楚的是,您在命名插槽时使用了这种格式,这就是问题所在。但是为什么这会导致槽被调用three次?嗯,在 PyQt 中,触发的 http://qt-project.org/doc/qt-4.8/qaction.html#triggered信号有两个重载:一个发送默认值checked参数,以及没有的参数。如果您没有指定要连接到其中哪一个,both过载将被连接。所以在你的情况下,会发生什么on_actionNew_triggered已连接twice by connectSlotsByName and once通过你自己的明确联系,总共三个。想必,其他行动也可以讲述类似的故事。

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

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

    def handleActionNew(self):
    ...

或摆脱显式连接,并使用pyqt槽装饰器 http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html#the-pyqtslot-decorator选择正确的自动连接过载:

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

or:

    @QtCore.pyqtSlot(bool)
    def on_actionNew_triggered(self, checked):
    ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 PyQt 执行我的操作三次? 的相关文章

  • httplib.BadStatusLine: '' 在 Linux 上,但在 Mac 上则不然

    这个错误已经困扰我几个小时了 我决定编写一个单独的项目 只是为了看看我是否可以复制它 而且我可以 但只能在我的服务器上复制 这适用于我的 Mac Mac OSX El Capitan 10 11 6 服务器 CentOS 7 2 1511
  • 从一个数组中删除另一个数组中的元素

    假设我有这些二维数组A and B 我怎样才能从中删除元素A那些在B 集合论中的补集 A B A np asarray 1 1 1 1 1 2 1 1 3 1 1 4 B np asarray 0 0 0 1 0 2 1 0 3 1 0 4
  • 为什么最新的 Python 3.8.x 版本不提供 Windows 安装程序?

    我需要在Windows计算机上安装Python 3 8并希望使用最新的小版本3 8 12 https www python org downloads release python 3812 官方发布网页提供了源代码的 tarball 文件
  • python 打开相对文件夹中所有以.txt结尾的文件

    我需要打开并解析文件夹中的所有文件 但我必须使用相对路径 类似于 input files 我知道在 JavaScript 中你可以使用 path 库来解决这个问题 我怎样才能在Python中做到这一点 这样您就可以获得路径中的文件列表作为列
  • 使用 OpenCV 进行图像模糊检测

    我正在研究图像的模糊检测 我已经用过拉普拉斯方法的方差在 OpenCV 中 img cv2 imread imgPath gray cv2 cvtColor img cv2 COLOR BGR2GRAY value cv2 Laplacia
  • Pandas cut 方法不包括下限

    我正在尝试对包含 0 到 100 范围内的年龄的数据帧列进行分箱 当我尝试使用垃圾箱来包含零年龄时 它不起作用 这是一个使用包含我的数据范围的列表的演示 pd cut pd Series range 101 0 24 49 74 100 范
  • PRAW 出现 SSLError?

    我正在尝试开始使用 PRAW 但在使用 login 时遇到问题 我有以下代码 import praw r praw Reddit This is a test bot r login myRedditUsername password 我收
  • 将Python嵌入到C中——导入模块

    我在使用嵌入式 Python for C 时遇到问题文档 http docs python org extending embedding html 每当我尝试使用导入的模块时 我都会得到 PythonIncl exe 中 0x1e089e
  • 在 Pyinstaller、语音识别和 Pyttsx3 中使用“-w”时,PySimpleGUI 中出现“OSError:[WinError 6] 句柄无效”

    所以我用 PySimpleGUI 创建了一个程序 然后用 Pyinstaller 从它创建了 exe 文件 这是我的命令 pyinstaller hidden import pyttsx3 drivers hidden import pyt
  • UTF-8 解码如何知道字节边界?

    我一直在阅读大量有关 unicode 编码的文章 尤其是有关 Python 的文章 我想我现在对此已经有了相当深入的了解 但仍有一个小细节我有点不确定 解码如何知道字节边界 例如 假设我有一个带有两个 unicode 字符的 unicode
  • 如果工作表不存在,Pandas 将工作表附加到工作簿,否则覆盖工作表

    我正在使用 pandas 更新现有的 Excel 工作簿 当使用ExcelWriter对象 我可以覆盖工作表 如果存在 否则创建一个新工作表吗 我的代码附加了新工作表 但是当我尝试覆盖现有工作表时 它会附加一个名称略有不同的新工作表 例如
  • Python 的二进制字符串列表

    我有一个像这样的二进制字符串 1100011101 我想将其解析为一个列表 其中每个 1 或 0 块都是列表中的单独值 例如 1100011101 变成 11 000 111 0 1 您可以通过使用正则表达式而不是从中获得一点 次要 性能g
  • Web 应用程序框架:C++ 与 Python

    作为一名程序员 我熟悉 Python 和 C 我正在考虑编写自己的简单 Web 应用程序 并且想知道哪种语言更适合服务器端 Web 开发 我正在寻找一些东西 它必须是直观的 我认识到 Wt 存在并且它遵循 Qt 的模型 我讨厌 Qt 的一件
  • 为什么Python 3中实例方法可以作为类方法调用?

    考虑下面的类 class Foo object def bar self print self 在Python 2中 2 7 13 调用bar 作为类方法引发异常 gt gt gt Foo bar hello Traceback most
  • 提取二值图像中的最中心区域

    我正在处理二进制图像 之前使用此代码来查找二进制图像中的最大区域 Use the hue value to convert to binary thresh 20 thresh thresh img cv2 threshold h thre
  • 并行磁盘 I/O

    我有几个想要阅读的日志文件 不失一般性 假设日志文件处理如下 def process infilepath answer 0 with open infilepath as infile for line in infile if line
  • 更改 Windows 上的 virtualenv 文件夹

    计算机修复后 我的 python 项目目录 Windows 发生了变化 比如从 d 到 f 现在我所有的 virtualenv 都坏了 激活 env 后 virtualenv 中的项目无法找到依赖项 并且自定义脚本 来自 env scrip
  • Django - 从时间戳获取不同的日期

    我正在尝试按日期过滤用户 但直到我可以找到数据库中用户的第一个和最后一个日期为止 虽然我可以让我的脚本稍后过滤掉重复项 但我想从一开始就使用 Django 来完成此操作distinct因为它显着减少 我试过 User objects val
  • Python 多处理:全局对象未正确复制到子级

    前几天我回答了一个关于SO的问题 https stackoverflow com q 67047533 1925388关于并行读取 tar 文件 这是问题的要点 import bz2 import tarfile from multipro
  • PyQt 和 QSignalMapper/lambdas - 多个信号,单槽

    我在 PyQt 的菜单上有一个操作列表 每个操作对应我想要显示的每个不同的提要 所以我有一个 Y 将活动源设置为 Y Z 将其设置为 Z 等等 对于网络漫画阅读程序 我的菜单上都有 并且觉得自动化方法可能更好 而不是每次都打字 类似于将其添

随机推荐

  • && 逻辑和 || 的 True 和 False逻辑表

    C 语言的真 假表 我听说过 C 语言中有一个表 true false for and or 是一种数学 他们说如果 true true true 且 false true false 我只是对此感到困惑 我尝试进行研究 但找不到任何表格
  • 如何使用 jquery 将自定义标头添加到 ASMX Web 服务调用?

    我有一个具有以下合同的网络服务 POST Service service asmx HTTP 1 1 Host xxx xxx xxx Content Type text xml charset utf 8 Content Length l
  • 此操作将取消挂起的刷新数据命令

    当我尝试此代码时 我收到错误 此操作将取消挂起的刷新数据命令 是否继续 ActiveWorkbook RefreshAll 即使我把Application Wait now TimeValue 00 01 20 Excel 未正确刷新 解决
  • 从 C# 中继承的类转换数据类型

    我试图了解我的统一项目的继承 但似乎发现我的设置存在限制 我在写这篇文章时感到很困惑 因为我仍在学习正确理解 C 我有一组继承的类 它们根据两种不同的行为进行划分 这样我就有了正确的引用 然后我需要对它们进行转换 以便我可以访问这些类之一中
  • Javascript 模块模式有什么好处?

    我一直在研究为我的团队提出标准化的 Javascript 编码风格 现在大多数资源推荐涉及闭包的 模块 模式 如下所示 var Module function someMethod function return someMethod so
  • 不知道为什么在 C# 嗅探器中设置套接字选项时收到错误代码 10022(无效参数)

    我正在编写一个数据包嗅探器作为学习 C Net 4 套接字开发的练习 我的目标是嗅探进出我的计算机的 IP 数据包 我的问题是 在调用 SetSocketOption 时收到错误代码 10022 参数无效 我看不出我哪里有无效的论点 我的计
  • Swift didReceiveRemoteNotification 未调用

    我有一个以 oneSignal 作为推送提供者的应用程序 我可以收到推送通知 效果很好 但如果我尝试访问推送有效负载 我什么也得不到didReceiveRemoteNotification没有被调用 我有以下代码 func applicat
  • 如果隐藏子表则隐藏父 Div(显示:无)

    我尝试在 StackOverflow 和 Google 上进行搜索 找到了一些我认为可行的想法 但似乎没有任何帮助 我正在 SugarCRM Professional 6 5 5 中工作 如果使用 jQuery 隐藏表 显示 无 我试图隐藏
  • 使用 Doctrine 2 自动引用保留字

    有没有办法在使用时自动引用 Doctrine 2 的保留字 entityManager gt find entity id 使用查询生成器时可以完成此操作 但应该有一个全局配置设置来执行此操作 我不想在保留字的注释中指定它 这是我不久前向
  • Java SDK 的 Couchbase 连接超时

    我按照 couchbase 教程连接到远程 couchbase 服务器 但在我尝试打开默认存储桶后 连接超时失败 我已检查是否可以在我的计算机上打开 couchbase 服务器页面 192 xx xx xx 8091 这是我的Java代码
  • 如何使用 css 滤镜获得图像:模糊和锐利边缘?

    我想在悬停时模糊图像 问题是图像的边缘也模糊得令人不快 在 Fiddle 中 您可以在绿色背景下清楚地看到它 如果我缩放图像 即 1 2 它最终会解决问题 但在过渡过程中 模糊的边缘仍然出现 有什么想法如何使边缘具有这种效果 http js
  • HTML5 上传前预先调整图像大小

    这是一个面条刮刀 请记住 我们有 HTML5 本地存储和 xhr v2 等等 我想知道是否有人可以找到一个可行的示例 甚至只是对这个问题给出 是 或 否 是否可以使用新的本地存储 或其他 预先调整图像大小 以便不知道如何调整图像大小的用户可
  • Swift:@objc(...) 属性

    在 Apple 生成的代码中 Core DataNSManagedObject子类 例如 我看到这个 objc LPFile public class LPFile NSManagedObject 我的问题是 为什么是 objc声明如上所述
  • 我需要与多个远程参与者系统进行通信

    我正在使用 akka Net 开发一种插件架构 其中包含一个或多个插件的每个 dll 都被加载到自己的中AppDomain并且新的参与者系统被初始化 准备接收来自 主机 的消息 我试图让它与多个插件一起工作 但我却陷入困境 所以主机配置如下
  • 条形图中的渐变填充

    我正在观察不同人群的行为 称为Clusters在此数据集中 以及他们对所使用的浏览器类型的偏好 我想创建一个条形图 显示使用每种类型浏览器的每个集群的百分比 下面是一些生成类似数据集的代码 请忽略每个簇的百分比加起来不会等于 1 brows
  • Clang++-3.7 CRTP 编译错误“父级模板参数中没有命名成员”

    在下面的代码中 我尝试使用 CRTP 来使用父类中子类的静态成员 值 当使用带有 pedantic 标志的 g 5 2 1 编译代码时 我能够按预期编译 并且在执行时c print value and Child
  • 从包含数百万个文件的目录中精确匹配地高效查找数千个文件 (bash/python/perl)

    我在 Linux 上 试图从包含数百万个文件的目录 SOURCE DIR 中查找数千个文件 我有一个需要查找的文件名列表 存储在单个文本文件 FILE LIST 中 该文件的每一行都包含与 SOURCE DIR 中的文件相对应的单个名称 并
  • Visual Studio 卡在生成代码中

    当我使用 Visual Studio 构建 C 项目时 进程陷入困境生成代码 1 gt Rebuild All started Project myWrapper Configuration Release Win32 1 gt funzi
  • iOS 重新安装应用程序不会清除徽章

    我已通过本地通知将应用程序的徽章编号设置为 1 然后我卸载该应用程序 当我重新安装它时 徽章仍然存在 这是 iOS 错误还是有办法在卸载时清除徽章 thanks 徽章计数由操作系统维护 独立于应用程序 卸载 删除 应用程序时 操作系统会保留
  • 为什么 PyQt 执行我的操作三次?

    我对 PyQt 还是个新手 但我真的不知道为什么会发生这种情况 我有一个像这样创建的主窗口 class MainWindow QtGui QMainWindow initialize def init self Call parent co