PyQt5 Qt Designer 新手教程(三)—— 对话框的最终实现

PyQt5 Qt Designer 新手教程(三)—— 对话框的最终实现

教程博文

一、前言

上一节,我们用 Qt Designer 搭建了简易对话框窗体,那么这一节就是让对话框真正的成为一个窗口程序,并实现一定的功能。

二、把 .ui 文件转换为 py 文件

.ui 文件是 Qt Designer 的保存文件,是让它识别的;但是,对于 Python 来说,它还不认识,所以要把这个 .ui 文件转化为 .py 模块文件,再导入到自己的程序中,最终即可实现窗体功能。
在 CMD 中输入类似 pyuic5 -o C:\Users\hp\Desktop\example\ui_newimagedlg.py C:\Users\hp\Desktop\example\newimagedlg.ui
即可:
在这里插入图片描述
参考博文:PyQt5 处理 .ui 与 .qrc 文件的操作记录

下面是 ui_findandreplacedlg.py的实际内容,可以参考:

# -*- coding: utf-8 -*-
#
# Created by: PyQt5 UI code generator 5.11.2
#
# 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(396, 192)
        self.hboxlayout = QtWidgets.QHBoxLayout(FindAndReplaceDlg)
        self.hboxlayout.setContentsMargins(9, 9, 9, 9)
        self.hboxlayout.setSpacing(6)
        self.hboxlayout.setObjectName("hboxlayout")
        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.hboxlayout1 = QtWidgets.QHBoxLayout()
        self.hboxlayout1.setContentsMargins(0, 0, 0, 0)
        self.hboxlayout1.setSpacing(6)
        self.hboxlayout1.setObjectName("hboxlayout1")
        self.caseCheckBox = QtWidgets.QCheckBox(FindAndReplaceDlg)
        self.caseCheckBox.setObjectName("caseCheckBox")
        self.hboxlayout1.addWidget(self.caseCheckBox)
        self.wholeCheckBox = QtWidgets.QCheckBox(FindAndReplaceDlg)
        self.wholeCheckBox.setChecked(False)
        self.wholeCheckBox.setObjectName("wholeCheckBox")
        self.hboxlayout1.addWidget(self.wholeCheckBox)
        self.vboxlayout.addLayout(self.hboxlayout1)
        self.hboxlayout2 = QtWidgets.QHBoxLayout()
        self.hboxlayout2.setContentsMargins(0, 0, 0, 0)
        self.hboxlayout2.setSpacing(6)
        self.hboxlayout2.setObjectName("hboxlayout2")
        self.label_3 = QtWidgets.QLabel(FindAndReplaceDlg)
        self.label_3.setObjectName("label_3")
        self.hboxlayout2.addWidget(self.label_3)
        self.syntaxComboBox = QtWidgets.QComboBox(FindAndReplaceDlg)
        self.syntaxComboBox.setObjectName("syntaxComboBox")
        self.syntaxComboBox.addItem("")
        self.syntaxComboBox.addItem("")
        self.hboxlayout2.addWidget(self.syntaxComboBox)
        self.vboxlayout.addLayout(self.hboxlayout2)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.vboxlayout.addItem(spacerItem)
        self.hboxlayout.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.hboxlayout.addWidget(self.line)
        self.vboxlayout1 = QtWidgets.QVBoxLayout()
        self.vboxlayout1.setContentsMargins(0, 0, 0, 0)
        self.vboxlayout1.setSpacing(6)
        self.vboxlayout1.setObjectName("vboxlayout1")
        self.findButton = QtWidgets.QPushButton(FindAndReplaceDlg)
        self.findButton.setObjectName("findButton")
        self.vboxlayout1.addWidget(self.findButton)
        self.replaceButton = QtWidgets.QPushButton(FindAndReplaceDlg)
        self.replaceButton.setObjectName("replaceButton")
        self.vboxlayout1.addWidget(self.replaceButton)
        self.replaceAllButton = QtWidgets.QPushButton(FindAndReplaceDlg)
        self.replaceAllButton.setObjectName("replaceAllButton")
        self.vboxlayout1.addWidget(self.replaceAllButton)
        spacerItem1 = QtWidgets.QSpacerItem(20, 16, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.vboxlayout1.addItem(spacerItem1)
        self.closeButton = QtWidgets.QPushButton(FindAndReplaceDlg)
        self.closeButton.setObjectName("closeButton")
        self.vboxlayout1.addWidget(self.closeButton)
        self.hboxlayout.addLayout(self.vboxlayout1)
        self.label_2.setBuddy(self.replaceLineEdit)
        self.label.setBuddy(self.findLineEdit)
        self.label_3.setBuddy(self.syntaxComboBox)

        self.retranslateUi(FindAndReplaceDlg)
        self.closeButton.clicked.connect(FindAndReplaceDlg.reject)
        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.syntaxComboBox)
        FindAndReplaceDlg.setTabOrder(self.syntaxComboBox, self.findButton)
        FindAndReplaceDlg.setTabOrder(self.findButton, self.replaceButton)
        FindAndReplaceDlg.setTabOrder(self.replaceButton, self.replaceAllButton)
        FindAndReplaceDlg.setTabOrder(self.replaceAllButton, self.closeButton)

    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.label_3.setText(_translate("FindAndReplaceDlg", "&Syntax:"))
        self.syntaxComboBox.setItemText(0, _translate("FindAndReplaceDlg", "Literal text"))
        self.syntaxComboBox.setItemText(1, _translate("FindAndReplaceDlg", "Regular expression"))
        self.findButton.setText(_translate("FindAndReplaceDlg", "&Find"))
        self.replaceButton.setText(_translate("FindAndReplaceDlg", "&Replace"))
        self.replaceAllButton.setText(_translate("FindAndReplaceDlg", "Replace &All"))
        self.closeButton.setText(_translate("FindAndReplaceDlg", "Close"))

