找回密码
 会员注册
查看: 21|回复: 0

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

[复制链接]

5

主题

0

回帖

16

积分

新手上路

积分
16
发表于 2024-9-9 23:01:05 | 显示全部楼层 |阅读模式
PyThon运用PySide6/PyQt居然可以制作如此好看的界面——““创意解析””导语:你将获取以下知识:相关控件:QWidgetQLineEidtQTableWidgetQLabelQPushButton12345Qss美化多线程与信号界面风格:圆角,简约,暗夜模式主界面分析:窗口栏被替换内容区由搜索框和快捷栏组成窗口界面详解:1.首先(栏):先将默认的栏去掉self.setWindowFlags(Qt.WindowType.Window|Qt.WindowType.FramelessWindowHint)#设置无边框self.setAttribute(Qt.WA_TranslucentBackground)#设置窗口背景透明12其次通过Qss实现圆角需要paintEvent的支持defpaintEvent(self,event)pt=QStyleOption()opt.initFrom(self)p=QPainter(self)self.style().drawPrimitive(QStyle.PrimitiveElement.PE_Widget,opt,p,self)super().paintEvent(event)1234567'运行运行接着我们开始重实现栏右边由:QLabel构成左边由:QPushButton构成值得留意的是Qss背景不支持?self.setAttribute(Qt.WA_StyledBackground,True)#支持qss设置背景1重实现栏拖拽窗口移动defmousePressEvent(self,event):super().mousePressEvent(event)ifevent.button()==Qt.MouseButton.LeftButton:self._press=Trueself.mouseStartPos=event.globalPos() #获取点击屏幕坐标self.windowTopLeftPos=self.mapToGlobal(self.frameGeometry().topLeft())#获取窗口左上角屏幕坐标defmouseMoveEvent(self,event):super().mouseMoveEvent(event)ifself._press:distance=event.globalPos()-self.mouseStartPos#计算移动距离self.window().move(distance+self.windowTopLeftPos)#移动窗口defmouseReleaseEvent(self,event):super().mouseReleaseEvent(event)ifself._press:self._press=False#注意坐标系应相当于屏幕坐标系12345678910111213141516171819'运行运行2.其次(搜索框):主要是对QLineEidt的样式设置和PaintEvent的重写defpaintEvent(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)#QssQLineEdit{color:white;padding-left:12px;padding-right:40px;border:2pxsolidgray;border-radius:20px;background-color:#282c35;}123456789101112131415161718至于QLineEdit的搜索按钮点击事件,通过重写mousePressEvent实现,详解源代码3.最后(快捷栏):它由QTableWidet构成,单元格由两个QLabel构成值得注意点是:QTableWidget设置样式(stylesheet)后,单元格行高列宽会失效,解决方法如下:self.horizontalHeader().setDefaultSectionSize(int)self.verticalHeader().setDefaultSectionSize(int)12和图标,通过爬虫获取fromPILimportImagefromurllib.parseimporturlsplitimportrequestsasrqdefgetIcon(url:str):#知识点:网址通常开放主机名+“/favicon.ico”为图标apiparser_url=urlsplit(url)netloc=parser_url.netloc #获取主机名icon_url=parser_url.scheme+'://'+netloc+"/favicon.ico"savePath=f'./img/{netloc.replace(".","_")}.ico'ifnotos.path.exists(savePath):img=Image.open(BytesIO(rq.get(icon_url,headers=HEADERS,verify=False).content))ifimg.width5:index-=5row=1currentThreading=Thread(target=self.cellInit,args=(row,index,DEFAULTURLS[key],key,))currentThreading.start()defcellInit(self,row:int,col:int,url:str,text:str):img=getIcon(url)self.addCell.emit(row,col,img,text)@Slot(int,int,str,str)defsetCellEvent(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)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849这里采用原生多线程+Signal的原因是:在多线程中操作任何UI容易造成软件崩溃如果是连续往UI添加东西要给界面留绘制时间(sleep)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-9 05:56 , Processed in 0.415812 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表