Pyside2项目实战,从0开始写一个GUI可视化项目:总览
创始人
2024-05-22 13:06:46
0

在这里插入图片描述

前言

最近使用 Pyside2 编写了几个GUI工具,发现效果出奇的好。遂产生了分享它的念头。
接下来如果不出意外,大概没有意外,我会开始写这个专栏,介绍从零开始去编写一个实用的GUI工具。
这是Pyside2第一篇:《总览》

本文对Pyside2在开发使用中进行了知识点的提炼,所以后面本专栏更新文章内容大致就是针对本文的每个小内容做一些拓展。

建议有需要的小伙伴通过官方文档去进行系统地学习!!
Pyside2 文档:https://doc.qt.io/qtforpython/

后面专栏新增文章时候,本文会做出相应修改!!
专栏整体大概在10篇以上,反正学了你就能使用Pyside2 编写自己的GUI工具了。


专栏脉络

专栏内容大体如下,会酌情增加一些使用技巧以及方法。

基本流程

  1. 布局(通过designer.exe 手动绘制
  2. 编写逻辑
  3. 将布局展示

前置操作

安装模块

pip install pyside2

文件转换

关于pyside2文件:https://doc.qt.io/qtforpython/tutorials/pretutorial/typesoffiles.html

  • ui文件:布局文件,基于 XML 的格式
  • qrc文件:Qt Recources file,是一个 XML 格式的资源配置文件

ui to py

pyside2-uic xxx.ui -o xxx.py

qrc to py

pyside2-rcc xxx.qrc -o xxx.py

默认模板

官方展示的案例

import sys
from PySide2.QtCore import Qt
from PySide2.QtWidgets import QApplication, QLabelif __name__ == "__main__":app = QApplication(sys.argv)label = QLabel("Hello World", alignment=Qt.AlignCenter)label.show()sys.exit(app.exec_())

加载 ui 有两种方式,

  • 一种是直接加载ui
  • 一种是将ui转成py,然后再加载py

直接加载ui

  • 不好用,不做展示。

加载py

from PySide2.QtWidgets import QApplication, QMainWindowfrom demo_ui import Ui_Formclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.ui = Ui_Form()self.ui.setupUi(self)if __name__ == '__main__':app = QApplication([])window = MainWindow()window.show()sys.exit(app.exec_())

设置焦点

鼠标点击某个组件就执行指定操作时候,可以用到这一步。结合 鼠标点击事件

方法一:

designer 中,选中对应的组件,

属性编辑器 -> focusPolicy -> ClickFocus

后面当鼠标点击在该组件时候,ui当前的焦点就在该组件上。

方法二:

self.QWidget.setFocusPolicy(Qt.ClickFocus)

固定界面大小

self.setFixedSize(self.width(), self.height())

TableWidget

设置行数

TableWidget.setRowCount(int())	# 输入int

不显示行号

TableWidget.verticalHeader().setVisible(False)

列可拖拽

TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Interactive)

均分列的宽度

TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

根据内容长度分配列宽

  • 两句一起用,效果更好
TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
# 指定第0列
TableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)
# 也可以不指定列,作用于所有列
TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)

Table显示

from PySide2.QtWidgets import QTableWidgetItemdata = [('c1', 'c2', 'c3'), ('d1', 'd2', 'd3')...]
for row, row_data in enumerate(data):for columns, columns_data in enumerate(row_data):TableWidget.setItem(row, columns, QTableWidgetItem(str(columns_data)))

表格复制

def __init__(self):# 剪切板self.cb = QtWidgets.QApplication.clipboard()...# 单击表格单元格,即黏贴到剪切板self.table_show.clicked.connect(lambda: self.cb.setText(self.QTableWidget.currentItem().text()))def keyPressEvent(self, event):""" Ctrl + C复制表格内容 """if event.modifiers() == Qt.ControlModifier and event.key() == Qt.Key_C:# 获取表格的选中行# 只取第一个数据块,其他的如果需要要做遍历,简单功能就不写得那么复杂了selected_ranges = self.QTableWidget.selectedRanges()[0]  # 最后总的内容text_str = ""  # 行(选中的行信息读取)for _row in range(selected_ranges.topRow(), selected_ranges.bottomRow() + 1):row_str = ""# 列(选中的列信息读取)for col in range(selected_ranges.leftColumn(), selected_ranges.rightColumn() + 1):item = self.QTableWidget.item(_row, col)# 制表符间隔数据row_str += item.text() + '\t'  # 换行	text_str += row_str + '\n' self.cb.setText(text_str)

