丑拒!如何在Python中编写精美图形界面

简介:

在默认情况下,我们使用PyQt5创建出来的窗口和部件都是默认的样式,虽然谈不上很丑,但是也毫无美感可言。

其实,在PyQt5中,我们可以有较高的自由度来自定义窗口和各种小部件的样式,通过自定义这些样式,以达到美化图形界面的目的。

本篇文章中,我们就通过一个实际的例子,使用QSS和PyQt5的配置属性,实现图形用户界面的美化工作。

首先上效果图:

bc46602053656a2712c19a5d321f040e0dc549ed

使用到的图片素材有9张音乐的封面图片:

05a0617b29dfad56b7a9084caa4a9f236a3b1aff

需要素材的小伙伴可以在微信公众号回复关键词“0013”获取下载链接。

一、对界面进行布局和组件的布置

在图像界面编程中,一个好的布局有助于全局把控界面的形态,而在PyQt5中,有多种布局的方式供我们选择,比较常用的布局有以下几种:

 ●   表单布局:QFormLayout
 ●   网格布局:QGridLayout
 ●   水平排列布局:QHBoxLayout
 ●   垂直排列布局:QVBoxLayout

每种布局都有自己对布局内小部件的控制方式和特点,在此我们选择网格布局作为本次图形界面布局的方案。

在网格布局内,使用两个QWidget()部件分别作为左侧菜单模块的部件和右侧内容模块的部件。所以这个图形界面的最基本结构代码如下所示:

 
  1. # coding:utf-8


  2. from PyQt5 import QtCore,QtGui,QtWidgets

  3. import sys

  4. import qtawesome


  5. class MainUi(QtWidgets.QMainWindow):

  6. def __init__(self):

  7. super().__init__()

  8. self.init_ui()


  9. def init_ui(self):

  10. self.setFixedSize(960,700)

  11. self.main_widget = QtWidgets.QWidget() # 创建窗口主部件

  12. self.main_layout = QtWidgets.QGridLayout() # 创建主部件的网格布局

  13. self.main_widget.setLayout(self.main_layout) # 设置窗口主部件布局为网格布局


  14. self.left_widget = QtWidgets.QWidget() # 创建左侧部件

  15. self.left_widget.setObjectName('left_widget')

  16. self.left_layout = QtWidgets.QGridLayout() # 创建左侧部件的网格布局层

  17. self.left_widget.setLayout(self.left_layout) # 设置左侧部件布局为网格


  18. self.right_widget = QtWidgets.QWidget() # 创建右侧部件

  19. self.right_widget.setObjectName('right_widget')

  20. self.right_layout = QtWidgets.QGridLayout()

  21. self.right_widget.setLayout(self.right_layout) # 设置右侧部件布局为网格


  22. self.main_layout.addWidget(self.left_widget,0,0,12,2) # 左侧部件在第0行第0列,占8行3列

  23. self.main_layout.addWidget(self.right_widget,0,2,12,10) # 右侧部件在第0行第3列,占8行9列

  24. self.setCentralWidget(self.main_widget) # 设置窗口主部件


  25. def main():

  26. app = QtWidgets.QApplication(sys.argv)

  27. gui = MainUi()

  28. gui.show()

  29. sys.exit(app.exec_())


  30. if __name__ == '__main__':

  31. main()

运行代码,呈现出来的图形界面如下图所示:

a33f1ec7698e05ef0a8673fe953d6d2264fa838b

空空荡荡,下面我们就开始往里面填充小部件。

左侧菜单栏

在左侧菜单模块中,继续使用网格对部件进行布局。在左侧菜单的布局中添加按钮部件QPushButton()左侧菜单的按钮、菜单列提示和整个窗口的最小化和关闭按钮。

