PyQt5实操及问题记录

下载与配置

下载

下载使用pip install即可

pip install PyQt5 -i https://pypi.douban.com/simple
pip install PyQt5-tools -i https://pypi.douban.com/simple

配置

参考:跳转地址
注意:program要用项目虚拟环境内的目录,不要用下载目录

Qt Designer的使用

从external tool进入Qt designer

窗体设计

新建窗体

三类窗口的区别:
(1)、dialog有exec函数,如果是dialog窗口,后边的窗口是不可选的;这个dialog窗口只是为了给人们提供更好的可视化操作,但是对于程序员而言,这个操作并不是立刻执行的;而是当在窗口选择关闭后,才将选择的结果返回给后台,后台才可以根据选择的结果进行相应的操作。
(2)、widget主要是在上面放置布局和控件;所有用户界面对象的基类。 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。
(3)、widget和dialog都有show函数,如果通过这个函数显示这两种类型的窗口,则两个窗口都是可选的;
(4)、mainwindow可以有menu菜单、tool工具栏、status状态栏、电脑显示屏右下脚的托盘等。提供更好的可视化操作;一个正常window软件呈现给客户的可视化界面。
PyQt5实操及问题记录_第1张图片

widget box简单说明

  1. Layouts:控制整体布局,水平、垂直、网格等
  2. Spacers:分隔符
  3. Buttons:各种按钮,从上往下为普通按钮(单击产生动作),工具按钮(通常显示图标),单选框,复选框,命令链接按钮,对话框按钮(OK Cancle)
  4. Containers:
    Group Box:分组框(将有类似用途的复选框和单选按钮的集合分组在一起)
    Scroll Area:滚动区域
    Tool Box:工具箱(在工具箱中提供一系列页面或者隔间)
    Stacked widget:堆叠小部件(是小部件的集合,其中只有最顶层可见。 对可见层的控制通常由另一个小部件(例如组合框)使用信号和槽来管理。处理方式和Tool Box类似)
    Tab Widget:选项卡小部件(默认情况下包含两个选项卡,可以根据需要删除或重命名这些选项卡。还可以添加其他的选项卡)
    Frame:用于封装和分组小部件,提供装饰。用作复杂容器的基础,也可以用作占位符
    Dock Widget:停靠小部件(是浮动面板,通常包含输入和更复杂的空间,要么附加到“停靠区域”中主窗口的边缘,要么作为独立工具窗口浮动)
  5. Input Widgets、Display Widgets:输入、输出的部件

使用方法

  • 通过拖动调整好窗体各部件后,如果需要进一步设置部件,选中相应部件并右键鼠标即可(如combo box中菜单的增删)
  • QWidget中font可以改变字体大小

资源浏览器添加自己的图标

  1. 创建qrc文件:
    双击 Text Brower 组件进入编辑页面,右上角的图片就是打开资源管理器。
    引用一个随便建的 qrc 结尾的文件。
    路径、别名随便填一下,然后点击添加文件(需要文件同级下有资源文件),选择一下自己的资源(图标)。
    点击 ok 就资源添加完成了。
    此时 qrc 文件已经有内容了,下次直接打开 qrc 文件就可以。
  2. 插入图标:
    以Label控件为例,添加标签控件到窗口后,在属性编辑器中找到pixmap属性,点击后面的框选择一张图片即可
    最后在QT Designer保存好文件即得到我们想要的ui文件,记作window.ui。

更多关于Qt Designer的具体信息见:https://doc.qt.io/qt-6/qtdesigner-manual.html

调用与调试

介绍

  1. PyQt的主要类
类名 基本信息
QObject 是所有PyQt对象的基类。
QPaintDevice 所有可绘制的对象的基类。
QApplication 用于管理图形用户界面应用程序的控制流和主要设置。无论程序有多少个窗口,该类实例化对象只有一个。它包含主事件循环,对来自窗口系统和其他资源的所有事件进行处理和调度;它也对应用程序的初始化和结束进行处理,并且提供对话管理;还对绝大多数系统范围和应用程序范围的设置进行处理。
QWidget 所有用户界面对象的基类。QDialog和QFrame继承自它。
QFrame 有框架的窗口控件的基类,它也被用来直接创建没有任何内容的简单框架。主要是用来控制一些边框样式,例如凸起、凹下、阴影、线宽等。
QDialog 对话框窗口类。是主要用于短时期任务以及用户进行简要通讯的顶级窗口(如果一个窗口控件没有被嵌入到父窗口控件中,那么该窗口控件就被称为顶级窗口控件)。
QMainWindow 提供一个有菜单栏、停靠窗口和状态栏的主应用程序窗口

除此之外,还有一些重要的子类,子类可以继承父类的功能,这里就不一一赘述了(可以参考前文中的widget box说明)。

  1. 常用函数
函数名 作用
SetWindowTitle(title) 设置窗口标题文本
SetGeometry(x,y,w,h) 设置窗口位置和大小,其中x和y是窗口左上角的坐标,w和h是窗口的宽和高
show() 显示控件或窗口
clicked.connect(slot) 将一个槽函数slot和按钮的clicked信号连接起来,点击按钮时将执行槽函数
setText(text) 设置控件文本内容
setAlignment 设置控件的文本对齐方式
setFixedSize(w, h) 设置控件的固定大小(宽度,高度)
resize(w, h) 设置控件的大小
  1. QComboBox的常用方法与信号
名称 作用
方法 addItem()、addItems() 添加下拉选项
setCurrentIndex(index) 设置默认显示的项目,index为项目的索引
currentIndex() 获取选中项的索引
currentText() 获取选中项的文本
信号 activated 在用户选中一个下拉选项时发射
currentIndexChanged 在下拉选项索引发生改变时发射
  1. QDateTimeEdit的常用方法与信号
