python3+PyQt5+Qt Designer实现扩展对话框


Posted in Python onApril 20, 2018

本文是对《Python Qt GUI快速编程》的第9章的扩展对话框例子Find and replace用Python3+PyQt5+Qt Designer进行改写。

第一部分无借用Qt Designer,完全用代码实现。
第二部分则借用Qt Designer,快速实现。

第一部分:

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¬es "
             "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_()

第二部分:

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

运行结果:

python3+PyQt5+Qt Designer实现扩展对话框

python3+PyQt5+Qt Designer实现扩展对话框

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈配置OpenCV3 + Python3的简易方法(macOS)
Apr 02 Python
Python实现确认字符串是否包含指定字符串的实例
May 02 Python
实践Vim配置python开发环境
Jul 02 Python
python pandas读取csv后,获取列标签的方法
Nov 12 Python
Python 判断奇数偶数的方法
Dec 20 Python
python 自定义对象的打印方法
Jan 12 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 Python
Python基于百度AI实现OCR文字识别
Apr 02 Python
Django-migrate报错问题解决方案
Apr 21 Python
Python Scrapy图片爬取原理及代码实例
Jun 12 Python
如何使用PyCharm引入需要使用的包的方法
Sep 22 Python
Python制作简单的剪刀石头布游戏
Dec 10 Python
pandas获取groupby分组里最大值所在的行方法
Apr 20 #Python
pandas多级分组实现排序的方法
Apr 20 #Python
Python PyQt4实现QQ抽屉效果
Apr 20 #Python
Python在groupby分组后提取指定位置记录方法
Apr 20 #Python
PyQt实现界面翻转切换效果
Apr 20 #Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
Apr 20 #Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 #Python
You might like
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
基于PHP常用函数的用法详解
2013/05/10 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
PHP安全上传图片的方法
2015/03/21 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
弹出广告特效(一个IP只弹出一次)的代码
2007/07/27 Javascript
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
2011/03/12 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
Extjs中使用extend(js继承) 的代码
2012/03/15 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
老生常谈Bootstrap媒体对象
2017/07/06 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
[53:15]Mineski vs iG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
解决python "No module named pip" 的问题
2018/10/13 Python
在python中实现强制关闭线程的示例
2019/01/22 Python
python 寻找离散序列极值点的方法
2019/07/10 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
Python enumerate内置库用法解析
2020/02/24 Python
python适合做数据挖掘吗
2020/06/16 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
python try...finally...的实现方法
2020/11/25 Python
民间个人借款协议书
2014/09/30 职场文书
2016学习医德医风心得体会
2016/01/25 职场文书
JavaScript的function函数详细介绍
2021/11/20 Javascript