在MainUi()类的init_ui()方法中,使用如下代码实例化创建按钮:

 
  1. self.left_close = QtWidgets.QPushButton("") # 关闭按钮

  2. self.left_visit = QtWidgets.QPushButton("") # 空白按钮

  3. self.left_mini = QtWidgets.QPushButton("") # 最小化按钮


  4. self.left_label_1 = QtWidgets.QPushButton("每日推荐")

  5. self.left_label_1.setObjectName('left_label')

  6. self.left_label_2 = QtWidgets.QPushButton("我的音乐")

  7. self.left_label_2.setObjectName('left_label')

  8. self.left_label_3 = QtWidgets.QPushButton("联系与帮助")

  9. self.left_label_3.setObjectName('left_label')


  10. self.left_button_1 = QtWidgets.QPushButton(qtawesome.icon('fa.music',color='white'),"华语流行")

  11. self.left_button_1.setObjectName('left_button')

  12. self.left_button_2 = QtWidgets.QPushButton(qtawesome.icon('fa.sellsy',color='white'),"在线FM")

  13. self.left_button_2.setObjectName('left_button')

  14. self.left_button_3 = QtWidgets.QPushButton(qtawesome.icon('fa.film',color='white'),"热门MV")

  15. self.left_button_3.setObjectName('left_button')

  16. self.left_button_4 = QtWidgets.QPushButton(qtawesome.icon('fa.home',color='white'),"本地音乐")

  17. self.left_button_4.setObjectName('left_button')

  18. self.left_button_5 = QtWidgets.QPushButton(qtawesome.icon('fa.download',color='white'),"下载管理")

  19. self.left_button_5.setObjectName('left_button')

  20. self.left_button_6 = QtWidgets.QPushButton(qtawesome.icon('fa.heart',color='white'),"我的收藏")

  21. self.left_button_6.setObjectName('left_button')

  22. self.left_button_7 = QtWidgets.QPushButton(qtawesome.icon('fa.comment',color='white'),"反馈建议")

  23. self.left_button_7.setObjectName('left_button')

  24. self.left_button_8 = QtWidgets.QPushButton(qtawesome.icon('fa.star',color='white'),"关注我们")

  25. self.left_button_8.setObjectName('left_button')

  26. self.left_button_9 = QtWidgets.QPushButton(qtawesome.icon('fa.question',color='white'),"遇到问题")

  27. self.left_button_9.setObjectName('left_button')

  28. self.left_xxx = QtWidgets.QPushButton(" ")

在这里,我们使用qtawesome这个第三方库来实现按钮中的Font Awesome字体图标的显示。然后将创建的按钮添加到左侧部件的网格布局层中:

 
  1. self.left_layout.addWidget(self.left_mini, 0, 0,1,1)

  2. self.left_layout.addWidget(self.left_close, 0, 2,1,1)

  3. self.left_layout.addWidget(self.left_visit, 0, 1, 1, 1)

  4. self.left_layout.addWidget(self.left_label_1,1,0,1,3)

  5. self.left_layout.addWidget(self.left_button_1, 2, 0,1,3)

  6. self.left_layout.addWidget(self.left_button_2, 3, 0,1,3)

  7. self.left_layout.addWidget(self.left_button_3, 4, 0,1,3)

  8. self.left_layout.addWidget(self.left_label_2, 5, 0,1,3)

  9. self.left_layout.addWidget(self.left_button_4, 6, 0,1,3)

  10. self.left_layout.addWidget(self.left_button_5, 7, 0,1,3)

  11. self.left_layout.addWidget(self.left_button_6, 8, 0,1,3)

  12. self.left_layout.addWidget(self.left_label_3, 9, 0,1,3)

  13. self.left_layout.addWidget(self.left_button_7, 10, 0,1,3)

  14. self.left_layout.addWidget(self.left_button_8, 11, 0,1,3)

  15. self.left_layout.addWidget(self.left_button_9, 12, 0, 1, 3)

继续运行程序代码,呈现出来的图形界面如下图所示:

e6344eedea33fb79109f73cf59adfd0ed45e968a

虽然很丑,但是基本的模型是显示出来了,这里先不作美化,先把完整的结构搭建出来。下面开始右侧部件的搭建。

右侧内容模块

在右侧内容模块中,有以下几个主要内容模块:

 ●   搜索模块
 ●   推荐音乐模块
 ●   音乐列表模块
 ●   音乐歌单模块
 ●   音乐播放进度模块
 ●   音乐播放控制模块

在搜索模块中,有一个文本和一个搜索框,我们通过QLable()部件和QLineEdit()部件来实现,这两个部件同时包裹在一个网格布局的QWidget()部件,分列第一列和第二列,其代码如下所示:

 
  1. self.right_bar_widget = QtWidgets.QWidget() # 右侧顶部搜索框部件

  2. self.right_bar_layout = QtWidgets.QGridLayout() # 右侧顶部搜索框网格布局

  3. self.right_bar_widget.setLayout(self.right_bar_layout)

  4. self.search_icon = QtWidgets.QLabel(chr(0xf002) + ' '+'搜索 ')

  5. self.search_icon.setFont(qtawesome.font('fa', 16))

  6. self.right_bar_widget_search_input = QtWidgets.QLineEdit()

  7. self.right_bar_widget_search_input.setPlaceholderText("输入歌手、歌曲或用户,回车进行搜索")


  8. self.right_bar_layout.addWidget(self.search_icon,0,0,1,1)

  9. self.right_bar_layout.addWidget(self.right_bar_widget_search_input,0,1,1,8)


  10. self.right_layout.addWidget(self.right_bar_widget, 0, 0, 1, 9)

