Pyside2项目实战,从0开始写一个GUI可视化项目:总览

news2024/11/18 6:38:38

在这里插入图片描述

前言

最近使用 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, QLabel

if __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, QMainWindow

from demo_ui import Ui_Form


class 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 QTableWidgetItem

data = [('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 QFileDialog

QMessageBox.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 something
    else:
        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, QPoint

def __init__(self):
    # 窗口移动、设置鼠标动作位置
    self._move = False
    self.m_position = QPoint(0, 0)


# 鼠标点击事件产生
def mousePressEvent(self, event):
    if event.button() == Qt.LeftButton:
        self._move = True
        self.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 QGraphicsDropShadowEffect


def __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:
    pass


if __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

后话

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学建模学习笔记(18):三维图形的绘制

三维图形的绘制生成绘图所需的横纵坐标三维网格图的绘制基本语法实战案例两种变形函数三维曲面图的绘制两种变形函数绘图效果的优化其他补充内容生成绘图所需的横纵坐标 [X,Y]meshgrid(xgv,ygv) % 函数解释:X和Y是用于接收返回值的变量,是两个大小相等的…

Python的基础语法

字面量 字面量是在代码中,被写下来的固定的值,称之为字面量 常见的字面量类型 字符串又称为文本是由任意数量的字符如中文、英文、各类符号、数字组成。所以叫做字符串常量。 注释 注释 在程序代码中对程序代码进行解释说明的文字 作用 注释不是程…

Java中XML如何转为BEAN

在网络通讯中&#xff0c;对方传的数据经常是XML格式包装的数据集合。在Java开发中&#xff0c;我们如何将XML转成Java实体类呢&#xff1f; 对方发送的报文 <ns2:response xmlns:ns2"http://service.zxl.cn/test/xml"><school><location>长江边…

Pointnet Tutorial

目录 .1 intro-点云特性 1.1 点云特性 1.2 motivation 1.3 pointnet的处理 .2 Pointnet 2.1 contribution 2.2 solution 2.3 backbone 2.4 代码部分 2.5 小结 .4 应用 References .1 intro-点云特性 Q1&#xff1a;什么是点云&#xff1f; 简单来说就是一堆三维点的集…

【异常】前端提示 Support for the experimental syntax ‘jsx‘ isn‘t currently enabled

一、报错内容 17:33:41 - Building for production... 17:34:13 ERROR Failed to compile with 5 errors5:34:09 PM 17:34:13 17:34:13 error in ./src/layout/components/Sidebar/Item.vue?vue&typescript&langjs& 17:34:13 17:34:13 Syntax Error…

万应低代码1月重点更新内容速递

速览版 详情版 一、低代码开发能力提升 01 工作流 &#xff08;1&#xff09; 优化流程推演 在流程发起时&#xff0c;对流程各节点审批人、抄送人进行实时推演。 【使用场景】 ● 以“请假”场景为例&#xff0c;A 角色的固定审批人为“甲、乙、丙” 3 人&#xff0c;在某…

windows10操作系统 显卡MX150 安装CUDA+cuDNN+pytorch

本人水平有限&#xff0c;如有问题请多指正笔记本系统&#xff1a;Windows 10 64位显卡&#xff1a;NVIDIA GeForce MX150显卡驱动程序版本&#xff1a;512.78显卡驱动程序支持CUDA版本&#xff1a;11.6.134及以下安装CUDA&#xff1a;11.6.0安装cuDNN&#xff1a;8.7.0一、安装…

路由器刷机解决学校无线上网问题(小米4A千兆版)

一、准备工作 1、路由器正常联网状态&#xff0c;&#xff08;正常联网状态指的是电脑能够通过路由器上网&#xff09; 2、电脑网线插入路由lan口&#xff0c;IP地址设置为自动获取 3、启动window10的Telent功能 控制面板 -> 程序和功能 -> 左侧“启动或关闭Windows功能…

FormArray在动态表格中的应用

如下图&#xff0c;是这次想要实现的功能。 一个表格行&#xff0c;点击新增按钮就增加一行&#xff0c;点击后面的删除按钮就可以删除对应的行&#xff0c;其中有部分字段需要添加非空校验。要想实现这个功能&#xff0c;需要应用到FormArray的知识。 步骤: 1. 声明一个Form…

打开IE浏览器自动跳转到Edge的解决方法

场景Windows 10中&#xff0c;打开IE浏览器自动跳转到Edge&#xff0c;但是某些网站还是只能在IE中正常访问&#xff0c;Edge访问会出问题。解决方案Edge中点击右上角的三个点&#xff0c;然后点击设置在“默认浏览器”中&#xff0c;修改“让 Internet Explorer 在 Microsoft …

Linux-文件和目录常用命令

1.查看目录内容1.1 终端使用技巧自动补全在敲出 文件/目录/命令的前几个字母之后&#xff0c;按下tab键如果输入的没有歧义&#xff0c;系统会自动补全如果还存在其他文件/目录/命令,再按一下tab键,系统会提示可能存在的命令曾经使用过的命令按上/下光标键可以再曾经使用过的命…

GeoServer系列-安装SqlServer插件

GeoServer 安装包中是不含sqlserver插件的&#xff0c;所以无法创建sqlserver的数据存储&#xff0c;要想支持发布sqlserver的空间表到geoserver就需要添加插件 1&#xff0c;下载插件 官网下载地址&#xff1a;https://geoserver.org/download/ 根据自己的版本下载指定的插件…

Java之并发编程(三)

五、Java 常见并发容器总结 1.ConcurrentHashMap ConcurrentHashMap : 线程安全的 HashMap 1.1 Collections.synchronizedMap() 并发时使用它方法包装HashMap同步&#xff0c;这属于全局锁&#xff0c;性能低下。 1.2 ConcurrentHashMap&#xff0c; 读写操作都能保证很高…

文献阅读-Deep multi-view learning methods: A review

文献阅读-Deep multi-view learning methods: A reviewAbstract1-Introduction1.1 Comparison with Previous Reviews2 Multi-view Learning Methods in The Deep Learning Scope2.1 Multi-view convolutional neural network2.2. Multi-view auto-encoder2.3. Multi-view gene…

杉数求解器

目录前言一、简介以及安装二、COPT交互式命令行工具2-1、普通工具命令2-2、COPT工具命令三、使用示例3-1、交互模式3-2、Windows下终端窗口直接加载四、Python接口4-1、安装4-2、案例分析五、COPT调优工具5-1、介绍5-2、调优工具相关参数六、Python API参考6-1、COPT常数类总结…

【Jetson安装Nomachine】

0. 介绍 Nomachine是一款免费的远程桌面访问应用程序。支持用户从任何地方访问连接到Internet的计算机。该应用程序允许多个用户访问单个PC&#xff0c;且支持使用不同的操作系统。 官网链接&#xff1a;NoMachine - Free Remote Desktop for Everybody 1. 下载Nomachine 软…

【C++】简单理解内联函数

内联函数1.内联函数的概念2.C为什么要有内联函数&#xff1f;3.内联函数展示3.1查看方式3.2 观察汇编代码4.使用内联函数的注意事项5.内联函数缺点和优点1.内联函数的概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有…

九龙证券|沪指收获2010年以来最强1月 北向资金净买入额刷新历史纪录

昨日&#xff0c;A股小幅调整&#xff0c;2023年1月行情随之收官。全体来看&#xff0c;1月A股商场拾级而上&#xff0c;盘面出现普涨格局&#xff0c;价值与生长风格均有亮眼体现。三大股指中&#xff0c;上证指数1月上涨5.39%&#xff0c;创2010年以来最佳局面。深证成指、创…

zookeeper 源码分享二 ----启动加载数据

单机zookeeper 启动加载数据 读取磁盘中快照文件&#xff0c;选择其中第一个能正确加载的文件&#xff0c;最多加载100个快照文件。反序列化快照文件&#xff0c;进行内存DataTree数据加载根据最新事物日志&#xff0c;加载事物日志快照并进行反序列化重新执行事物日志中的操作…

OAuth2流程演示示例

目录一、OAuth2流程演示示例1、创建项目结构①客户②认证服务器③资源拥有者④资源服务器2、流程①资源所有者②客户③客户④认证服务器⑤客户⑥资源服务器一、OAuth2流程演示示例 client 客户 authorization-server 认证服务 resource-owner 资源所有者 resource-server 资源服…