Home  >  Article  >  Backend Development  >  python3+PyQt5+Qt Designer implements extended dialog box

python3+PyQt5+Qt Designer implements extended dialog box

不言
不言Original
2018-04-20 13:36:263403browse

This article mainly introduces the extension dialog box implemented by python3 PyQt5 Qt Designer in detail. It has certain reference value. Interested friends can refer to it.

This article is a review of "Python Qt GUI Quick The extended dialog box example Find and replace in Chapter 9 of "Programming" is rewritten using Python3 PyQt5 Qt Designer.

The first part does not borrow Qt Designer and is completely implemented in code.
The second part uses Qt Designer to implement quickly.

Part one:


##

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_()


Part two:

/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_()


Run result:

Related recommendations:


hasattr(), getattr(), setattr(), delattr() functions and sample codes in Python3


The above is the detailed content of python3+PyQt5+Qt Designer implements extended dialog box. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:CURD operation of yiiNext article:CURD operation of yii