运行程序代码,其呈现的图形界面如下图所示:

b0e2c923120848c51992204981904f4537b55ba7

然后是推荐音乐模块,在推荐音乐模块中,有一个推荐的标题,和一个横向排列的音乐封面列表,在这里:

 ●   推荐标题使用QLable()来实现;
 ●   音乐封面列表由多个QToolButton()组成,其继续由一个布局为QGridLayout()的QWidget()部件所包含。

所以,其代码为:

 
  1. self.right_recommend_label = QtWidgets.QLabel("今日推荐")

  2. self.right_recommend_label.setObjectName('right_lable')


  3. self.right_recommend_widget = QtWidgets.QWidget() # 推荐封面部件

  4. self.right_recommend_layout = QtWidgets.QGridLayout() # 推荐封面网格布局

  5. self.right_recommend_widget.setLayout(self.right_recommend_layout)


  6. self.recommend_button_1 = QtWidgets.QToolButton()

  7. self.recommend_button_1.setText("可馨HANM") # 设置按钮文本

  8. self.recommend_button_1.setIcon(QtGui.QIcon('./r1.jpg')) # 设置按钮图标

  9. self.recommend_button_1.setIconSize(QtCore.QSize(100,100)) # 设置图标大小

  10. self.recommend_button_1.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) # 设置按钮形式为上图下文


  11. self.recommend_button_2 = QtWidgets.QToolButton()

  12. self.recommend_button_2.setText("那首歌")

  13. self.recommend_button_2.setIcon(QtGui.QIcon('./r2.jpg'))

  14. self.recommend_button_2.setIconSize(QtCore.QSize(100, 100))

  15. self.recommend_button_2.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)


  16. self.recommend_button_3 = QtWidgets.QToolButton()

  17. self.recommend_button_3.setText("伟大的渺小")

  18. self.recommend_button_3.setIcon(QtGui.QIcon('./r3.jpg'))

  19. self.recommend_button_3.setIconSize(QtCore.QSize(100, 100))

  20. self.recommend_button_3.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)


  21. self.recommend_button_4 = QtWidgets.QToolButton()

  22. self.recommend_button_4.setText("荣耀征战")

  23. self.recommend_button_4.setIcon(QtGui.QIcon('./r4.jpg'))

  24. self.recommend_button_4.setIconSize(QtCore.QSize(100, 100))

  25. self.recommend_button_4.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)


  26. self.recommend_button_5 = QtWidgets.QToolButton()

  27. self.recommend_button_5.setText("猎场合辑")

  28. self.recommend_button_5.setIcon(QtGui.QIcon('./r5.jpg'))

  29. self.recommend_button_5.setIconSize(QtCore.QSize(100, 100))

  30. self.recommend_button_5.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)

  31. self.right_recommend_layout.addWidget(self.recommend_button_1,0,0)

  32. self.right_recommend_layout.addWidget(self.recommend_button_2,0,1)

  33. self.right_recommend_layout.addWidget(self.recommend_button_3, 0, 2)

  34. self.right_recommend_layout.addWidget(self.recommend_button_4, 0, 3)

  35. self.right_recommend_layout.addWidget(self.recommend_button_5, 0, 4)


  36. self.right_layout.addWidget(self.right_recommend_label, 1, 0, 1, 9)

  37. self.right_layout.addWidget(self.right_recommend_widget, 2, 0, 2, 9)

继续运行程序代码,得到的图形界面如下图所示:

012bd095c27bd0dd846e76e6f47691125a7f9cb3

接着创建音乐列表模块和音乐歌单模块。音乐列表模块和音乐歌单模块都有一个标题和一个小部件来容纳具体的内容。

其中标题我们都使用QLabel()部件来实现,而音乐列表我们使用网格布局的QWidget()部件下包裹着数个QPushButton()按钮部件来实现,音乐歌单列表则使用网格布局的QWidget()部件下包裹着数个QToolButton()工具按钮部件来实现。

