PyQt5调用槽两次

PyQt5 call slot for two times

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog
from PyQt5.QtCore import QCoreApplication
from PyQt5 import uic

qt_design_ui = "/home/lin/program/Qt/Notepad/notepad.ui"
Ui_Notepad, QtBaseClass = uic.loadUiType(qt_design_ui)

class Notepad(QMainWindow, Ui_Notepad):
    def __init__(self):
        super(Notepad, self).__init__()
        self.setupUi(self)
    def on_quitButton_clicked(self):
        # QCoreApplication.quit();
        print("h")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Notepad()
    window.show()
    sys.exit(app.exec_())

UI QtDesign生成的文件:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Notepad</class>
 <widget class="QMainWindow" name="Notepad">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Notepad</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QWidget" name="layoutWidget">
    <property name="geometry">
     <rect>
      <x>70</x>
      <y>10</y>
      <width>258</width>
      <height>222</height>
     </rect>
    </property>
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
      <widget class="QPushButton" name="quitButton">
       <property name="layoutDirection">
        <enum>Qt::LeftToRight</enum>
       </property>
       <property name="text">
        <string>Quit</string>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>400</width>
     <height>19</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
  <action name="actionOpen">
   <property name="text">
    <string>Open</string>
   </property>
  </action>
  <action name="actionSave">
   <property name="text">
    <string>Save</string>
   </property>
  </action>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

当点击按钮时,应该会输出一个'h'。

但是实际输出了两个'h'

也许连接在某处绑定了两次。但我不知道它发生在哪里。

并且,如果我将 self.quitButton.clicked.connect(self.on_quitButton_clicked) 添加到 __init__,则输出 3 'h'。

用C++写的时候还可以

Python3 的版本:

Python 3.5.2

PyQt5 版本:

Name: PyQt5
Version: 5.9
Summary: Python bindings for the Qt cross platform UI and application toolkit
Home-page: https://www.riverbankcomputing.com/software/pyqt/
Author: Riverbank Computing Limited
Author-email: info@riverbankcomputing.com
License: GPL v3
Location: /usr/local/lib/python3.5/dist-packages
Requires: sip

发生此问题是因为您使用的 Connecting Slots By Name feature. If a signal has multiple overloads, an automatic connection will be made for each one of them. The clicked 信号有两个重载:一个发送默认 checked 参数,一个不发送默认参数吨。要 select 只有其中之一,您需要像这样定义插槽:

class Notepad(QMainWindow, Ui_Notepad):
    ...
    @QtCore.pyqtSlot()
    def on_quitButton_clicked(self):
        print("hello world")