三、导入窗体模块文件

窗体导入

import re
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import ui_findandreplacedlg

窗体继承与创建

class FindAndReplaceDlg(QDialog, 
                        ui_findandreplacedlg.Ui_FindAndReplaceDlg):
    found = pyqtSignal(int)
    notfound = pyqtSignal(int)
    def __init__(self, text, parent=None):
        super(FindAndReplaceDlg, self).__init__(parent)
        self.__text = text
        self.__index = 0
        self.setupUi(self)
        if not MAC:
            self.findButton.setFocusPolicy(Qt.NoFocus)          

(补充:
① 我们会从 QDialogUi_FindAndReplaceDlg继承。在 Python 编程中,我们很少需要用到多重继承,不过这里用的话会要比不用让事情变得简单得多。这样,子类 FindAndReplaceDlg就会成为它所继承的两个类的联合体,也就可以直接访问它们的各个属性,当然记得在前面加上 self

② 之前的设置已让初始化程序可以接受对话框处理的数据,也可以接受一个父窗口对象。对第一个继承类 QDialog会调用 super()

③ 这里对 setupUi()方法的调用是之前没怎么见过的东西。这个方法由生成模块提供。调用它之后,会创建用户界面文件中给定的全部窗口部件,根据设计布局各个窗口部件,设置其属性和 Tab 键次序,并设置各个连接。换句话说,会重新创建我们在 Qt 设计师中所设计的窗体。)

信号-槽连接

@pyqtSlot(str)
    def on_findLineEdit_textEdited(self, text):
        self.__index = 0
        self.updateUi()

(补充:setupUi()方法会调用 QtCore .QMetaObject.connectSlotsByName(),这是一个静态方法,会在窗体窗口部件的各个信号和我们那个使用了特定命名规范的子类方法之间创建一些信号槽连接。窗体中任何 on_widgetName_ signalName形式的方法名,都会用窗口部件的信号与之相连接
比如:窗体中有个名叫 findLineEditQLineEdit型窗口部件。由 QLineEdit发射的其中一个信号textEdited(str)。所以,如果打算连接这个信号,而不在初始化程序中调用connect()方法,就可以将相应工作留给 setupUi()。在调用这个打算让信号连接的槽的期间,使用 on_findLineEdit_textEdited的这种方法都可以正常工作。这就是用在窗体的所有连接中的方法,除了在 Qt 设计师中通过可视化方式把 Close 按钮的 clicked()信号进行连接之外。)

