Heim  >  Artikel  >  Backend-Entwicklung  >  Python3+PyQt5+Qt Designer implementiert erweitertes Dialogfeld

Python3+PyQt5+Qt Designer implementiert erweitertes Dialogfeld

不言
不言Original
2018-04-20 13:36:263402Durchsuche

Dieser Artikel stellt hauptsächlich Python3+PyQt5+Qt Designer vor, um das erweiterte Dialogfeld im Detail zu implementieren. Es hat einen bestimmten Referenzwert.

Dieser Artikel ist eine Rezension von „Python Qt The Beispiel für ein erweitertes Dialogfeld „Suchen und Ersetzen“ in Kapitel 9 von „GUI Rapid Programming“ wurde mit Python3+PyQt5+Qt Designer neu geschrieben.

Der erste Teil lehnt sich nicht an Qt Designer an, sondern ist vollständig im Code implementiert.
Der zweite Teil ist mit Qt Designer schnell umgesetzt.

Teil eins:


import sys
from PyQt5.QtCore import Qt,pyqtSignal
from PyQt5.QtWidgets import (QApplication, QCheckBox, QDialog, QFrame,
    QGridLayout, QHBoxLayout, QLabel, QLayout, QLineEdit,
    QPushButton, QVBoxLayout)



class FindAndReplaceDlg(QDialog):
  find = pyqtSignal(str,bool,bool,bool,bool,bool)
  replace = pyqtSignal(str,str,bool,bool,bool,bool,bool)   

  def __init__(self, parent=None):
    super(FindAndReplaceDlg, self).__init__(parent)

    findLabel = QLabel("Find &what:")
    self.findLineEdit = QLineEdit()
    findLabel.setBuddy(self.findLineEdit)
    replaceLabel = QLabel("Replace w&ith:")
    self.replaceLineEdit = QLineEdit()
    replaceLabel.setBuddy(self.replaceLineEdit)
    self.caseCheckBox = QCheckBox("&Case sensitive")
    self.wholeCheckBox = QCheckBox("Wh&ole words")
    self.wholeCheckBox.setChecked(True)
    self.moreFrame = QFrame()
    self.moreFrame.setFrameStyle(QFrame.StyledPanel|QFrame.Sunken)
    self.backwardsCheckBox = QCheckBox("Search &Backwards")
    self.regexCheckBox = QCheckBox("Regular E&xpression")
    self.ignoreNotesCheckBox = QCheckBox("Ignore foot&notes "
                          "and endnotes")
    line = QFrame()
    line.setFrameStyle(QFrame.VLine|QFrame.Sunken)
    self.findButton = QPushButton("&Find")
    self.replaceButton = QPushButton("&Replace")
    closeButton = QPushButton("Close")
    self.moreButton = QPushButton("&More")
    self.moreButton.setCheckable(True)


    gridLayout = QGridLayout()
    gridLayout.addWidget(findLabel, 0, 0)
    gridLayout.addWidget(self.findLineEdit, 0, 1)
    gridLayout.addWidget(replaceLabel, 1, 0)
    gridLayout.addWidget(self.replaceLineEdit, 1, 1)
    frameLayout = QVBoxLayout()
    frameLayout.addWidget(self.backwardsCheckBox)
    frameLayout.addWidget(self.regexCheckBox)
    frameLayout.addWidget(self.ignoreNotesCheckBox)
    self.moreFrame.setLayout(frameLayout)
    leftLayout = QVBoxLayout()
    leftLayout.addLayout(gridLayout)
    leftLayout.addWidget(self.caseCheckBox)
    leftLayout.addWidget(self.wholeCheckBox)
    leftLayout.addWidget(self.moreFrame)
    buttonLayout = QVBoxLayout()
    buttonLayout.addWidget(self.findButton)
    buttonLayout.addWidget(self.replaceButton)
    buttonLayout.addWidget(closeButton)
    buttonLayout.addWidget(self.moreButton)
    buttonLayout.addStretch()
    mainLayout = QHBoxLayout()
    mainLayout.addLayout(leftLayout)
    mainLayout.addWidget(line)
    mainLayout.addLayout(buttonLayout)
    self.setLayout(mainLayout)

    self.moreFrame.hide()
    mainLayout.setSizeConstraint(QLayout.SetFixedSize)

    self.moreButton.toggled[bool].connect(self.setvisible)


    self.findLineEdit.textEdited.connect(self.updateUi)
    self.findButton.clicked.connect(self.findClicked)
    self.replaceButton.clicked.connect(self.replaceClicked)

    self.updateUi()
    self.setWindowTitle("Find and Replace")

  def setvisible(self,YN):
    self.moreFrame.setVisible(YN)


  def findClicked(self):
    self.find.emit(self.findLineEdit.text(),
        self.caseCheckBox.isChecked(),
        self.wholeCheckBox.isChecked(),
        self.backwardsCheckBox.isChecked(),
        self.regexCheckBox.isChecked(),
        self.ignoreNotesCheckBox.isChecked())


  def replaceClicked(self):
    self.replace.emit(self.findLineEdit.text(),
        self.replaceLineEdit.text(),
        self.caseCheckBox.isChecked(),
        self.wholeCheckBox.isChecked(),
        self.backwardsCheckBox.isChecked(),
        self.regexCheckBox.isChecked(),
        self.ignoreNotesCheckBox.isChecked())


  def updateUi(self):
    enable = self.findLineEdit.text()
    self.findButton.setEnabled(bool(enable))
    self.replaceButton.setEnabled(bool(enable))