QFileDialog

导入文件&文件夹

from PySide2.QtWidgets import QFileDialog# 对应的,做一些格式的筛选
path = QFileDialog.getOpenFileName(self, '选择文件', '.py', 'Python Files (*.py)')[0]# 选择多个文件
path = QFileDialog.getOpenFileNames(self, '选择文件', '.py', 'Python Files (*.py)')[0]

导出文件

QFileDialog.getSaveFileName(self, '保存文档', 'untitled.xlsx', 'excel文件 (*.xls *.xlsx)')[0]

QMessageBox

提示弹窗

from PySide2.QtWidgets import QFileDialogQMessageBox.information(self, '提示', '这是提示弹窗')

可选提示弹窗

res = QMessageBox.question(self, 'Message', '确定要退出吗?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if res == QMessageBox.Yes:print('你选择了是.')
else:print('你选择了否.')

radioButton

清空选择

QRadioButton.setAutoExclusive(False)
QRadioButton.setChecked(False)
QRadioButton.setAutoExclusive(True)

事件监听

文件拖拽

# 设置文件支持拖拽
self.setAcceptDrops(True)def dragEnterEvent(self, event) -> None:"""文件拖拽事件"""if event.mimeData().hasText():# 获取拖拽进来的文件路径file_path = event.mimeData().urls()[0].toLocalFile()# 鼠标放开函数事件event.accept()# do somethingelse:event.ignore()

关闭事件

def closeEvent(self, event) -> None:"""关闭事件"""res = QMessageBox.question(self, 'Message', '确定要退出吗?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if res == QMessageBox.Yes:event.accept()else:event.ignore()

鼠标点击事件

def mousePressEvent(self, event) -> None:"""鼠标点击事件"""# 判定是左键点击if event.button() == Qt.MouseButton.LeftButton:time.sleep(1)self.import_file()return
self.focusWidget().objectName() == 'groupBox'

窗口可拖拽

  • 重写3个函数,
from PySide2.QtCore import Qt, QPointdef __init__(self):# 窗口移动、设置鼠标动作位置self._move = Falseself.m_position = QPoint(0, 0)# 鼠标点击事件产生
def mousePressEvent(self, event):if event.button() == Qt.LeftButton:self._move = Trueself.m_position = event.globalPos() - self.pos()event.accept()# 鼠标移动事件
def mouseMoveEvent(self, QMouseEvent):if Qt.LeftButton and self._move:self.move(QMouseEvent.globalPos() - self.m_position)QMouseEvent.accept()# 鼠标释放事件
def mouseReleaseEvent(self, QMouseEvent):self._move = False

隐藏边框、阴影效果

from PySide2.QtCore import Qt
from PySide2.QtWidgets import QGraphicsDropShadowEffectdef __init__(self):# 隐藏边框self.setWindowFlags(Qt.FramelessWindowHint)self.setAttribute(Qt.WA_TranslucentBackground)# 阴影效果effect = QGraphicsDropShadowEffect(self)effect.setBlurRadius(30)effect.setOffset(0, 0)effect.setColor(Qt.gray)self.setGraphicsEffect(effect)

状态栏图标

from ctypes import windll# 这段代码放在前面即可
try:myapp_id = 'mycompany.myproduct.subproduct.version'windll.shell32.SetCurrentProcessExplicitAppUserModelID(myapp_id)
except ImportError:passif __name__ == "__main__":QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)app = QApplication([])# 指定状态栏和程序左上角的图标,需要绝对路径app.setWindowIcon(QtGui.QIcon(r'C:\User\Desktop\icon.ico'))window = MainWindow()window.show()sys.exit(app.exec_())

打包成 .exe

后话

本次分享远远未结束!!
建议关注本专栏,以获得文章更新的最新消息哦!!
🐱‍🏍🐱‍🏍

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...