模块测试

if __name__ == "__main__":
    import sys

    text = """US experience shows that, unlike traditional patents,
software patents do not encourage innovation and R&D, quite the
contrary. In particular they hurt small and medium-sized enterprises
and generally newcomers in the market. They will just weaken the market
and increase spending on patents and litigation, at the expense of
technological innovation and research. Especially dangerous are
attempts to abuse the patent system by preventing interoperability as a
means of avoiding competition with technological ability.
--- Extract quoted from Linus Torvalds and Alan Cox's letter
to the President of the European Parliament
http://www.effi.org/patentit/patents_torvalds_cox.html"""

    def found(where):
        print("Found at {}".format(where))

    def nomore():
        print("No more found")
        
    app = QApplication(sys.argv)
    form = FindAndReplaceDlg(text)
    form.found.connect(found)
    form.notfound.connect(nomore)
    form.show()
    app.exec_()
    print(form.text())

(补充:由于任何 PyQt 窗口部件,包括任何对话框,都能以其适当的方式用做顶层窗口,通过对其初始化和开始事件循环的方式就可以轻松实现对话框的测试。通常来说,尽管还需要再做些事情。例如,为了能够看到它们能否正确工作,或许还需要设置一此 初始数据,或者提供一些接受对话框信号的方法。)

四、完整代码

这里放出所有代码,包括窗体逻辑程序(findandreplace.py)、窗体框架程序(ui_findandreplacedlg.py)以及窗体框架源文件(findandreplacedlg.ui)。
相信大家,不管哪一步出错,都可以把目标进行下去。(备注:代码可能有 BUG,因为是从 PyQt4 改写为 PyQt5 的代码。作者测试通过。)

findandreplace.py

import re
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import ui_findandreplacedlg

MAC = True
try:
    from PyQt5.QtGui import qt_mac_set_native_menubar
except ImportError:
    MAC = False


class FindAndReplaceDlg(QDialog,
        ui_findandreplacedlg.Ui_FindAndReplaceDlg):
    found = pyqtSignal(int)
    notfound = pyqtSignal(int)
    def __init__(self, text, parent=None):
        super(FindAndReplaceDlg, self).__init__(parent)
        self.__text = text
        self.__index = 0
        self.setupUi(self)
        if not MAC:
            self.findButton.setFocusPolicy(Qt.NoFocus)
            self.replaceButton.setFocusPolicy(Qt.NoFocus)
            self.replaceAllButton.setFocusPolicy(Qt.NoFocus)
            self.closeButton.setFocusPolicy(Qt.NoFocus)
        self.updateUi()


    @pyqtSlot(str)
    def on_findLineEdit_textEdited(self, text):
        self.__index = 0
        self.updateUi()


    def makeRegex(self):
        findText = self.findLineEdit.text()
        if findText == '*':
            findText = '.*'
        if self.syntaxComboBox.currentText() == "Literal":
            findText = re.escape(findText)
        flags = re.MULTILINE|re.DOTALL|re.UNICODE
        if not self.caseCheckBox.isChecked():
            flags |= re.IGNORECASE
        if self.wholeCheckBox.isChecked():
            findText = r"\b{}\b".format(findText)
        return re.compile(findText, flags)



    @pyqtSlot(bool)
    def on_findButton_clicked(self):
        regex = self.makeRegex()
        match = regex.search(self.__text, self.__index)
        if match is not None:
            self.__index = match.end()
            self.found.emit(match.start())
        else:
            self.notfound.emit(-1)
        
        
    @pyqtSlot(bool)
    def on_replaceButton_clicked(self):
        regex = self.makeRegex()
        self.__text = regex.sub(self.replaceLineEdit.text(),
                                self.__text, 1)
        

    @pyqtSlot(bool)
    def on_replaceAllButton_clicked(self):
        regex = self.makeRegex()
        self.__text = regex.sub(self.replaceLineEdit.text(),
                                self.__text)
        

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


    def text(self):
        return self.__text