if __name__ == "__main__":

  def find(what, *args):
    print("Find {0} {1}".format(what, [x for x in args]))

  def replace(old, new, *args):
    print("Replace {0} with {1} {2}".format(
       old, new, [x for x in args]))

  app = QApplication(sys.argv)
  form = FindAndReplaceDlg()
  form.find.connect(find)
  form.replace.connect(replace)    
  form.show()
  app.exec_()


Teil zwei:

/home/yrd/eric_workspace/chap09/findandreplacedlg/Ui_findandreplacedlg.py


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

# Form implementation generated from reading ui file '/home/yrd/eric_workspace/chap09/findandreplacedlg/findandreplacedlg.ui'
#
# Created by: PyQt5 UI code generator 5.7
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_FindAndReplaceDlg(object):
  def setupUi(self, FindAndReplaceDlg):
    FindAndReplaceDlg.setObjectName("FindAndReplaceDlg")
    FindAndReplaceDlg.resize(355, 274)
    self.mainlayout = QtWidgets.QHBoxLayout(FindAndReplaceDlg)
    self.mainlayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
    self.mainlayout.setContentsMargins(9, 9, 9, 9)
    self.mainlayout.setSpacing(6)
    self.mainlayout.setObjectName("mainlayout")
    self.vboxlayout = QtWidgets.QVBoxLayout()
    self.vboxlayout.setContentsMargins(0, 0, 0, 0)
    self.vboxlayout.setSpacing(6)
    self.vboxlayout.setObjectName("vboxlayout")
    self.gridlayout = QtWidgets.QGridLayout()
    self.gridlayout.setContentsMargins(0, 0, 0, 0)
    self.gridlayout.setSpacing(6)
    self.gridlayout.setObjectName("gridlayout")
    self.replaceLineEdit = QtWidgets.QLineEdit(FindAndReplaceDlg)
    self.replaceLineEdit.setObjectName("replaceLineEdit")
    self.gridlayout.addWidget(self.replaceLineEdit, 1, 1, 1, 1)
    self.findLineEdit = QtWidgets.QLineEdit(FindAndReplaceDlg)
    self.findLineEdit.setObjectName("findLineEdit")
    self.gridlayout.addWidget(self.findLineEdit, 0, 1, 1, 1)
    self.label_2 = QtWidgets.QLabel(FindAndReplaceDlg)
    self.label_2.setObjectName("label_2")
    self.gridlayout.addWidget(self.label_2, 1, 0, 1, 1)
    self.label = QtWidgets.QLabel(FindAndReplaceDlg)
    self.label.setObjectName("label")
    self.gridlayout.addWidget(self.label, 0, 0, 1, 1)
    self.vboxlayout.addLayout(self.gridlayout)
    self.vboxlayout1 = QtWidgets.QVBoxLayout()
    self.vboxlayout1.setContentsMargins(0, 0, 0, 0)
    self.vboxlayout1.setSpacing(6)
    self.vboxlayout1.setObjectName("vboxlayout1")
    self.caseCheckBox = QtWidgets.QCheckBox(FindAndReplaceDlg)
    self.caseCheckBox.setObjectName("caseCheckBox")
    self.vboxlayout1.addWidget(self.caseCheckBox)
    self.wholeCheckBox = QtWidgets.QCheckBox(FindAndReplaceDlg)
    self.wholeCheckBox.setChecked(True)
    self.wholeCheckBox.setObjectName("wholeCheckBox")
    self.vboxlayout1.addWidget(self.wholeCheckBox)
    self.vboxlayout.addLayout(self.vboxlayout1)
    spacerItem = QtWidgets.QSpacerItem(231, 16, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
    self.vboxlayout.addItem(spacerItem)
    self.moreFrame = QtWidgets.QFrame(FindAndReplaceDlg)
    self.moreFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
    self.moreFrame.setFrameShadow(QtWidgets.QFrame.Raised)
    self.moreFrame.setObjectName("moreFrame")
    self.vboxlayout2 = QtWidgets.QVBoxLayout(self.moreFrame)
    self.vboxlayout2.setContentsMargins(9, 9, 9, 9)
    self.vboxlayout2.setSpacing(6)
    self.vboxlayout2.setObjectName("vboxlayout2")
    self.backwardsCheckBox = QtWidgets.QCheckBox(self.moreFrame)
    self.backwardsCheckBox.setObjectName("backwardsCheckBox")
    self.vboxlayout2.addWidget(self.backwardsCheckBox)
    self.regexCheckBox = QtWidgets.QCheckBox(self.moreFrame)
    self.regexCheckBox.setObjectName("regexCheckBox")
    self.vboxlayout2.addWidget(self.regexCheckBox)
    self.ignoreNotesCheckBox = QtWidgets.QCheckBox(self.moreFrame)
    self.ignoreNotesCheckBox.setObjectName("ignoreNotesCheckBox")
    self.vboxlayout2.addWidget(self.ignoreNotesCheckBox)
    self.vboxlayout.addWidget(self.moreFrame)
    self.mainlayout.addLayout(self.vboxlayout)
    self.line = QtWidgets.QFrame(FindAndReplaceDlg)
    self.line.setFrameShape(QtWidgets.QFrame.VLine)
    self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
    self.line.setObjectName("line")
    self.mainlayout.addWidget(self.line)
    self.vboxlayout3 = QtWidgets.QVBoxLayout()
    self.vboxlayout3.setContentsMargins(0, 0, 0, 0)
    self.vboxlayout3.setSpacing(6)
    self.vboxlayout3.setObjectName("vboxlayout3")
    self.findButton = QtWidgets.QPushButton(FindAndReplaceDlg)
    self.findButton.setFocusPolicy(QtCore.Qt.NoFocus)
    self.findButton.setObjectName("findButton")
    self.vboxlayout3.addWidget(self.findButton)
    self.replaceButton = QtWidgets.QPushButton(FindAndReplaceDlg)
    self.replaceButton.setFocusPolicy(QtCore.Qt.NoFocus)
    self.replaceButton.setObjectName("replaceButton")
    self.vboxlayout3.addWidget(self.replaceButton)
    self.closeButton = QtWidgets.QPushButton(FindAndReplaceDlg)
    self.closeButton.setFocusPolicy(QtCore.Qt.NoFocus)
    self.closeButton.setObjectName("closeButton")
    self.vboxlayout3.addWidget(self.closeButton)
    self.moreButton = QtWidgets.QPushButton(FindAndReplaceDlg)
    self.moreButton.setFocusPolicy(QtCore.Qt.NoFocus)
    self.moreButton.setCheckable(True)
    self.moreButton.setObjectName("moreButton")
    self.vboxlayout3.addWidget(self.moreButton)
    spacerItem1 = QtWidgets.QSpacerItem(21, 16, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
    self.vboxlayout3.addItem(spacerItem1)
    self.mainlayout.addLayout(self.vboxlayout3)
    self.label_2.setBuddy(self.replaceLineEdit)
    self.label.setBuddy(self.findLineEdit)

    self.retranslateUi(FindAndReplaceDlg)
    self.closeButton.clicked.connect(FindAndReplaceDlg.reject)
    self.moreButton.toggled['bool'].connect(self.moreFrame.setVisible)
    QtCore.QMetaObject.connectSlotsByName(FindAndReplaceDlg)
    FindAndReplaceDlg.setTabOrder(self.findLineEdit, self.replaceLineEdit)
    FindAndReplaceDlg.setTabOrder(self.replaceLineEdit, self.caseCheckBox)
    FindAndReplaceDlg.setTabOrder(self.caseCheckBox, self.wholeCheckBox)
    FindAndReplaceDlg.setTabOrder(self.wholeCheckBox, self.backwardsCheckBox)
    FindAndReplaceDlg.setTabOrder(self.backwardsCheckBox, self.regexCheckBox)
    FindAndReplaceDlg.setTabOrder(self.regexCheckBox, self.ignoreNotesCheckBox)

  def retranslateUi(self, FindAndReplaceDlg):
    _translate = QtCore.QCoreApplication.translate
    FindAndReplaceDlg.setWindowTitle(_translate("FindAndReplaceDlg", "Find and Replace"))
    self.label_2.setText(_translate("FindAndReplaceDlg", "Replace w&ith:"))
    self.label.setText(_translate("FindAndReplaceDlg", "Find &what:"))
    self.caseCheckBox.setText(_translate("FindAndReplaceDlg", "&Case sensitive"))
    self.wholeCheckBox.setText(_translate("FindAndReplaceDlg", "Wh&ole words"))
    self.backwardsCheckBox.setText(_translate("FindAndReplaceDlg", "Search &Backwards"))
    self.regexCheckBox.setText(_translate("FindAndReplaceDlg", "Regular E&xpression"))
    self.ignoreNotesCheckBox.setText(_translate("FindAndReplaceDlg", "Ignore foot&notes and endnotes"))
    self.findButton.setText(_translate("FindAndReplaceDlg", "&Find"))
    self.replaceButton.setText(_translate("FindAndReplaceDlg", "&Replace"))
    self.closeButton.setText(_translate("FindAndReplaceDlg", "Close"))
    self.moreButton.setText(_translate("FindAndReplaceDlg", "&More"))


/ home /yrd/eric_workspace/chap09/findandreplacedlg/findandreplacedlg.py


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

"""
Module implementing FindAndReplaceDlg.
"""

from PyQt5.QtCore import pyqtSlot,pyqtSignal
from PyQt5.QtWidgets import QDialog,QApplication

from Ui_findandreplacedlg import Ui_FindAndReplaceDlg


class FindAndReplaceDlg(QDialog, Ui_FindAndReplaceDlg):
  """
  Class documentation goes here.
  """
  find = pyqtSignal(str,bool,bool,bool,bool,bool)
  replace = pyqtSignal(str,str,bool,bool,bool,bool,bool)   
  def __init__(self, parent=None):
    """
    Constructor

    @param parent reference to the parent widget
    @type QWidget
    """
    super(FindAndReplaceDlg, self).__init__(parent)
    self.setupUi(self)
    self.moreFrame.hide()
    #self.layout().setSizeConstraint(QLayout.SetFixedSize)
    self.updateUi()    

  @pyqtSlot(str)
  def on_findLineEdit_textEdited(self, text):
    """
    Slot documentation goes here.

    @param p0 DESCRIPTION
    @type str
    """
    # TODO: not implemented yet
    self.updateUi()

  @pyqtSlot()
  def on_findButton_clicked(self):
    self.find.emit(self.findLineEdit.text(),
            self.caseCheckBox.isChecked(),
            self.wholeCheckBox.isChecked(),
            self.backwardsCheckBox.isChecked(),
            self.regexCheckBox.isChecked(),
            self.ignoreNotesCheckBox.isChecked())    


  @pyqtSlot()
  def on_replaceButton_clicked(self):
    self.replace.emit(self.findLineEdit.text(),
             self.replaceLineEdit.text(),
             self.caseCheckBox.isChecked(),
             self.wholeCheckBox.isChecked(),
             self.backwardsCheckBox.isChecked(),
             self.regexCheckBox.isChecked(),
             self.ignoreNotesCheckBox.isChecked())

  def updateUi(self):
    enable = self.findLineEdit.text()
    self.findButton.setEnabled(bool(enable))
    self.replaceButton.setEnabled(bool(enable))

if __name__ == "__main__":
  import sys

  def find(what, *args):
    print("Find {0} {1}".format(what, [x for x in args]))

  def replace(old, new, *args):
    print("Replace {0} with {1} {2}".format(
       old, new, [x for x in args]))

  app = QApplication(sys.argv)
  form = FindAndReplaceDlg()
  form.find.connect(find)
  form.replace.connect(replace)
  form.show()
  app.exec_()


Laufergebnis:

Verwandte Empfehlungen:

hasattr(), getattr(), setattr(), delattr() Funktionen in Python3 und Beispielcode


Das obige ist der detaillierte Inhalt vonPython3+PyQt5+Qt Designer implementiert erweitertes Dialogfeld. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:CURD-Operation von yiiNächster Artikel:CURD-Operation von yii