2017-08-22 1 views
1
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_()) 
fichier UI

générés par QtDesign:tranche d'appel PyQt5 deux fois

<?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> 

Lorsque le bouton est cliqué, un 'h' est censé être sortie.

Cependant, deux 'h sont produits en sortie.

Peut-être que la connexion est liée deux fois quelque part. Mais je ne sais pas où ça arrive. Et, si j'ajoute self.quitButton.clicked.connect(self.on_quitButton_clicked) en __init__, 3 'h sont sortis. Lorsque vous écrivez en C++, c'est OK.

version python3:

Python 3.5.2 

version 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: [email protected] 
License: GPL v3 
Location: /usr/local/lib/python3.5/dist-packages 
Requires: sip 
+2

Je ne trouve rien de mal dans votre code et je doute que le bug soit causé par les 8 lignes que vous avez postées. Vous devrez faire un [MVCE] (https://stackoverflow.com/help/mcve) afin que nous puissions reproduire le problème. Commencez avec votre programme complet, y compris les fichiers générés automatiquement par QtDesigner, et supprimez tout ce qui ne contribue pas au bogue. Soyez rigoureux à ce sujet. Efforcez-vous à un seul script que nous pouvons simplement copier-coller-exécuter. Je suis sûr à 99% que vous trouverez le bug vous-même dans le processus. – titusjan

+0

@titusjan J'envisage d'ajouter plus de détails. Et, une question similaire: [PyQT: QFileDialog continue d'ouvrir la fenêtre après avoir cliqué sur annuler ou ok] (https://gis.stackexchange.com/questions/171395/pyqt-qfiledialog-keeps-on-opening-window-after- click-on-cancel-or-ok) – chaosink

+0

@chaosink, Quelle version * spécifique * de pyqt utilisez-vous, et sur quelle plateforme? – ekhumoro

Répondre

1

Ce problème se produit parce que vous utilisez la fonction Connecting Slots By Name. Si un signal a plusieurs surcharges, une connexion automatique sera établie pour chacun d'entre eux. Le signal clicked a deux surcharges: une qui envoie un paramètre par défaut checked, et une qui ne le fait pas. Pour ne sélectionner qu'un seul d'entre eux, vous devez définir le slot comme ceci:

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

Y at-il une fonction vide 'on_quitButton_clicked()' générée automatiquement? – chaosink

+0

Si je lie le bouton à deux fonctions différentes par 'self.quitButton.clicked.connect (self.quitButton_clicked1)' et 'self.quitButton.clicked.connect (self.quitButton_clicked2)', les deux fonctions seront appelées. – chaosink

+0

Pourquoi ma fonction personnalisée 'on_quitButton_clicked()' est liée deux fois? – chaosink