名称 作用
方法 setDisplayFormat() 设置日期的时间格式
setMinimumDate() 设置控件的最小日期
setMaximumDate() 设置控件的最大日期
time()、date() 返回编辑的时间、日期
信号 dateChanged 当日期改变时发射
dateTImeChanged 当日期时间改变时发射
timeChanged 当时间改变时发射

转换.ui文件为.py文件

选中ui文件,使用PyUIC,会自动生成window.py文件。
注意,如果我们在窗体中使用了资源hhh.qrc文件,window.py中会出现

 import hhh_rc

而实际上我们没有hh_rc,这里需要对hhh.qrc使用pyrcc,这样会生成相应的hhh_rc.py文件

调用窗体

参考上文链接

import sys
import window1

from PyQt5.QtWidgets import QApplication,QMainWindow

if __name__ == '__main__':
    # 只有直接运行这个脚本,才会往下执行
    # 别的脚本文件执行,不会调用这个条件句

    # 实例化,传参
    app = QApplication(sys.argv)

    # 创建对象
    mainWindow = QMainWindow()

    # 创建ui,引用demo1文件中的Ui_MainWindow类
    ui = window1.Ui_MainWindow()
    # 调用Ui_MainWindow类的setupUi,创建初始组件
    ui.setupUi(mainWindow)
    # 创建窗口
    mainWindow.show()
    # 进入程序的主循环,并通过exit函数确保主循环安全结束(该释放资源的一定要释放)
    sys.exit(app.exec_())

这时出现了错误:This application failed to start because no Qt platform plugin could be initialized
解决方法:新建系统变量
变量名:QT_QPA_PLATFORM_PLUGIN_PATH
变量值:pyqtX_tools中的与designer上级bin里面的plugins文件夹路径。(直接搜索platforms,plugins下的platforms所在的位置就是变量值,注意这里用的是实际安装python时的路径)

上述代码虽然能让窗体运行,但是该窗体的功能都还没有具体定义和改造,因此,接下来我们开始实现想要的功能。这里给出一个简单的例子,目标是在点击查询后,列出给定文件位置下,给定时间之后的中文文献/英文文献:
PyQt5实操及问题记录_第2张图片

实现功能(信号与槽函数)

信号是一个控件在某些情况下传出的指令,槽则是在某些空间中的信号处理模块。将信号与槽函数连接后,当信号被触发时,槽函数将被自动调用。

信号与槽函数可以是内置函数,也可以是自定义函数。对于内置函数的连接等参见文档

下面详细介绍自定义信号、槽函数的编写和连接

自定义信号、槽函数的创建与连接

对象查看器——选中MainWindow(或其他顶级窗口)——右键——改变信号/槽——添加新的信号/槽click_search()
选中菜单上的edit——编辑信号/槽——长按选中pushButton并拖动至MainWindow——选择clicked()和click_search()
PyQt5实操及问题记录_第3张图片

将ui文件保存并转换为py文件,这里命名为window.py

自定义信号/槽函数的编写

上述操作结束后,由于我们只是建立了一个空有名字的信号/槽,因此我们需要在代码中具体编写它的功能。接下来基于window.py文件进一步编写代码。

import sys
import os
import window
import datetime
from window import Ui_MainWindow 
from PyQt5.QtWidgets import QApplication, QMainWindow


class MyWindow(QMainWindow, Ui_MainWindow):  # 继承 QMainWindow 类和 Ui_MainWindow 界面类
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)  # 初始化父类
        self.setupUi(self)  # 继承 Ui_MainWindow 界面类

	# 编写自定义槽函数
    def click_search(self):
        # 读取各个部件内的文字信息
        language = self.comboBox.currentText()
        tim = self.dateTimeEdit.dateTime().toPyDateTime()
        file_loc = self.lineEdit.text()
        # 判断文件路径格式
        if not os.path.isdir(file_loc) or "/" in file_loc:
            self.textBrowser.setText('文件位置格式错误!')
            return
        if language == 'ENGLISH':
            file_loc = file_loc + '\英文文献'
        else:
            file_loc = file_loc + '\中文文献'
        files = os.listdir(file_loc)
        self.textBrowser.append('创建时间在选中时间之后的文献有: \n')
        for f in files:
            path = os.path.join(file_loc, f)
            ctime = os.path.getctime(path)
            if datetime.datetime.fromtimestamp(ctime) >= tim:
                self.textBrowser.append(f + '\n')
        self.textBrowser.append('查询结束\n')
        return


if __name__ == '__main__':
    # 实例化,传参
    app = QApplication(sys.argv)
    mainWindow = MyWindow()

    # 创建ui,引用demo1文件中的Ui_MainWindow类
    mainWindow.show()
    sys.exit(app.exec_())

PyQt5实操及问题记录_第4张图片
运行顺利。如果运行中出现闪退,那就是代码出现了问题,可以通过以下方式查看traceback:
运行键下方点击Modify Run Configuration——选中emulated terminal in output console——点击OK——重新运行代码即可看到错误提示了。

一些补充

  1. textBrowser实时显示内容
def printf(mes):
    self.textBrowser.append(mes)  # 在指定的区域显示提示信息
    self.cursot = self.textBrowser.textCursor()
    self.textBrowser.moveCursor(self.cursot.End)
    QApplication.processEvents()

直接调用上述函数即可
原文链接

  1. 部件随窗口大小变化而变化
    在窗体部分右键,并设置为Grid LayOut即可,但是布局会大幅度改变(不美观)

你可能感兴趣的:(Python学习记录,qt,数据库,开发语言)