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. 使用更明确的导入方式,会有助于代码的可读性,避免不必要的模块加载,减少潜在的时间和空间开销,同时较少命名冲突的风险,这种情况在大型项目中更为明显。
相关推荐
马克学长1 小时前
SSM桐梓娄山书店管理系统6k3s6(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·用户管理·ssm框架·书店管理系统
老华带你飞1 小时前
博物馆展览门户|基于Java博物馆展览门户系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端
liulilittle1 小时前
FileStream C++
开发语言·c++·cocoa
点PY1 小时前
C++ 中 std::async 和 std::future 的并发性
java·开发语言·c++
不会代码的小猴1 小时前
C++的第九天笔记
开发语言·c++·笔记
傻啦嘿哟2 小时前
Python安全实践:使用加密的XML配置文件保护敏感数据
数据库·oracle
一 乐2 小时前
人事管理系统|基于Springboot+vue的企业人力资源管理系统设计与实现(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·spring boot·后端
SelectDB2 小时前
浙江头部城商行:每日 700 万查询、秒级响应,Apache Doris 查算分离架构破局资源冲突
数据库·后端·apache
CoderYanger2 小时前
Java SE——12.异常(≠错误)《干货笔记》
java·开发语言
Data_agent2 小时前
1688获得1688店铺所有商品API,python请求示例
java·开发语言·python