PyQt基本控件

介绍

PyQt和Qt是两个不同的框架,后者是一个跨平台的C++库,社区庞大;前者是基于Qt的python绑定,社区较小

基本控件

QtWidgets

QFileDialog

getOpenFileName选择文件

file_name, _ = QFileDialog.getOpenFileName(parent, caption, directory, filter, options=options)

1
file_path, _ = QFileDialog.getOpenFileName(None, "打开图片", "", "*.jpg;;*.png;;*")

运行模板

界面与核心不分离

1
2
3
4
5
6
7
8
9
10
11
12
# 创建一个对象,代表了整个应用程序
app = QtWidgets.QApplication(sys.argv)
# 创建窗口
widget = QtWidgets.QWidget()
# 创建ui实例,用于渲染窗口
ui = Ui_Form()
# 对窗口进行渲染
ui.setupUi(widget)
# 显示窗口
widget.show()
# 应用程序主事件循环
sys.exit(app.exec_())

界面核心分离

  • 界面文件就是PYUIC之后的文件
  • 主程序文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import sys
from PyQt5 import QtWidgets
from ui_form import Ui_Form # 导入界面文件

class MainForm(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.ui = Ui_Form()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.choose_dataset) # 连接按钮点击事件

def choose_dataset(self):
pass

if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
main_window = MainForm()
main_window.show()
sys.exit(app.exec_())

槽函数定义在哪,控件的连接就设置在哪,需要自己手动添加,在designer中就不需要拖拽设置槽函数连接了

两个外部工具

在pycharm中进行配置

pyuic

PyQt UI Compiler将.ui文件转换为.py文件。配置:

  • 程序:D:\Software\Python\Anaconda\Scripts\pyuic5.exe
  • 实参: $FileName$ -o $FileNameWithoutExtension$.py
  • 工作目录:$FileDir$

pyrcc

PyQt Resource Complier将Qt资源文件.qrc编译为python模块,然后通过代码访问。配置:

  • 程序:C:\Users\Admin\.conda\envs\torch\Scripts\pyrcc5.exe(在Anaconda的Scripts文件夹下并没有pyrcc5.exe这个程序,反而在torch的文件夹下有,干脆直接复制到Anaconda更方便,所以换成了D:\Software\Python\Anaconda\Scripts\pyrcc5.exe
  • 实参:$FileName$ -o $FileNameWithoutExtension$_rc.py
  • 工作目录:$FileDir$

所遇问题

qt designer操作界面

操作界面太大,导致设计的窗口大小和实际显示的大小不一致,解决:

修改系统环境变量QT_SCALE_FACTOR的值,值为1时和系统分辨率一样大,值为0.5时设计的和实际显示的一样大,为了方便设计这里设置为0.75(问题竟然出在环境变量,学到了


更:学到个勾八,就是因为这个环境变量的设置,导致WPS界面被压缩裁剪了,想卸载连个卸载按钮都找不到,还恶意篡改我的文件打开方式,打开之后界面又是错乱的,折腾一上午终于发现问题出在你这个环境变量,再也不会下载WPS了

界面问题

运行界面之后,始终是一个小窗口,且控件被压缩裁剪,解决:

  • 主函数添加QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)

此段代码启用高DPIDots Per Inch每英寸像素数缩放支持,可以在高分辨率屏幕(高DPI屏幕)上更好地渲染界面

  • 重启电脑(此方法太玄乎