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 相关文章推荐
python进阶教程之模块(module)介绍
Aug 30 Python
跟老齐学Python之有容乃大的list(2)
Sep 15 Python
使用Python的PEAK来适配协议的教程
Apr 14 Python
Python中的异常处理相关语句基础学习笔记
Jul 11 Python
python生成二维码的实例详解
Oct 29 Python
python自动化报告的输出用例详解
May 30 Python
PyCharm 设置SciView工具窗口的方法
Jan 15 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
Jun 18 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
Python爬虫headers处理及网络超时问题解决方案
Jun 19 Python
Java Unsafe类实现原理及测试代码
Sep 15 Python
Python实现中英文全文搜索的示例
Dec 04 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
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
php实现memcache缓存示例讲解
2013/12/04 PHP
php+js实现异步图片上传实例分享
2014/06/02 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
javascript 框架小结 个人工作经验
2009/06/13 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
webpack打包js的方法
2018/03/12 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
js实现复制粘贴的两种方法
2020/12/04 Javascript
[02:33]2014DOTA2 TI每日综述 LGD涉险晋级DK闯入胜者组
2014/07/14 DOTA
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python实现可将字符转换成大写的tcp服务器实例
2015/04/29 Python
Python list操作用法总结
2015/11/10 Python
python自动化生成IOS的图标
2018/11/13 Python
Python实现简单查找最长子串功能示例
2019/02/26 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
python如何调用java类
2020/07/05 Python
JINS眼镜官方网站:日本最大的眼镜邮购
2016/10/14 全球购物
英国假发网站:Hothair
2018/02/23 全球购物
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
后勤人员自我鉴定
2013/10/20 职场文书
银行服务感言
2014/03/01 职场文书
献爱心活动总结
2014/05/07 职场文书
校园安全演讲稿
2014/05/09 职场文书
教育合作协议范本
2014/10/17 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
升学宴答谢词
2015/01/05 职场文书
《折线统计图》教学反思
2016/02/22 职场文书