Python运用PySide6/PyQt居然可以制作如此好看的界面——““创意解析””

PyThon运用PySide6/PyQt居然可以制作如此好看的界面——““创意解析””

导语:

你将获取以下知识:

  • 相关控件:

    QWidget
    QLineEidt
    QTableWidget
    QLabel
    QPushButton
    
  • Qss美化

  • 多线程与信号

界面风格:

圆角,简约,暗夜模式

主界面分析:

请添加图片描述

  1. 窗口标题栏被替换
  2. 内容区由搜索框和快捷栏组成

窗口界面详解:

1.首先 (标题栏):

先将默认的标题栏去掉

        self.setWindowFlags(Qt.WindowType.Window | Qt.WindowType.FramelessWindowHint) # 设置无边框
        self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明

其次通过Qss实现圆角需要paintEvent的支持

def paintEvent(self, event):
    opt = QStyleOption()
    opt.initFrom(self)
    p = QPainter(self)
    self.style().drawPrimitive(QStyle.PrimitiveElement.PE_Widget,opt,p,self)

    super().paintEvent(event)

接着我们开始重实现标题栏
右边由:QLabel构成 左边由:QPushButton构成

值得留意的是Qss背景不支持?

self.setAttribute(Qt.WA_StyledBackground, True)  # 支持qss设置背景

重实现 标题栏拖拽窗口移动

def mousePressEvent(self, event):
    super().mousePressEvent(event)
    if event.button() == Qt.MouseButton.LeftButton:
        self._press = True
        self.mouseStartPos = event.globalPos()	# 获取点击屏幕坐标
        self.windowTopLeftPos = self.mapToGlobal(self.frameGeometry().topLeft()) # 获取窗口左上角屏幕坐标

def mouseMoveEvent(self, event):
    super().mouseMoveEvent(event)
    if self._press:
        distance = event.globalPos() - self.mouseStartPos # 计算移动距离
        self.window().move(distance + self.windowTopLeftPos) # 移动窗口

def mouseReleaseEvent(self, event):
    super().mouseReleaseEvent(event)
    if self._press:
        self._press = False
        
# 注意坐标系应相当于屏幕坐标系
2.其次 (搜索框):

主要是对QLineEidt的样式设置和PaintEvent的重写

def paintEvent(self, event):
    super().paintEvent(event)

    painter = QPainter(self)

    img = QPixmap('./img/find.png').scaled(34,34,Qt.AspectRatioMode.IgnoreAspectRatio, Qt.TransformationMode.SmoothTransformation)
    painter.drawPixmap(
        600-25-18,2, img)
    
# Qss
QLineEdit{
        color: white;
        padding-left: 12px;
        padding-right: 40px;
        border: 2px solid gray;
        border-radius: 20px;
        background-color: #282c35;
    }

至于QLineEdit的搜索按钮点击事件,通过重写mousePressEvent实现,详解源代码

3.最后 (快捷栏):

它由QTableWidet构成,单元格由两个QLabel构成

值得注意点是:QTableWidget设置样式(stylesheet)后,单元格行高列宽会失效,解决方法如下:

self.horizontalHeader().setDefaultSectionSize(int)
self.verticalHeader().setDefaultSectionSize(int)

标题和图标,通过爬虫获取

from PIL import Image
from urllib.parse import urlsplit
import requests as rq

def getIcon(url:str):
   # 知识点:网址通常开放 主机名 + “/favicon.ico” 为图标api
   parser_url = urlsplit(url)
   netloc = parser_url.netloc	# 获取主机名
   icon_url = parser_url.scheme + '://' + netloc + "/favicon.ico"
   savePath = f'./img/{netloc.replace(".","_")}.ico'
   if not os.path.exists(savePath):
       img = Image.open(BytesIO(rq.get(icon_url,headers=HEADERS,verify=False).content))
       if img.width < 64 or img.height < 64:
           img = img.resize((64,64))
       img.save(savePath,sizes=[(64,64)])
   return netloc.replace(".","_")

# 获取标题部分详见源代码

由于爬虫会阻塞主线程,所以使用多线程加载是个好方法

from threading import Thread

currentThreading = Thread(target=self.cellInit,
                                     args=(row,index,DEFAULTURLS[key],key,))
currentThreading.start()

class shortcutsBar(QTableWidget):
   addCell = Signal(int,int,str,str)
   def __init__(self, parent=None):
       super().__init__(parent)
       self.bind()
       self.initSetup()
	
   def bind(self):
       self.addCell.connect(self.setCellEvent)
	
   def initSetup(self):
       # 详解源代码
       .......
       
		DEFAULTURLS ={'SteamWorkShop': 'https://steamcommunity.com/', 'Watt Toolkit': 'https://steampp.net/'}
       for index,key in enumerate(DEFAULTURLS.keys()):
           row = 0
           if index > 5:
               index -= 5
               row = 1

           currentThreading = Thread(target=self.cellInit,
                                     args=(row,index,DEFAULTURLS[key],key,))
           currentThreading.start()
   
   def cellInit(self,row:int,col:int,url:str,text:str):
       img = getIcon(url)
       self.addCell.emit(row,col,img,text)

   @Slot(int,int,str,str)
   def setCellEvent(self,row:int,col:int,img:str,text:str):
       cell = QWidget()
       cellLayout = QVBoxLayout(cell)
       cellText = QLabel(text)
       cellText.setFont(QFont('微软雅黑',12))
       cellText.setStyleSheet('color: #ffffff')

       cellIcon = iconLabel(f'./img/{img}.ico',text)

       cellLayout.addWidget(cellIcon,alignment=Qt.AlignmentFlag.AlignCenter)
       cellLayout.addWidget(cellText,alignment=Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignBottom)

       self.setCellWidget(row,col,cell)

这里采用原生多线程 + Signal 的原因是:在多线程中操作任何UI容易造成软件崩溃
如果是连续往UI添加东西要给界面留绘制时间 (sleep)

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Pyside6和PyQt6都是Python编程语言中用于创建GUI应用程序的工具包。它们都是基于Qt框架构建的,因此具有相似的功能和API。 以下是关于使用Pyside6/PyQt6进行快速开发和实战的一些提示: 1. 学习Qt框架:Qt框架是创建GUI应用程序的基础。学习Qt框架可以帮助你了解Pyside6和PyQt6的工作原理,以及如何使用它们创建GUI应用程序。 2. 学习Python编程语言:Pyside6和PyQt6都是Python编程语言的库。因此,熟悉Python编程语言可以帮助你更好地使用这些库。 3. 使用Qt Designer:Qt Designer是一个可视化工具,可以帮助你轻松创建GUI应用程序的UI。你可以使用Qt Designer创建UI,并将其导入到Pyside6/PyQt6项目中。 4. 学习信号和槽:信号和槽是Pyside6/PyQt6中的重要概念。信号是一个事件,例如按钮单击或文本更改,而槽是响应这些事件的函数。学习如何使用信号和槽可以帮助你创建响应用户操作的GUI应用程序。 5. 阅读文档和示例代码:Pyside6和PyQt6都有详细的文档和示例代码。阅读这些文档和示例代码可以帮助你了解如何使用库中的不同功能和API,并为你的项目提供灵感。 6. 加入社区:Pyside6和PyQt6有活跃的社区和论坛。加入这些社区可以帮助你与其他开发人员交流经验,并得到解决问题的帮助。 总之,使用Pyside6和PyQt6进行快速开发和实战需要学习Qt框架、Python编程语言、Qt Designer、信号和槽等知识,并阅读文档和示例代码。加入社区可以帮助你更好地了解和使用这些库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值