音乐列表的具体代码如下所示:

 
  1. self.right_newsong_lable = QtWidgets.QLabel("最新歌曲")

  2. self.right_newsong_lable.setObjectName('right_lable')


  3. self.right_playlist_lable = QtWidgets.QLabel("热门歌单")

  4. self.right_playlist_lable.setObjectName('right_lable')


  5. self.right_newsong_widget = QtWidgets.QWidget() # 最新歌曲部件

  6. self.right_newsong_layout = QtWidgets.QGridLayout() # 最新歌曲部件网格布局

  7. self.right_newsong_widget.setLayout(self.right_newsong_layout)


  8. self.newsong_button_1 = QtWidgets.QPushButton("夜机 陈慧娴 永远的朋友 03::29")

  9. self.newsong_button_2 = QtWidgets.QPushButton("夜机 陈慧娴 永远的朋友 03::29")

  10. self.newsong_button_3 = QtWidgets.QPushButton("夜机 陈慧娴 永远的朋友 03::29")

  11. self.newsong_button_4 = QtWidgets.QPushButton("夜机 陈慧娴 永远的朋友 03::29")

  12. self.newsong_button_5 = QtWidgets.QPushButton("夜机 陈慧娴 永远的朋友 03::29")

  13. self.newsong_button_6 = QtWidgets.QPushButton("夜机 陈慧娴 永远的朋友 03::29")

  14. self.right_newsong_layout.addWidget(self.newsong_button_1,0,1,)

  15. self.right_newsong_layout.addWidget(self.newsong_button_2, 1, 1, )

  16. self.right_newsong_layout.addWidget(self.newsong_button_3, 2, 1, )

  17. self.right_newsong_layout.addWidget(self.newsong_button_4, 3, 1, )

  18. self.right_newsong_layout.addWidget(self.newsong_button_5, 4, 1, )

  19. self.right_newsong_layout.addWidget(self.newsong_button_6, 5, 1, )

音乐歌单模块的代码如下所示:

 
  1. self.right_playlist_widget = QtWidgets.QWidget() # 播放歌单部件

  2. self.right_playlist_layout = QtWidgets.QGridLayout() # 播放歌单网格布局

  3. self.right_playlist_widget.setLayout(self.right_playlist_layout)


  4. self.playlist_button_1 = QtWidgets.QToolButton()

  5. self.playlist_button_1.setText("无法释怀的整天循环音乐…")

  6. self.playlist_button_1.setIcon(QtGui.QIcon('./p1.jpg'))

  7. self.playlist_button_1.setIconSize(QtCore.QSize(100, 100))

  8. self.playlist_button_1.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)


  9. self.playlist_button_2 = QtWidgets.QToolButton()

  10. self.playlist_button_2.setText("不需要歌词,也可以打动你的心")

  11. self.playlist_button_2.setIcon(QtGui.QIcon('./p2.jpg'))

  12. self.playlist_button_2.setIconSize(QtCore.QSize(100, 100))

  13. self.playlist_button_2.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)


  14. self.playlist_button_3 = QtWidgets.QToolButton()

  15. self.playlist_button_3.setText("那些你熟悉又不知道名字…")

  16. self.playlist_button_3.setIcon(QtGui.QIcon('./p3.jpg'))

  17. self.playlist_button_3.setIconSize(QtCore.QSize(100, 100))

  18. self.playlist_button_3.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)


  19. self.playlist_button_4 = QtWidgets.QToolButton()

  20. self.playlist_button_4.setText("那些只听前奏就中毒的英文歌")

  21. self.playlist_button_4.setIcon(QtGui.QIcon('./p4.jpg'))

  22. self.playlist_button_4.setIconSize(QtCore.QSize(100, 100))

  23. self.playlist_button_4.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)


  24. self.right_playlist_layout.addWidget(self.playlist_button_1,0,0)

  25. self.right_playlist_layout.addWidget(self.playlist_button_2, 0, 1)

  26. self.right_playlist_layout.addWidget(self.playlist_button_3, 1, 0)

  27. self.right_playlist_layout.addWidget(self.playlist_button_4, 1, 1)

