下载使用pip install即可
pip install PyQt5 -i https://pypi.douban.com/simple
pip install PyQt5-tools -i https://pypi.douban.com/simple
参考:跳转地址
注意:program要用项目虚拟环境内的目录,不要用下载目录
从external tool进入Qt designer
三类窗口的区别:
(1)、dialog有exec函数,如果是dialog窗口,后边的窗口是不可选的;这个dialog窗口只是为了给人们提供更好的可视化操作,但是对于程序员而言,这个操作并不是立刻执行的;而是当在窗口选择关闭后,才将选择的结果返回给后台,后台才可以根据选择的结果进行相应的操作。
(2)、widget主要是在上面放置布局和控件;所有用户界面对象的基类。 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。
(3)、widget和dialog都有show函数,如果通过这个函数显示这两种类型的窗口,则两个窗口都是可选的;
(4)、mainwindow可以有menu菜单、tool工具栏、status状态栏、电脑显示屏右下脚的托盘等。提供更好的可视化操作;一个正常window软件呈现给客户的可视化界面。
更多关于Qt Designer的具体信息见:https://doc.qt.io/qt-6/qtdesigner-manual.html
类名 | 基本信息 |
---|---|
QObject | 是所有PyQt对象的基类。 |
QPaintDevice | 所有可绘制的对象的基类。 |
QApplication | 用于管理图形用户界面应用程序的控制流和主要设置。无论程序有多少个窗口,该类实例化对象只有一个。它包含主事件循环,对来自窗口系统和其他资源的所有事件进行处理和调度;它也对应用程序的初始化和结束进行处理,并且提供对话管理;还对绝大多数系统范围和应用程序范围的设置进行处理。 |
QWidget | 所有用户界面对象的基类。QDialog和QFrame继承自它。 |
QFrame | 有框架的窗口控件的基类,它也被用来直接创建没有任何内容的简单框架。主要是用来控制一些边框样式,例如凸起、凹下、阴影、线宽等。 |
QDialog | 对话框窗口类。是主要用于短时期任务以及用户进行简要通讯的顶级窗口(如果一个窗口控件没有被嵌入到父窗口控件中,那么该窗口控件就被称为顶级窗口控件)。 |
QMainWindow | 提供一个有菜单栏、停靠窗口和状态栏的主应用程序窗口 |
除此之外,还有一些重要的子类,子类可以继承父类的功能,这里就不一一赘述了(可以参考前文中的widget box说明)。
函数名 | 作用 |
---|---|
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) | 设置控件的大小 |
名称 | 作用 | |
---|---|---|
方法 | addItem()、addItems() | 添加下拉选项 |
setCurrentIndex(index) | 设置默认显示的项目,index为项目的索引 | |
currentIndex() | 获取选中项的索引 | |
currentText() | 获取选中项的文本 | |
信号 | activated | 在用户选中一个下拉选项时发射 |
currentIndexChanged | 在下拉选项索引发生改变时发射 |
名称 | 作用 | |
---|---|---|
方法 | setDisplayFormat() | 设置日期的时间格式 |
setMinimumDate() | 设置控件的最小日期 | |
setMaximumDate() | 设置控件的最大日期 | |
time()、date() | 返回编辑的时间、日期 | |
信号 | dateChanged | 当日期改变时发射 |
dateTImeChanged | 当日期时间改变时发射 | |
timeChanged | 当时间改变时发射 |
选中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时的路径)
上述代码虽然能让窗体运行,但是该窗体的功能都还没有具体定义和改造,因此,接下来我们开始实现想要的功能。这里给出一个简单的例子,目标是在点击查询后,列出给定文件位置下,给定时间之后的中文文献/英文文献:
信号是一个控件在某些情况下传出的指令,槽则是在某些空间中的信号处理模块。将信号与槽函数连接后,当信号被触发时,槽函数将被自动调用。
信号与槽函数可以是内置函数,也可以是自定义函数。对于内置函数的连接等参见文档
下面详细介绍自定义信号、槽函数的编写和连接
对象查看器——选中MainWindow(或其他顶级窗口)——右键——改变信号/槽——添加新的信号/槽click_search()
选中菜单上的edit——编辑信号/槽——长按选中pushButton并拖动至MainWindow——选择clicked()和click_search()
将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_())
运行顺利。如果运行中出现闪退,那就是代码出现了问题,可以通过以下方式查看traceback:
运行键下方点击Modify Run Configuration——选中emulated terminal in output console——点击OK——重新运行代码即可看到错误提示了。
def printf(mes):
self.textBrowser.append(mes) # 在指定的区域显示提示信息
self.cursot = self.textBrowser.textCursor()
self.textBrowser.moveCursor(self.cursot.End)
QApplication.processEvents()
直接调用上述函数即可
原文链接