PyQt5实战——多脚本集合包,程序入口QMainWindow(三)

个人博客:苏三有春的博客

系列往期文章:
PyQt5实战------多脚本集合包,前言与环境配置(一)
PyQt5实战------多脚本集合包,UI以及工程布局(二)

PyQt程序入口(QMainWindow)

main.py是程序的入口,程序最开始运行的文件,在这个文件中,需要完成以下几件事:

  • 创建一个MainWindow(主窗口)
  • 设置主窗口的标题,图标
  • 设置窗口的主体(centralWidget)
  • 设置窗口的状态栏
  • 创建workspaces目录
  • 运行窗口
python 复制代码
import sys
import os 
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

import PrimeWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Script Tools")
        self.setWindowIcon(QIcon("_internal/res/icon/icon.ico"))
        centralWidget = PrimeWindow.PrimeWindow()
        self.setCentralWidget(centralWidget)
        self.addStatusBar()


    def addStatusBar(self):
        self.statusBar = QStatusBar()
        self.statusWidget = QWidget()
        self.statusLayout = QHBoxLayout()
        self.copyrightlable = QLabel("© Author: LyricalRover. All rights reserved.")
        self.versionlable = QLabel("Last updated: 2024-10-18. Version: 1.3.1")
        self.statusLayout.addWidget(self.copyrightlable)
        self.statusLayout.addStretch()
        self.statusLayout.addWidget(self.versionlable)
        self.statusWidget.setLayout(self.statusLayout)
        self.statusBar.addWidget(self.statusWidget)
        self.setStatusBar(self.statusBar)



if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    if not os.path.exists("workspaces"):
        os.makedirs("workspaces")
    w.show()
    app.exec()

最开始进入的地方是:if__name__ == "main":

app = QApplication(sys.argv)初始化应用程序对象

1. QApplication

  • QApplication 是 Qt 应用程序的主类,负责管理应用程序的控制流和主要设置。
  • 它处理应用程序的主事件循环,并为 GUI 元素提供必要的支持。
  • 每个使用 Qt 的应用程序通常需要一个 QApplication 实例。

2. sys.argv 的作用

  • sys.argv 是一个列表,包含命令行参数。这些参数是在运行 Python 脚本时传递的。
  • QApplication 可以使用这些参数来配置应用程序的行为,例如窗口大小、样式等。

3. 初始化应用程序

通过 app = QApplication(sys.argv),你完成了以下几个步骤:

  • 创建应用程序对象 :这行代码创建了一个 QApplication 的实例,并将命令行参数传递给它。
  • 设置事件循环:这个实例负责管理 GUI 的事件循环,使得应用程序能够响应用户输入和事件(例如鼠标点击、键盘输入等)。
  • 为应用程序提供上下文QApplication 提供了关于应用程序的信息,例如样式、主题、字体等。

创建MainWindow对象,即运行上面的class中的代码

def __init__中,设置窗口的标题,设置窗口的图标,在这里可以看到,设置图标的路径是:_internal/res/icon/icon.ico ,但我们并没有创建这个__internal的目录,回顾环境配置中pyinstaller部分的讲解:"pyinstaller在v6.0版本以后,数据将被移动到__internal目录下",也就是说,如果我们打包程序形成exe文件后,想要文件能够正确找到icon的地址,则必须在你写的地址前加上__internal目录,配合上打包时的参数,-add-data "icon.ico;__internal/res/icon/icon.ico",就可以在打包后显示正常的图标。

python 复制代码
centralWidget = PrimeWindow.PrimeWindow()

上面的代码是创建一个UI主体,该主体是PrimeWindow对象,这个类在PrimeWindow.py中,这个主体内具体是怎样的后面会讲到。

addStatusBar的结构如下图所示:

左右分别是两个label的Widget,分别装了两条信息,中间用addStretch弹簧将两个label分压向两侧。

理想很丰满,现实很骨感,实际上并没有呈现出这样一个操作,我猜测应该是有另一个东西阻碍了StatusBar,并没有完整占据整个窗口的下方,也就是说,StatusBar本身被压缩了,导致versionlabel并没有被压向窗口主体的右侧。但具体原因尚不明朗。

还有一点值得注意的是:

我在引入第三方库的时候因为偷懒使用了"*",即:from PyQt5.QtWidgets import *等。

建议使用了什么就引入import什么,而不是为了图方便而直接使用"*",理由如下:

  1. python模块的导入实际上是通过import来进行导入的,一个模块一旦被导入,后续的导入操作则直接从缓存中读出,而不会重复导入,这就说明,在初次操作时,需要加载导入内容,如果使用"*",初次导入的时间开销会更多一些,但后续的性能差别并不明显。
  2. 由于import *会导入所有的公共成员,因此它可能会占用更多的内存,因此空间开销会更大。
  3. 使用更明确的导入方式,会有助于代码的可读性,避免不必要的模块加载,减少潜在的时间和空间开销,同时较少命名冲突的风险,这种情况在大型项目中更为明显。
相关推荐
科技道人4 小时前
记录 默认置灰/禁用 app ‘Search Engine Selector‘ 的disable按钮
开发语言·前端·javascript
AI-好学者6 小时前
阶段一-图数据库基础与PropertyGraph模型
数据库·rag·knowledge graph·graphrag
逝水无殇7 小时前
C# 异常处理详解
开发语言·后端·c#
其实防守也摸鱼7 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚7 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
龙仔7257 小时前
SQL Server 创建只读账号完整操作(分两种场景:SSMS图形界面 + T-SQL脚本)
数据库·sql·oracle
霁月的小屋7 小时前
生产环境中的事务实践——银行系统上线记(四)
数据库
Database_Cool_8 小时前
AI 应用数据底座首选:阿里云 PolarDB 为大模型 RAG 提供一体化支撑
数据库·阿里云
玖玥拾8 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
铅笔侠_小龙虾8 小时前
Rust 学习目录
开发语言·学习·rust