然后将它们添加到右侧布局层中:

 
  1. self.right_layout.addWidget(self.right_newsong_lable, 4, 0, 1, 5)

  2. self.right_layout.addWidget(self.right_playlist_lable, 4, 5, 1, 4)

  3. self.right_layout.addWidget(self.right_newsong_widget, 5, 0, 1, 5)

  4. self.right_layout.addWidget(self.right_playlist_widget, 5, 5, 1, 4)

继续运行程序代码,显示出来的图形界面如下图所示:

2c07b1e4da8421fc0f98a14fe278993ead060a5d

这样,基本上能够看得出来图形界面的模样了,还差最后的音乐播放进度条和音乐播放控制按钮组。

音乐播放进度条我们使用QProgressBar()进度条部件来实现,音乐播放控制按钮组则使用一个QWidget()部件下包裹着三个QPushButton()按钮部件来实现。

其具体代码如下:

 
  1. self.right_process_bar = QtWidgets.QProgressBar() # 播放进度部件

  2. self.right_process_bar.setValue(49)

  3. self.right_process_bar.setFixedHeight(3) # 设置进度条高度

  4. self.right_process_bar.setTextVisible(False) # 不显示进度条文字


  5. self.right_playconsole_widget = QtWidgets.QWidget() # 播放控制部件

  6. self.right_playconsole_layout = QtWidgets.QGridLayout() # 播放控制部件网格布局层

  7. self.right_playconsole_widget.setLayout(self.right_playconsole_layout)


  8. self.console_button_1 = QtWidgets.QPushButton(qtawesome.icon('fa.backward', color='#F76677'), "")

  9. self.console_button_2 = QtWidgets.QPushButton(qtawesome.icon('fa.forward', color='#F76677'), "")

  10. self.console_button_3 = QtWidgets.QPushButton(qtawesome.icon('fa.pause', color='#F76677', font=18), "")

  11. self.console_button_3.setIconSize(QtCore.QSize(30, 30))


  12. self.right_playconsole_layout.addWidget(self.console_button_1, 0, 0)

  13. self.right_playconsole_layout.addWidget(self.console_button_2, 0, 2)

  14. self.right_playconsole_layout.addWidget(self.console_button_3, 0, 1)

  15. self.right_playconsole_layout.setAlignment(QtCore.Qt.AlignCenter) # 设置布局内部件居中显示


  16. self.right_layout.addWidget(self.right_process_bar, 9, 0, 1, 9)

  17. self.right_layout.addWidget(self.right_playconsole_widget, 10, 0, 1, 9)

最后运行程序代码,我们就得到了这个图形界面的完整部件的形态,其如下图所示:

de8ad787d2c11a61218be099c7f1f66b9c526c0a

完成了基本的图形界面小部件的搭建,接下来,我们可以对这个图形界面进行一下美化了,因为现在的这个样子实在是很丑陋很不好看。

二、使用QSS和部件属性美化窗口部件

QSS全称为Qt StyleSheet,是用来控制QT控件的样式表。其和Web前段开发中的CSS样式表类似,接下来,我们就通过QSS来对上面创建好的图形界面进行美化。

窗口控制按钮

首先从左侧的菜单栏开始。

左侧的最顶端是三个窗口控制按钮,我们需要将其设置为小圆点的形式。首先,我们使用QPushButton()的setFixedSize()方法,设置按钮的大小:

 
  1. self.left_close.setFixedSize(15,15) # 设置关闭按钮的大小

  2. self.left_visit.setFixedSize(15, 15) # 设置按钮大小

  3. self.left_mini.setFixedSize(15, 15) # 设置最小化按钮大小

然后,通过setStyleSheet()方法,设置按钮部件的QSS样式,在这里,左侧按钮默认为淡绿色,鼠标悬浮时为深绿色;中间按钮默认为淡黄色,鼠标悬浮时为深黄色;右侧按钮默认为浅红色,鼠标悬浮时为红色。所以它们的QSS样式设置如下所示:

 
  1. self.left_close.setStyleSheet('''QPushButton{background:#F76677;border-radius:5px;}QPushButton:hover{background:red;}''')

  2. self.left_visit.setStyleSheet('''QPushButton{background:#F7D674;border-radius:5px;}QPushButton:hover{background:yellow;}''')

  3. self.left_mini.setStyleSheet('''QPushButton{background:#6DDF6D;border-radius:5px;}QPushButton:hover{background:green;}''')

运行程序代码,可以发现三个控制按钮已经变成了比较美观的小圆点了:

3ee2d44bef7aa60828f30a16c4285d19b75a9ee6

