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. 使用更明确的导入方式,会有助于代码的可读性,避免不必要的模块加载,减少潜在的时间和空间开销,同时较少命名冲突的风险,这种情况在大型项目中更为明显。
相关推荐
重生之我是数学王子6 分钟前
网络编程 UDP编程 Linux环境 C语言实现
linux·c语言·开发语言·网络·网络协议·udp
许灵均均6 分钟前
数据库视图
数据库
何曾参静谧35 分钟前
「C/C++」C/C++标准库 之 #include<cstddef> 常用定义和宏
c语言·开发语言·c++
木宇(记得热爱生活)36 分钟前
C++ <string> 标头文件详解
开发语言·c++
大哇唧1 小时前
python批量合并excel文件
开发语言·python·excel
on the way 1231 小时前
java.io.IOException: Too many open files
java·开发语言
你有抖音吗1 小时前
【每日 C/C++ 问题】
开发语言·c++
大鲤余1 小时前
rust 中if let、match -》 options和Result枚举类型
开发语言·后端·rust
raoxiaoya2 小时前
python安装selenium,geckodriver,chromedriver
开发语言·python·selenium
engchina2 小时前
Neo4j数据库清理指南:如何安全地删除所有节点和索引
数据库·neo4j