2017-08-22 2 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_()) 

UI-Datei von QtDesign generiert:PyQt5 Call-Slot für zwei mal

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

Wenn die Schaltfläche geklickt wird, ein 'h' soll ausgegeben werden.

Allerdings werden zwei 'h's actural ausgegeben.

Vielleicht ist die Verbindung für zwei mal irgendwo verbindlich. Aber ich weiß nicht, wo es passiert.

Und wenn ich self.quitButton.clicked.connect(self.on_quitButton_clicked) in __init__ hinzufügen, werden 3 'h ausgegeben.

Beim Schreiben in C++ ist es in Ordnung.

Version von Python3:

Python 3.5.2 

Version von 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

Ich kann nichts falsch in Ihrem Code finden und ich bezweifle, dass der Fehler durch die 8 Zeilen verursacht wird, die Sie gepostet haben. Sie müssen ein [MVCE] (https://stackoverflow.com/help/mcve) erstellen, damit wir das Problem reproduzieren können. Beginnen Sie mit Ihrem vollständigen Programm, einschließlich der automatisch generierten Dateien von QtDesigner, und entfernen Sie alles, was nicht zum Fehler beiträgt. Sei streng darüber. Streben Sie ein einzelnes Skript an, das wir einfach kopieren, einfügen und ausführen können. Ich bin zu 99% sicher, dass Sie den Fehler selbst finden werden. – titusjan

+0

@titusjan Ich überlege mir, weitere Details hinzuzufügen. Und eine ähnliche Frage: [PyQT: QFileDialog öffnet das Fenster nach dem Klicken auf Abbrechen oder ok weiter] (https://gis.stackexchange.com/questions/171395/pyqt-qfiledialog-keeps-on-opening-window-after- Klick-auf-Abbrechen-oder-ok) – chaosink

+0

@chaosink, Welche * spezifische * Version von pyqt benutzt du und auf welcher Plattform? – ekhumoro

Antwort

1

Dieses Problem tritt auf, weil Sie die Connecting Slots By Name-Funktion verwenden. Wenn ein Signal mehrere Überlastungen aufweist, wird für jede einzelne eine automatische Verbindung hergestellt. Das clicked Signal hat zwei Überladungen: eine, die einen Standard checked Parameter sendet, und eine, die das nicht tut. Um nur einen davon auszuwählen, müssen Sie den Steckplatz wie folgt definieren:

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

Wird eine leere Funktion 'on_quitButton_clicked()' automatisch generiert? – chaosink

+0

Wenn ich die Schaltfläche durch 'self.quitButton.clicked.connect (self.quitButton_clicked1)' und 'self.quitButton.clicked.connect (self.quitButton_clicked2)' an zwei verschiedene Funktionen binde, werden beide Funktionen aufgerufen. – chaosink

+0

Warum ist meine angepasste Funktion 'on_quitButton_clicked()' für zwei Mal bind? – chaosink