左侧菜单按钮

因为最后的图形界面中,左侧的部件背景是灰色的,所以我们需要将左侧菜单中的按钮和文字颜色设置为白色,并且将按钮的边框去掉,在left_widget中设置qss样式为:

 
  1. self.left_widget.setStyleSheet('''

  2. QPushButton{border:none;color:white;}

  3. QPushButton#left_label{

  4. border:none;

  5. border-bottom:1px solid white;

  6. font-size:18px;

  7. font-weight:700;

  8. font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;

  9. }

  10. QPushButton#left_button:hover{border-left:4px solid red;font-weight:700;}

  11. ''')

右侧背景、搜索框和模块文本

完成了左侧部件的美化之后,我们接着对右侧的内容部件进行处理,首先是顶部的搜索框,因为搜索框使用的是QLineEdit()部件,默认情况下棱角分明很是不好看,我们对其进行圆角处理:

 
  1. self.right_bar_widget_search_input.setStyleSheet(

  2. '''QLineEdit{

  3. border:1px solid gray;

  4. width:300px;

  5. border-radius:10px;

  6. padding:2px 4px;

  7. }''')

因为图形界面是会呈现出无边框的圆角形式,所以右侧的部件的右上角和右下角需要先行处理为圆角的,同时背景设置为白色。对推荐模块、音乐列表模块和音乐歌单模块的标题我们也需要对其字体进行放大处理,所以最后的样式为:

 
  1. self.right_widget.setStyleSheet('''

  2. QWidget#right_widget{

  3. color:#232C51;

  4. background:white;

  5. border-top:1px solid darkGray;

  6. border-bottom:1px solid darkGray;

  7. border-right:1px solid darkGray;

  8. border-top-right-radius:10px;

  9. border-bottom-right-radius:10px;

  10. }

  11. QLabel#right_lable{

  12. border:none;

  13. font-size:16px;

  14. font-weight:700;

  15. font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;

  16. }

  17. ''')

运行程序代码,呈现出来的图形界面已经越来越像最终的形态的:

e41ae77775f8fd9a526bbbdc097770190ce1abaa

推荐模块、歌单模块和歌曲列表模块

因为推荐模块和歌单模块中使用的都是QToolButton()部件,所以其样式也类似:

 
  1. self.right_recommend_widget.setStyleSheet(

  2. '''

  3. QToolButton{border:none;}

  4. QToolButton:hover{border-bottom:2px solid #F76677;}

  5. ''')

  6. self.right_playlist_widget.setStyleSheet(

  7. '''

  8. QToolButton{border:none;}

  9. QToolButton:hover{border-bottom:2px solid #F76677;}

  10. ''')

而音乐列表使用的是QPushButton()按钮部件,我们需要对其去除边框,修改字体和颜色等,所以其样式为:

 
  1. self.right_newsong_widget.setStyleSheet('''

  2. QPushButton{

  3. border:none;

  4. color:gray;

  5. font-size:12px;

  6. height:40px;

  7. padding-left:5px;

  8. padding-right:10px;

  9. text-align:left;

  10. }

  11. QPushButton:hover{

  12. color:black;

  13. border:1px solid #F3F3F5;

  14. border-radius:10px;

  15. background:LightGray;

  16. }

  17. ''')

运行程序代码,现在的图形界面如下图所示:

e5150f9bd82c137d9e4af73d9f4ebb39ab0d2222

播放进度条和播放控制按钮组

接下来轮到播放进度条和播放控制按钮组了,我们需要将播放进度条的样色设置为浅红色,然后去除播放控制按钮的边框,所以其QSS样式为:

 
  1. self.right_process_bar.setStyleSheet('''

  2. QProgressBar::chunk {

  3. background-color: #F76677;

  4. }

  5. ''')


  6. self.right_playconsole_widget.setStyleSheet('''

  7. QPushButton{

  8. border:none;

  9. }

  10. ''')

到了这一步,运行程序代码所出现的图形界面越来越有最终界面的样子了:

f333fef4ca4749db0a48e2fad10b4c72ba21b08a

接下来就是最后的美化工作了!

三、窗口实现无边框和圆角

到了上一步,通过QSS调整的样式我们基本已经完成了,现在需要使用PyQt5中各个部件的其他内置属性来完成这个图形界面的最终美化工作。

设置窗口背景透明

