Pyqt – das, Was signal wird mein standard – „Anwenden“ – button emittieren und wie Schreibe ich den Schlitz für ihn?

Ich bin nur zu lernen, pyqt und ich versuche zu verstehen, – Standard-Tasten. Ich bin nur zu lernen, so lassen Sie mich wissen, wenn ich irgendetwas grob falsch.

Ich habe eine einfache Benutzeroberfläche mit einigen standard-Schaltflächen im QT Designer.

Bemerkte ich, dass die angenommen() und abgelehnt ( – ) Signale werden verbunden, um das annehmen und ablehnen von slots, also schrieb ich Ihnen. Der Ok-button und Abbrechen-button funktioniert wie erwartet, aber die Schaltfläche Anwenden, einfach nicht reagieren. Wie Verbinde ich die Schaltfläche anwenden, um einen slot?

sample.py – Hier ist mein Beispiel-Anwendung code:

import sys
from PyQt4 import QtGui

import designer

class SampleApp(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self,parent)
        self.ui = designer.Ui_Dialog()
        self.ui.setupUi(self)

    def reject(w):
        print("reject", w)
        w.close()

    def accept(w):
        print("accept", w)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    myapp = SampleApp()
    myapp.show()
    sys.exit(app.exec_())

designer.py – Hier ist die automatisch generierte QT-Designer-code:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'designer.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(554, 399)
        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
        self.buttonBox.setGeometry(QtCore.QRect(190, 340, 341, 32))
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Apply|QtGui.QDialogButtonBox.Close|QtGui.QDialogButtonBox.Ok)
        self.buttonBox.setCenterButtons(False)
        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))

        self.retranslateUi(Dialog)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))



3 Replies
  1. 3

    Müssen Sie die clicked signal von der Gelten Taste manuell in Ihrem widget.

    class SampleApp(QtGui.QWidget):
    
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self,parent)
            self.ui = designer.Ui_Dialog()
            self.ui.setupUi(self)
            btn = self.ui.buttonBox.button(QtGui.QDialogButtonBox.Apply)
            btn.clicked.connect(self.accept)
  2. 4

    Brauchen Sie nicht zu schreiben-slots für accept() und reject(), weil die QDialog schon Klasse, hat Sie.

    Wenn Sie ein neues Formular erstellen, und wählen Sie „Dialog mit den Buttons“, wird es fügen Sie ein button-box mit Ok-und Abbrechen-buttons, und die accepted()/rejected() Signale werden automatisch verbunden, um das Dialogfeld vorhandene accept() und reject() slots.

    Aber beachten Sie, dass es keine eins-zu-eins-Beziehung zwischen den Schaltflächen und Signale. Stattdessen gibt es eine Reihe von Taste Rollen, und jeder standard-Schaltfläche zugeordnet ist eine dieser Rollen. Alle Tasten, mit der AcceptRole emittieren, die accepted() signal, die mit der RejectRole emittieren, die rejected() signal, während diejenigen mit der HelpRole emittieren, die helpRequested() signal. Aber die anderen Rollen (wie die ApplyRole), geben keine spezifischen Signale andere als clicked().

    Behandeln alle anderen Tasten, man könnte hinzufügen, ein single-slot-so:

    class SampleApp(QtGui.QWidget):  
        def __init__(self, parent=None):
            super(SampleApp, self).__init__(parent)
            self.ui = designer.Ui_Dialog()
            self.ui.setupUi(self)
            self.ui.buttonBox.clicked.connect(self.handleButtonClick)
    
        def handleButtonClick(self, button):
            sb = self.buttonBox.standardButton(button)
            if sb == QtGui.QDialogButtonBox.Apply:
                print('Apply Clicked')
            elif sb == QtGui.QDialogButtonBox.Reset:
                print('Reset Clicked')        
            # and so on...
  3. 0

    Müssen Sie die Schaltfläche aus der QDialogButtonBox und verbinden clicked signal auf den gewünschten Steckplatz. Auch ich schlage vor, Sie verwenden die new-style-Signals und slots Unterstützung, die die Art und Weise ist mehr intuitiv:

    Hier unten definieren Sie die slots ausgelöst werden. Sollten Sie schmücken Sie mit dem @ – pyqtSlot() decorator. Es würde die Arbeit auch ohne den Dekorator dargestellt werden (mehr info in der Dokumentation Seite).

    import sys
    import designer
    
    from PyQt4 import QtGui, QtCore
    
    
    class SampleApp(QtGui.QWidget):
    
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self,parent)
            self.ui = designer.Ui_Dialog()
            self.ui.setupUi(self)
    
        @QtCore.pyqtSlot()
        def reject(self):
            print("reject")
            self.close()
    
        @QtCore.pyqtSlot()
        def accept(self):
            print("accept")
    
        @QtCore.pyqtSlot()
        def apply(self):
            print("apply")
    
    
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        myapp = SampleApp()
        myapp.show()
        sys.exit(app.exec_())

    Hier unten, statt Sie verbinden die clicked Aktion der Schaltflächen, um die slots, die Sie definiert sich hier. Beachten Sie, dass für Close und Ok das war nicht wirklich notwendig, da bei der Verwendung von StandardButtons PyQt und automatisch verbinden Sie mit den Standard-Aktionen, wenn nicht angegeben ist, die durch den Programmierer. Obwohl ich die Verbindung manuell, so dass Sie die Idee von, was Los ist.

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'designer.ui'
    #
    # Created by: PyQt4 UI code generator 4.11.4
    #
    # WARNING! All changes made in this file will be lost!
    
    from PyQt4 import QtCore, QtGui
    
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
    
    try:
        _encoding = QtGui.QApplication.UnicodeUTF8
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig, _encoding)
    except AttributeError:
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig)
    
    class Ui_Dialog(object):
    
        def setupUi(self, Dialog):
            Dialog.setObjectName(_fromUtf8("Dialog"))
            Dialog.resize(554, 399)
            self.buttonBox = QtGui.QDialogButtonBox(Dialog)
            self.buttonBox.setGeometry(QtCore.QRect(190, 340, 341, 32))
            self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
            self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Apply|QtGui.QDialogButtonBox.Close|QtGui.QDialogButtonBox.Ok)
            self.buttonBox.setCenterButtons(False)
            self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
    
            self.retranslateUi(Dialog)
    
            self.buttonBox.button(QtGui.QDialogButtonBox.Close).clicked.connect(Dialog.reject)
            self.buttonBox.button(QtGui.QDialogButtonBox.Ok).clicked.connect(Dialog.accept)
            self.buttonBox.button(QtGui.QDialogButtonBox.Apply).clicked.connect(Dialog.apply)
    
        def retranslateUi(self, Dialog):
            Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
    • Danke, werde ich Lesen, bis auf den rest verstehe Ihre Antwort, aber eine Frage: Mein Verständnis ist, dass ich sollte nicht ändern Sie die „PyQt4-UI code-generator 4.11.4“ erzeugt code, wie es wird sich ändern, wenn ich mein UI. Habe ich das falsch verstanden?
    • Ja, gut, Sie können das gleiche tun, ohne änderung des Codes. In Ihrem SampleApp – Klasse, erhalten Sie die Referenz auf das QPushButton „Übernehmen“ in der gleichen Art und Weise habe ich innerhalb Ui_Dialog, und befestigen Sie die clicked signal an den slot.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.