用Qt学着做个界面

导读

既然我们已经知道了一点点Python的基础,那么我们现在试着做一点基础的GUI界面试试看吧。

使用环境

首先说一下我所使用的环境:

  • Ubuntu 20.04 20.04 20.04
  • Python 3.8.5 3.8.5 3.8.5
  • Microsoft Visual Studio Code 1.52.1 1.52.1 1.52.1
  • Microsoft官方提供的适用于Microsoft Visual Studio CodePython拓展包(名字就是Python

由于是Ubuntu系统,可能和Windows有一些出入,但是不需要配环境确实方便。

一个窗体

好的,我们来根据这个不确定是不是官方文档的教程来试一个简单的窗体程序:

# version 1
import sys
from PyQt5.Qt import Qt
from PyQt5.QtWidgets import QApplication, QWidget

# 通过继承,构造一个自定义的窗体
class QWindow(QWidget):
  def __init__(self, parent = None, flags = Qt.WindowFlags()):
    super().__init__(parent = parent, flags = flags)
    # 规定窗体宽度、高度
    # 同时规定屏幕宽度、高度,便于中心定位
    self.WINDOW_WIDTH = 500
    self.WINDOW_HEIGHT = 300
    self.SCREEN_WIDTH = 1920
    self.SCREEN_HEIGHT = 1080
    self.x = int((window.SCREEN_WIDTH - window.WINDOW_WIDTH) / 2)
    self.y = int((window.SCREEN_HEIGHT - window.WINDOW_HEIGHT) / 2)
    pass
  pass
 
if __name__ == '__main__':
  # 创建应用主线程,其中sys.argv是从命令行传入的参数(一般应用不常用)
  app = QApplication(sys.argv)
  # 创建主窗体
  window = QWindow()
  # 尺寸设置
  window.resize(window.WINDOW_WIDTH, window.WINDOW_HEIGHT)
  # 移动到指定的位置
  window.move(window.x, window.y)
  # 设置窗体标题
  window.setWindowTitle('example')
  # 显示窗体
  window.show()
  # 限制整个程序只能在主线程结束后结束,否则窗体会闪退
  sys.exit(app.exec_())
  pass

真实的效果就像这样:

窗体效果

看起来还不错。在Ubuntu系统中的默认主题就是这样的样式,和Windows稍稍有些区别。

加上按钮

既然结果还行,那让我们来加点东西。就先加个按钮吧,等之后再把事件绑上去。

注:以下代码version 2和上面version 1有区别的地方就在于添加注释的地方

# version 2
import sys
from PyQt5.Qt import Qt
# 增加QGridLayout库
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QGridLayout

class QWindow(QWidget):
  def __init__(self, parent = None, flags = Qt.WindowFlags()):
    super().__init__(parent = parent, flags = flags)
    self.WINDOW_WIDTH = 500
    self.WINDOW_HEIGHT = 300
    self.SCREEN_WIDTH = 1920
    self.SCREEN_HEIGHT = 1080
    self.x = int((self.SCREEN_WIDTH - self.WINDOW_WIDTH) / 2)
    self.y = int((self.SCREEN_HEIGHT - self.WINDOW_HEIGHT) / 2)
    # 定义一个按钮的实例
    self.btn = QPushButton('test button')
    # 定义容纳按钮的布局
    self.window_grid_layout = QGridLayout()
    # 设置这个布局的位置和大小
    self.window_grid_layout.setContentsMargins(0, 0, 0, 0)
    # 将定义的按钮塞进布局
    self.window_grid_layout.addWidget(self.btn, 0, 0, 1, 1)
    # 将窗体布局设为构建的布局
    self.setLayout(self.window_grid_layout)
    pass
  pass
 
if __name__ == '__main__':
  app = QApplication(sys.argv)
  window = QWindow()
  window.resize(window.WINDOW_WIDTH, window.WINDOW_HEIGHT)
  window.move(window.x, window.y)
  window.setWindowTitle('example')
  window.show()
  sys.exit(app.exec_())
  pass

于是,就有了这样的效果:

窗体效果

看上去还行

方法封装

但是窗体不能只有一个按钮,还得有标签、按钮、下拉框等等。

于是我们再回头看看我们代码中设置控件的地方:

# 定义一个按钮的实例
self.btn = QPushButton('test button')
# 定义容纳按钮的布局
self.window_grid_layout = QGridLayout()
# 设置这个布局的位置和大小
self.window_grid_layout.setContentsMargins(0, 0, 0, 0)
# 将定义的按钮塞进布局
self.window_grid_layout.addWidget(self.btn, 0, 0, 1, 1)
# 将窗体布局设为构建的布局
self.setLayout(self.window_grid_layout)

设置控件,一行;将控件添加进布局,一行。这样两行不停的交替,也许会有人喜欢,但是我是坚决不会允许的。我会将控件设置专门放在一起,将布局设置专门放在一起,最后再把布局塞入窗体,就像下面这样:

# version 3
import sys
from PyQt5.Qt import Qt
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QGridLayout

class QWindow(QWidget):
  def __init__(self, parent = None, flags = Qt.WindowFlags()):
    super().__init__(parent = parent, flags = flags)
    self.WINDOW_WIDTH = 500
    self.WINDOW_HEIGHT = 300
    self.SCREEN_WIDTH = 1920
    self.SCREEN_HEIGHT = 1080
    self.x = int((self.SCREEN_WIDTH - self.WINDOW_WIDTH) / 2)
    self.y = int((self.SCREEN_HEIGHT - self.WINDOW_HEIGHT) / 2)
    self.window_grid_layout = QGridLayout()
    self.window_grid_layout.setContentsMargins(0, 0, 0, 0)
    # 按照顺序执行三个方法
    self.init_layout()
    self.set_layout()
    self.finish_layout()
    pass
  # 定义控件
  def init_layout(self):
    self.btn = QPushButton('test button')
    pass
  # 设置控件的位置
  def set_layout(self):
    self.window_grid_layout.addWidget(self.btn, 0, 0, 1, 1)
    pass
  # 结束控件设置
  def finish_layout(self):
    self.setLayout(self.window_grid_layout)
    pass
  pass
 
if __name__ == '__main__':
  app = QApplication(sys.argv)
  window = QWindow()
  window.resize(window.WINDOW_WIDTH, window.WINDOW_HEIGHT)
  window.move(window.x, window.y)
  window.setWindowTitle('example')
  window.show()
  sys.exit(app.exec_())
  pass

这样就看起来更简洁了!如果出现了问题,也能够快速定位出现问题的方法。

QSS样式美化

如果你对Web前端比较熟悉,那么你一定知道CSS3。强大的样式表让我们能够做到很多事。同样的,PyQt5也有类似的QSS,但是却相对CSS3缺少很多强大的效果。

我们可以类比CSS3写一点点样式表,命名为style.qss,和窗体文件一起放在pyqt5文件夹里:

QPushButton {
  /* 边框 */
  border: 1px solid black;
  /* 背景 */
  background: white;
  /* 字体颜色 */
  color: olive;
  /* 字体大小 */
  font-size: 20px;
  /* 控件高度 */
  height: 40px;
}

由于Python3Ubuntu系统中不支持相对路径,所以我们需要使用其他的库:os,其中的getcwd()方法能够获得当前工作区的绝对路径。注意,是工作区,而不是当前文件。也就是说,os.getcwd()方法只能够获得该文件所在文件夹的绝对路径,获取的地址还得加上当前文件夹名字。

于是,加上QSS美化的代码就像是这样:

注:以下代码段version 4和上面version 3仅在于添加注释的地方有区别

# version 4
# 获取路径的库
import os
import sys
from PyQt5.Qt import Qt
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QGridLayout

class QWindow(QWidget):
  def __init__(self, parent = None, flags = Qt.WindowFlags()):
    super().__init__(parent = parent, flags = flags)
    self.WINDOW_WIDTH = 500
    self.WINDOW_HEIGHT = 300
    self.SCREEN_WIDTH = 1920
    self.SCREEN_HEIGHT = 1080
    self.x = int((self.SCREEN_WIDTH - self.WINDOW_WIDTH) / 2)
    self.y = int((self.SCREEN_HEIGHT - self.WINDOW_HEIGHT) / 2)
    self.window_grid_layout = QGridLayout()
    self.window_grid_layout.setContentsMargins(0, 0, 0, 0)
    self.init_layout()
    self.set_layout()
    self.finish_layout()
    # 将读取的内容作为样式表美化控件
    self.setStyleSheet(self.load_qss())
    pass

  def init_layout(self):
    self.btn = QPushButton('test button')
    pass

  def set_layout(self):
    self.window_grid_layout.addWidget(self.btn, 0, 0, 1, 1)
    pass

  def finish_layout(self):
    self.setLayout(self.window_grid_layout)
    pass

  def load_qss(self):
    # 获取路径并读取文件
    with open(os.getcwd() + '/pyqt5/style.qss') as q:
      return q.read()
      pass
    pass
  pass
 
if __name__ == '__main__':
  app = QApplication(sys.argv)
  window = QWindow()
  window.resize(window.WINDOW_WIDTH, window.WINDOW_HEIGHT)
  window.move(window.x, window.y)
  window.setWindowTitle('example')
  window.show()
  sys.exit(app.exec_())
  pass

于是效果就像是这样:

窗体样式

看上去没毛病

第三方美化插件

但是这样的界面稍微有点单调,再加一点小图标怎么样?

如果你做过Web项目,那么你应该知道font-awesome。这是个非常不错的字体库。当然,也有大佬把这些字体库放在了PyQt中,就是qtawesome

当然,这个是第三方库,所以我们需要另外使用pip安装:

pip3 install qtawesome

然后就开始写代码。注:以下代码version 5修改的地方和上面version 3相比只有导包和注释处有改动

# version 5
import sys
from PyQt5.Qt import Qt
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QGridLayout
# 添加代码库
import qtawesome as qta

class QWindow(QWidget):
  def __init__(self, parent = None, flags = Qt.WindowFlags()):
    super().__init__(parent = parent, flags = flags)
    self.WINDOW_WIDTH = 500
    self.WINDOW_HEIGHT = 300
    self.SCREEN_WIDTH = 1920
    self.SCREEN_HEIGHT = 1080
    self.x = int((self.SCREEN_WIDTH - self.WINDOW_WIDTH) / 2)
    self.y = int((self.SCREEN_HEIGHT - self.WINDOW_HEIGHT) / 2)
    self.window_grid_layout = QGridLayout()
    self.window_grid_layout.setContentsMargins(0, 0, 0, 0)
    self.init_layout()
    self.set_layout()
    self.finish_layout()
    pass

  def init_layout(self):
    # 在构建按钮的时候添加QIcon
    # 这个意思是:使用fa5库中的实心图标(Solid),并且涂上橄榄色(olive)
    self.btn = QPushButton(qta.icon('fa5s.cannabis', color='olive'), 'test button')
    pass

  def set_layout(self):
    self.window_grid_layout.addWidget(self.btn, 0, 0, 1, 1)
    pass

  def finish_layout(self):
    self.setLayout(self.window_grid_layout)
    pass
  pass
 
if __name__ == '__main__':
  app = QApplication(sys.argv)
  window = QWindow()
  window.resize(window.WINDOW_WIDTH, window.WINDOW_HEIGHT)
  window.move(window.x, window.y)
  window.setWindowTitle('example')
  window.show()
  sys.exit(app.exec_())
  pass

于是就变成了这样:

窗体样式

看着还行

是不是有点能理解了呢?

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的学习管理界面的设计: 首先,我们需要在主窗口中添加一个 QTabWidget 控件,用于切换不同的功能页面。比如,我们可以创建三个选项卡,分别为“学生管理”、“课程管理”和“成绩管理”。 对于“学生管理”页面,我们可以添加以下控件: 1. QLabel:用于显示“学生信息”标题; 2. QTableWidget:用于显示学生列表,包括学生编号、姓名、性别、年龄等信息; 3. QPushButton:用于添加、修改、删除学生信息; 4. QLineEdit:用于搜索学生信息。 对于“课程管理”页面,我们可以添加以下控件: 1. QLabel:用于显示“课程信息”标题; 2. QTableWidget:用于显示课程列表,包括课程编号、课程名称、授课教师等信息; 3. QPushButton:用于添加、修改、删除课程信息; 4. QLineEdit:用于搜索课程信息。 对于“成绩管理”页面,我们可以添加以下控件: 1. QLabel:用于显示“成绩信息”标题; 2. QTableWidget:用于显示成绩列表,包括学生编号、课程编号、成绩等信息; 3. QPushButton:用于添加、修改、删除成绩信息; 4. QLineEdit:用于搜索成绩信息。 在每个页面中,我们还可以添加一些其他的控件,比如下拉列表框、多选框等,用于帮助用户进行数据筛选和操作。 最后,我们需要编写相应的逻辑代码,用于实现添加、修改、删除、搜索等操作。可以使用 Qt 的信号槽机制来实现界面和逻辑之间的交互。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ordinary_brony

代码滞销,救救码农

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值