透明的窗口背景会让图形界面有现代感和时尚感,我们来讲图形界面的窗口背景设为透明:

 
  1. self.setWindowOpacity(0.9) # 设置窗口透明度

  2. self.setAttribute(QtCore.Qt.WA_TranslucentBackground) # 设置窗口背景透明

运行程序代码,我们得到了一个观感很不一样的界面:

1e2238e2a9f576c589f3046d77480dc7e6d023f5

去除窗口边框

窗口背景设置为透明后的体验很不一样,但是那个默认的边框很不协调,那么去除丑丑的默认边框是必须要做的工作,通过窗口的setWindowFlag()属性我们可以设置窗口的状态从而把边框给隐藏了:

 
  1. self.setWindowFlag(QtCore.Qt.FramelessWindowHint) # 隐藏边框

为了避免隐藏窗口边框后,左侧部件没有背景颜色和边框显示,我们再对左侧部件添加QSS属性:

 
  1. QWidget#left_widget{

  2. background:gray;

  3. border-top:1px solid white;

  4. border-bottom:1px solid white;

  5. border-left:1px solid white;

  6. border-top-left-radius:10px;

  7. border-bottom-left-radius:10px;

  8. }

运行程序代码,一个完成度99%的图形界面就出来了:

d502fcebd35c55e1848143680580166be4cf26a3

之所以说完成度99%,因为可以发现图形界面中左侧部件和右侧部件中有一条缝隙,我们通过设置布局内部件的间隙来把那条缝隙去除掉:

 
  1. self.main_layout.setSpacing(0)

这样出现的图形界面中就没有那条碍眼的缝隙了:

079b2a1a1ac5cf114f48b8d01f06a5fe0a6f95a0

这样,我们对图形界面的美化工作就完成了。


原文发布时间为:2018-11-14

本文作者:州的先生

本文来自云栖社区合作伙伴“Python爱好者社区”,了解相关信息可以关注“Python爱好者社区”。

相关文章
|
2月前
|
数据可视化 数据挖掘 数据处理
Python数据可视化:利用Matplotlib打造精美图表
数据可视化在数据分析和展示中起着至关重要的作用,Matplotlib作为Python中最流行的数据可视化库之一,提供了丰富的绘图功能和灵活性。本文将介绍如何利用Matplotlib库来创建各种类型的精美图表,助力你更好地展示数据和分析结果。
|
2月前
|
数据可视化 Python
制作精美的饼图:Python 绘图技巧
制作精美的饼图:Python 绘图技巧
|
7月前
|
API 数据安全/隐私保护 Python
不到 20 行 Python 代码即可制作精美证件照
不到 20 行 Python 代码即可制作精美证件照
86 1
不到 20 行 Python 代码即可制作精美证件照
|
8月前
|
数据可视化 机器人 测试技术
精美可视化:Python自动化生成漂亮的测试报告
运用Python的Unittest、数据驱动测试(DDT)、Excel、Jinja2和HTML技术,构建一个能够自动生成精美可视化测试报告的自动化测试框架
精美可视化:Python自动化生成漂亮的测试报告
|
8月前
|
人工智能 API Python
用Python制作精美证件照~
用Python制作精美证件照~
408 0
|
8月前
|
数据可视化 Python
可视化 | Python绘制精美仪表盘
可视化 | Python绘制精美仪表盘
|
8月前
|
数据可视化 Python
可视化 | Python精美动态水球图
可视化 | Python精美动态水球图
|
数据可视化 Ubuntu 数据挖掘
Python绘制精美可视化数据分析图表(一)-Matplotlib
数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程.这一过程也是质量管理体系的支持过程.在实用中,数据分析可帮助人们作出判断,以便采取适当行动 在DT时代,数据分析是企业做出重要决策的基础,巧妇难为无米之炊,数据就是米,是数据分析基础中的基础,但是没有经过整理的数据,或许杂乱无章,没有任何意义,通过数据分析相关手段处理之后,让数据变得有意义,特别是整理后的数据经过可视化,更加直观,更容易,快速地找到问题所在,更有利于做出正确的决策,不至于在市场经营中处于被动局面.所以数据可视化也是我们数据分析中最重要的工具,也是最重要的一环
342 1
|
Linux Python Windows
windows python web flask 编写 Hello World
windows python web flask 编写 Hello World
windows python web flask 编写 Hello World
|
JSON 缓存 关系型数据库
linux python web flask 编写 Hello World
linux python web flask 编写 Hello World
linux python web flask 编写 Hello World