if __name__ == "__main__":
    import sys

    text = """US experience shows that, unlike traditional patents,
software patents do not encourage innovation and R&D, quite the
contrary. In particular they hurt small and medium-sized enterprises
and generally newcomers in the market. They will just weaken the market
and increase spending on patents and litigation, at the expense of
technological innovation and research. Especially dangerous are
attempts to abuse the patent system by preventing interoperability as a
means of avoiding competition with technological ability.
--- Extract quoted from Linus Torvalds and Alan Cox's letter
to the President of the European Parliament
http://www.effi.org/patentit/patents_torvalds_cox.html"""

    def found(where):
        print("Found at {}".format(where))

    def nomore():
        print("No more found")
        
    app = QApplication(sys.argv)
    form = FindAndReplaceDlg(text)
    form.found.connect(found)
    form.notfound.connect(nomore)
    form.show()
    app.exec_()
    print(form.text())

ui_findandreplacedlg.py

# -*- coding: utf-8 -*-
#
# Created by: PyQt5 UI code generator 5.11.2
#
# 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(424, 180)
        self.line = QtWidgets.QFrame(FindAndReplaceDlg)
        self.line.setGeometry(QtCore.QRect(297, 9, 20, 161))
        self.line.setFrameShape(QtWidgets.QFrame.VLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.widget = QtWidgets.QWidget(FindAndReplaceDlg)
        self.widget.setGeometry(QtCore.QRect(10, 9, 286, 158))
        self.widget.setObjectName("widget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.label = QtWidgets.QLabel(self.widget)
        self.label.setTextFormat(QtCore.Qt.AutoText)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.findLineEdit = QtWidgets.QLineEdit(self.widget)
        self.findLineEdit.setObjectName("findLineEdit")
        self.gridLayout.addWidget(self.findLineEdit, 0, 1, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.widget)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.replaceLineEdit = QtWidgets.QLineEdit(self.widget)
        self.replaceLineEdit.setObjectName("replaceLineEdit")
        self.gridLayout.addWidget(self.replaceLineEdit, 1, 1, 1, 1)
        self.verticalLayout.addLayout(self.gridLayout)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.caseCheckBox = QtWidgets.QCheckBox(self.widget)
        self.caseCheckBox.setObjectName("caseCheckBox")
        self.horizontalLayout.addWidget(self.caseCheckBox)
        self.wholeCheckBox = QtWidgets.QCheckBox(self.widget)
        self.wholeCheckBox.setChecked(False)
        self.wholeCheckBox.setObjectName("wholeCheckBox")
        self.horizontalLayout.addWidget(self.wholeCheckBox)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_3 = QtWidgets.QLabel(self.widget)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_2.addWidget(self.label_3)
        self.syntaxComboBox = QtWidgets.QComboBox(self.widget)
        self.syntaxComboBox.setObjectName("syntaxComboBox")
        self.syntaxComboBox.addItem("")
        self.syntaxComboBox.addItem("")
        self.horizontalLayout_2.addWidget(self.syntaxComboBox)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem)
        self.widget1 = QtWidgets.QWidget(FindAndReplaceDlg)
        self.widget1.setGeometry(QtCore.QRect(316, 10, 99, 155))
        self.widget1.setObjectName("widget1")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget1)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.findButton = QtWidgets.QPushButton(self.widget1)
        self.findButton.setObjectName("findButton")
        self.verticalLayout_2.addWidget(self.findButton)
        self.replaceButton = QtWidgets.QPushButton(self.widget1)
        self.replaceButton.setObjectName("replaceButton")
        self.verticalLayout_2.addWidget(self.replaceButton)
        self.replaceAllButton = QtWidgets.QPushButton(self.widget1)
        self.replaceAllButton.setObjectName("replaceAllButton")
        self.verticalLayout_2.addWidget(self.replaceAllButton)
        spacerItem1 = QtWidgets.QSpacerItem(20, 13, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
        self.verticalLayout_2.addItem(spacerItem1)
        self.closeButton = QtWidgets.QPushButton(self.widget1)
        self.closeButton.setObjectName("closeButton")
        self.verticalLayout_2.addWidget(self.closeButton)
        self.label.setBuddy(self.findLineEdit)
        self.label_2.setBuddy(self.replaceLineEdit)
        self.label_3.setBuddy(self.syntaxComboBox)

        self.retranslateUi(FindAndReplaceDlg)
        self.closeButton.clicked.connect(FindAndReplaceDlg.reject)
        QtCore.QMetaObject.connectSlotsByName(FindAndReplaceDlg)

    def retranslateUi(self, FindAndReplaceDlg):
        _translate = QtCore.QCoreApplication.translate
        FindAndReplaceDlg.setWindowTitle(_translate("FindAndReplaceDlg", "Find and Replace"))
        self.label.setText(_translate("FindAndReplaceDlg", "Find &what:"))
        self.label_2.setText(_translate("FindAndReplaceDlg", "Replace with:"))
        self.caseCheckBox.setText(_translate("FindAndReplaceDlg", "&Case sensitive"))
        self.wholeCheckBox.setText(_translate("FindAndReplaceDlg", "Wh&ole words"))
        self.label_3.setText(_translate("FindAndReplaceDlg", "&Syntax:"))
        self.syntaxComboBox.setItemText(0, _translate("FindAndReplaceDlg", "Literal text"))
        self.syntaxComboBox.setItemText(1, _translate("FindAndReplaceDlg", "Regular expression"))
        self.findButton.setText(_translate("FindAndReplaceDlg", "&Find"))
        self.replaceButton.setText(_translate("FindAndReplaceDlg", "&Replace"))
        self.replaceAllButton.setText(_translate("FindAndReplaceDlg", "Replace &All"))
        self.closeButton.setText(_translate("FindAndReplaceDlg", "Close"))


findandreplacedlg.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>FindAndReplaceDlg</class>
 <widget class="QDialog" name="FindAndReplaceDlg">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>396</width>
    <height>192</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Find and Replace</string>
  </property>
  <layout class="QHBoxLayout">
   <property name="spacing">
    <number>6</number>
   </property>
   <property name="leftMargin">
    <number>9</number>
   </property>
   <property name="topMargin">
    <number>9</number>
   </property>
   <property name="rightMargin">
    <number>9</number>
   </property>
   <property name="bottomMargin">
    <number>9</number>
   </property>
   <item>
    <layout class="QVBoxLayout">
     <property name="spacing">
      <number>6</number>
     </property>
     <property name="leftMargin">
      <number>0</number>
     </property>
     <property name="topMargin">
      <number>0</number>
     </property>
     <property name="rightMargin">
      <number>0</number>
     </property>
     <property name="bottomMargin">
      <number>0</number>
     </property>
     <item>
      <layout class="QGridLayout">
       <property name="leftMargin">
        <number>0</number>
       </property>
       <property name="topMargin">
        <number>0</number>
       </property>
       <property name="rightMargin">
        <number>0</number>
       </property>
       <property name="bottomMargin">
        <number>0</number>
       </property>
       <property name="spacing">
        <number>6</number>
       </property>
       <item row="1" column="1">
        <widget class="QLineEdit" name="replaceLineEdit"/>
       </item>
       <item row="0" column="1">
        <widget class="QLineEdit" name="findLineEdit"/>
       </item>
       <item row="1" column="0">
        <widget class="QLabel" name="label_2">
         <property name="text">
          <string>Replace w&amp;ith:</string>
         </property>
         <property name="buddy">
          <cstring>replaceLineEdit</cstring>
         </property>
        </widget>
       </item>
       <item row="0" column="0">
        <widget class="QLabel" name="label">
         <property name="text">
          <string>Find &amp;what:</string>
         </property>
         <property name="buddy">
          <cstring>findLineEdit</cstring>
         </property>
        </widget>
       </item>
      </layout>
     </item>
     <item>
      <layout class="QHBoxLayout">
       <property name="spacing">
        <number>6</number>
       </property>
       <property name="leftMargin">
        <number>0</number>
       </property>
       <property name="topMargin">
        <number>0</number>
       </property>
       <property name="rightMargin">
        <number>0</number>
       </property>
       <property name="bottomMargin">
        <number>0</number>
       </property>
       <item>
        <widget class="QCheckBox" name="caseCheckBox">
         <property name="text">
          <string>&amp;Case sensitive</string>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QCheckBox" name="wholeCheckBox">
         <property name="text">
          <string>Wh&amp;ole words</string>
         </property>
         <property name="checked">
          <bool>false</bool>
         </property>
        </widget>
       </item>
      </layout>
     </item>
     <item>
      <layout class="QHBoxLayout">
       <property name="spacing">
        <number>6</number>
       </property>
       <property name="leftMargin">
        <number>0</number>
       </property>
       <property name="topMargin">
        <number>0</number>
       </property>
       <property name="rightMargin">
        <number>0</number>
       </property>
       <property name="bottomMargin">
        <number>0</number>
       </property>
       <item>
        <widget class="QLabel" name="label_3">
         <property name="text">
          <string>&amp;Syntax:</string>
         </property>
         <property name="buddy">
          <cstring>syntaxComboBox</cstring>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QComboBox" name="syntaxComboBox">
         <item>
          <property name="text">
           <string>Literal text</string>
          </property>
         </item>
         <item>
          <property name="text">
           <string>Regular expression</string>
          </property>
         </item>
        </widget>
       </item>
      </layout>
     </item>
     <item>
      <spacer>
       <property name="orientation">
        <enum>Qt::Vertical</enum>
       </property>
       <property name="sizeHint" stdset="0">
        <size>
         <width>20</width>
         <height>40</height>
        </size>
       </property>
      </spacer>
     </item>
    </layout>
   </item>
   <item>
    <widget class="Line" name="line">
     <property name="orientation">
      <enum>Qt::Vertical</enum>
     </property>
    </widget>
   </item>
   <item>
    <layout class="QVBoxLayout">
     <property name="spacing">
      <number>6</number>
     </property>
     <property name="leftMargin">
      <number>0</number>
     </property>
     <property name="topMargin">
      <number>0</number>
     </property>
     <property name="rightMargin">
      <number>0</number>
     </property>
     <property name="bottomMargin">
      <number>0</number>
     </property>
     <item>
      <widget class="QPushButton" name="findButton">
       <property name="text">
        <string>&amp;Find</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="replaceButton">
       <property name="text">
        <string>&amp;Replace</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="replaceAllButton">
       <property name="text">
        <string>Replace &amp;All</string>
       </property>
      </widget>
     </item>
     <item>
      <spacer>
       <property name="orientation">
        <enum>Qt::Vertical</enum>
       </property>
       <property name="sizeHint" stdset="0">
        <size>
         <width>20</width>
         <height>16</height>
        </size>
       </property>
      </spacer>
     </item>
     <item>
      <widget class="QPushButton" name="closeButton">
       <property name="text">
        <string>Close</string>
       </property>
      </widget>
     </item>
    </layout>
   </item>
  </layout>
 </widget>
 <tabstops>
  <tabstop>findLineEdit</tabstop>
  <tabstop>replaceLineEdit</tabstop>
  <tabstop>caseCheckBox</tabstop>
  <tabstop>wholeCheckBox</tabstop>
  <tabstop>syntaxComboBox</tabstop>
  <tabstop>findButton</tabstop>
  <tabstop>replaceButton</tabstop>
  <tabstop>replaceAllButton</tabstop>
  <tabstop>closeButton</tabstop>
 </tabstops>
 <resources/>
 <connections>
  <connection>
   <sender>closeButton</sender>
   <signal>clicked()</signal>
   <receiver>FindAndReplaceDlg</receiver>
   <slot>reject()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>444</x>
     <y>151</y>
    </hint>
    <hint type="destinationlabel">
     <x>466</x>
     <y>170</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>

五、代码运行结果

  1. 窗口运行
    在这里插入图片描述
  2. 功能验证
    在这里插入图片描述
    在这里插入图片描述

六、小结

这一节主要讲了如何把 .ui 文件转化为 .py 模块文件,让我们可以导入使用。有关窗口逻辑方面的代码,作者就不做多解释,自己运行体会一下即可。
我们下一节再见!

点我回顶部

 
 
 
 
 
 
 
Fin.

猜你喜欢

转载自blog.csdn.net/Enderman_xiaohei/article/details/109272794