主窗体设计

news2024/11/25 13:40:58

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

Python、QT与PyCharm配置完成后,接下来需要对快手爬票的主窗体进行设计,首先需要创建主窗体外层为(红色框内),然后依次添加顶部图片(绿色框内)、查询区域(蓝色框内)、选择车次类型区域(紫色框内)、分类图片区域(黄色框内)、信息表格区域(棕色框内)。设计顺序如图17所示。

图17  窗体设计思路

(1)Qt拖曳控件

了解了窗体设计思路以后,接下来需要实现快手爬票的窗体。由于在14.4.2小节中已经将Python、QT与PyCharm三个开发工具进行了环境配置,所以创建窗体时只需要启动PyCharm开发工具即可,实现窗体的具体步骤如下:

1)在PyCharm开发工具中创建新的Python项目,并在右侧指定项目名称与位置,如图18所示。

图18  创建python项目

2)项目打开完成后,在顶部的菜单栏中依次单击Tools → External Tools → Qt Designer如图19所示。

图19  启动Qt Designer

3)单击Qt Designer快捷工具后,Qt的窗口编辑工具将自动打开,并且会自动弹出一个新建窗体的窗口,在该窗口中选择一个主窗体的模板,这里选择Main Window然后单击创建按钮即可,如图20所示。

图20  选择主窗体模板

4)主窗体创建完成后,自动进入到Qt Designer的设计界面,顶部区域是菜单栏与快捷菜单选项,左侧区域是各种控件与布局,中间的区域为编辑区域,该区域可以将控件拖曳至此处,也可以预览窗体的设计效果。右侧上方是对象查看器,此处列出所有控件以及彼此所属的关系层。右侧中间的位置是属性编辑器,此处可以设置控件的各种属性。右侧底部的位置分别为信号/槽编辑器、动作编辑器及资源浏览器,具体位置如图21所示。

图21  Qt Designer的设计界面

5)根据图11所示的设计思路依次将指定的控件拖拽至主窗体中,首先添加主窗体容器内的控件如表3所示。

表3  主窗体容器与控件

对 象 名 称

控 件 名 称

描    述

centralwidget

QWidget

该控件与对象名称是创建主窗体后默认生成,为主窗体外层容器

label_title_img

QLabel

该控件位于主窗体容器内,用于设置顶部图片、对象名称自定义

label_train_img

QLabel

该控件位于主窗体容器内,用于设置分类图片、对象名称自定义

tableView

QTableView

该控件位于主窗体容器内,用于显示信息表格、对象名称自定义

向主窗体中添加查询区域容器与控件,如表4所示。

表4  查询区域容器与控件

对 象 名 称

控 件 名 称

描  述

widget_query

QWidget

该控件位于用于显示查询区域,对象名称自定义,该控件为查询区域的容器

label

QLabel

该控件位于查询区域的容器内,用于显示“出发地:”文字、对象名称自定义

label_2

QLabel

该控件位于查询区域的容器内,用于查询区域的容器内,显示“目的地:”文字、对象名称自定义

label_3

QLabel

该控件位于查询区域的容器内,用于显示“出发日:”文字、对象名称自定义

pushButton

QPushButton

该控件位于查询区域的容器内,用于显示查询按钮,对象名称自定义

textEdit

QTextEdit

该控件位于查询区域的容器内,用于显示“出发地”所对应的编辑框、对象名称自定义

textEdit_2

QTextEdit

该控件位于查询区域的容器内,用于显示“目的地”所对应的编辑框、对象名称自定义

textEdit_3

QTextEdit

该控件位于查询区域的容器内,用于显示“出发日”所对应的编辑框、对象名称自定义

向主窗体中添加选择车次类型容器与控件,如表5所示。

表5  选择车次类型容器与控件

对 象 名 称

控 件 名 称

描    述

widget_checkBox

QWidget

该控件用于显示选择车次类型区域、对象名称自定义,该控件为选择车次类型区域的容器

checkBox_D

QCheckBox

该控件位于选择车次类型的容器内,用于选择动车类型、对象名称自定义

checkBox_G

QCheckBox

该控件位于选择车次类型的容器内,用于选择高铁类型、对象名称自定义

checkBox_K

QCheckBox

该控件位于选择车次类型的容器内,用于选择快车类型、对象名称自定义

checkBox_T

QCheckBox

该控件位于选择车次类型的容器内,用于选择特快类型、对象名称自定义

checkBox_Z

QCheckBox

该控件位于选择车次类型的容器内,用于选择直达类型、对象名称自定义

label_type

QLabel

该控件位于选择车次类型的容器内,用于显示“车次类型:”文字、对象名称自定义

说明:除了主窗体默认创建的QWidget控件外,其他每个QWidget就是一个显示区域的容器,都需要自行拖曳到主窗体当中,然后将每个区域对应的控件拖曳并摆放在当前的容器中即可。

注意:在拖曳控件时可以根据控件边缘的蓝色调节点设置控件的位置与大小,如图22所示。如果需要修改非常精确的参数值可以在属性编辑器中进行设置也可以在生成后的Python代码中对窗体的详细参数进行修改。在设置控件文字时,可以选中控件然后在右侧的属性编辑器的text标签中进行设置,如图23所示。

图22  拖曳控件与设置大小

图23  设置控件显示的文字

6)窗体设计完成后,按下<Ctrl+S>快捷键保存窗体设计文件名称为window.ui,然后需要将该文件保存在当前项目的目录当中,再选中该文件单击右键依次选择External Tools → PyUIC选项,将窗体设计的ui文件转换为py文件,如图24所示。转换后的py文件将显示在当前目录中,如图25所示。

图24  将ui文件转换为py文件

图25  显示转换后的py文件

(2)代码调试

打开window.py文件后,自动生成的代码中已经导入了PyQt5以及其内部的常用模块。PyQt5是一套Python绑定Digia QT5应用的框架,它可用于Python 2.x和3.x的版本中。它是功能最强大的GUI库之一,PyQt5的官方网站为“www.riverbankcomputing.co.uk/news”。PyQt5的类别分为多个模块,常见的模块与概述如表6所示。

表6  PyQt5的常见类别模块

模 块 名 称

描    述

QtCore

此模块用于处理时间、文件和目录、各种数据类型、流、URL、MIME类型、线程或进程

QtGui

此模块包含类窗口系统集成、事件处理、二维图形、基本成像、字体和文本,以及一套完整的OpenGL和OpenGL ES的绑定

QtWidgets

此模块中包含的类,提供了一组用于创建经典桌面风格用户界面的UI元素

QtMultimedia

此模块中包含的类,用于处理多媒体内容和API来访问的相机、收音机功能

QtNetwork

此模块中包含网络编程的类,通过这些类使网络编程更简单,更便携,便于TCP / IP和UDP客户端和服务器的编码

QtPositioning

此模块中包含的类,利用各种可能的来源,确定位置,包括卫星、Wi-Fi

QtWebSockets

此模块中包含实现WebSocket协议的类

QtXml

此模块中包含用于处理XML文件中的类,该模块为SAX和DOM API提供了解决方法

QtSvg

此模块中提供了用于显示SVG文件内容的类,(SVG)是可缩放矢量图形,用于描述XML中的二维图形的一种格式

QtSql

此模块提供了用于处理数据库的类

QtTest

此模块包含的功能为pyqt5应用程序的单元测试

下面通过代码来调试主窗体中各种控件的细节处理,以及相应的属性。具体步骤如下:

1)打开window.py文件,在右侧代码区域的setupUi()方法中修改主窗体的最大值与最小值,用于保持主窗体大小不变无法扩大或缩小。代码如下:

MainWindow.setObjectName("MainWindow")          # 设置窗体对象名称

MainWindow.resize(960, 786)                  # 设置窗体大小

MainWindow.setMinimumSize(QtCore.QSize(960, 786))    # 主窗体最小值

MainWindow.setMaximumSize(QtCore.QSize(960, 786))    # 主窗体最大值

self.centralwidget = QtWidgets.QWidget(MainWindow)    # 主窗体的widget控件

self.centralwidget.setObjectName("centralwidget")    # 设置对象名称

2)将图片资源img文件夹复制到该项目中,然后导入PyQt5.QtGui模块中的QPalette、QPixmap、QColor用于对控件设置背景图片,为对象名label_title_img的Label控件设置背景图片,该控件用于显示顶部图片。关键代码如下:

from PyQt5.QtGui import QPalette, QPixmap, QColor    # 导入QtGui模块

# 通过label控件显示顶部图片

self.label_title_img = QtWidgets.QLabel(self.centralwidget)

self.label_title_img.setGeometry(QtCore.QRect(0, 0, 960, 141))

self.label_title_img.setObjectName("label_title_img")

title_img = QPixmap('img/bg1.png')              # 打开顶部位图

self.label_title_img.setPixmap(title_img)        # 设置调色板

3)设置查询部分widget控件的背景图片,该控件起到容器的作用,在设置背景图片时并没有Label控件那么简单,首先需要为该控件开启自动填充背景功能,然后创建调色板对象,指定调色板背景图片,最后为控件设置对应的调色板即可。关键代码如下:

# 查询部分的widget

self.widget_query = QtWidgets.QWidget(self.centralwidget)

self.widget_query.setGeometry(QtCore.QRect(0, 141, 960, 80))

self.widget_query.setObjectName("widget_query")

# 开启自动填充背景

self.widget_query.setAutoFillBackground(True)

palette = QPalette()              # 调色板类

# 设置背景图片

palette.setBrush(QPalette.Background, QtGui.QBrush(QtGui.QPixmap('img/bg2.png')))

self.widget_query.setPalette(palette)      # 为控件设置对应的调色板即可

说明:根据以上两种设置背景图片的方法,分别为选择车次类型的widget控件与显示火车信息图片的Label控件设置背景图片。

4)通过代码修改窗体或控件文字时,需要在retranslateUi()方法中进行设置,关键代码如下:

MainWindow.setWindowTitle(_translate("MainWindow", "车票查询"))

self.checkBox_T.setText(_translate("MainWindow", "T-特快"))

self.checkBox_K.setText(_translate("MainWindow", "K-快速"))

self.checkBox_Z.setText(_translate("MainWindow", "Z-直达"))

self.checkBox_D.setText(_translate("MainWindow", "D-动车"))

self.checkBox_G.setText(_translate("MainWindow", "GC-高铁"))

self.label_type.setText(_translate("MainWindow", "车次类型:"))

self.label.setText(_translate("MainWindow", "出发地:"))

self.label_2.setText(_translate("MainWindow", "目的地:"))

self.label_3.setText(_translate("MainWindow", "出发日:"))

self.pushButton.setText(_translate("MainWindow", "查询"))

5)导入sys模块,然后在代码块的最外层创建show_MainWindow()方法,该方法用于显示窗体。关键代码如下:

def show_MainWindow():

    app = QtWidgets.QApplication(sys.argv)    # 实例化QApplication类,作为GUI主程序入口

    MainWindow = QtWidgets.QMainWindow()      # 创建MainWindow类

    ui = Ui_MainWindow()              # 实例UI类

    ui.setupUi(MainWindow)              # 设置窗体UI

    MainWindow.show()              # 显示窗体

    sys.exit(app.exec_())              # 当窗口创建完成,需要结束主循环过程

说明:sys模块是python自带的模块,该模块提供了一系列有关Python运行环境的变量和函数。sys模块的常见用法与含义如表7所示。

表7  sys模块的常见用法

常 见 用 法

描    述

sys.argv

该方法用于获取当前正在执行的命令行参数的参数列表

sys.path

该方法用于获取指定模块路径的字符串集合

sys.exit()

该方法用于退出程序,当参数非0时,会引发一个SystemExit异常,从而可以在主程序中捕获该异常

sys.platform

该方法用于获取当前系统平台

sys.modules

该方法是用于加载模块的字典,每当程序员导入新的模块时,sys.modules将自动记录该模块。当相同模块第二次导入时Python将从该字典中进行查询,从而加快程序的运行速度

sys.getdefaultencoding()

该方法用于获取当前系统编码方式

6)在代码块的最外层模拟Python的程序入口,然后调用显示窗体的show_MainWindow()方法。关键代码如下:

if __name__ == "__main__":

    show_MainWindow()

在该文件中右键菜单中单击“Run 'window'”将显示如图26所示的快手查票的主窗体界面。

图26  快手查票主窗体界面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1826456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows下的zip压缩包版Mysql8.3.0数据迁移到Mysql8.4.0可以用拷贝data文件夹的方式

Windows下的zip压缩包版Mysql8.3.0数据迁移到Mysql8.4.0可以用拷贝data文件夹的方式 拷贝后, 所有账户和数据都是一样的 步骤 停止MySQL服务 net stop mysql 或 sc.exe stop mysql net stop mysqlsc.exe stop mysql卸载 Mysql8.3.0 的服务 mysqld remove 或 mysqld remove m…

基于Matlab的车牌识别停车场出入库计时计费管理系统(含GUI界面)【W6】

简介&#xff1a; 在当今城市化进程加快的环境下&#xff0c;停车管理成为了一个日益重要和复杂的问题。城市中的停车资源有限&#xff0c;如何高效利用和管理这些资源&#xff0c;不仅关乎市民出行便利性&#xff0c;也涉及到城市交通拥堵、环境污染等诸多问题的解决。 传统的…

Linux DMA-Buf驱动框架

一、DMABUF 框架 dmabuf 是一个驱动间共享buf 的机制&#xff0c;他的简单使用场景如下&#xff1a; 用户从DRM&#xff08;显示驱动&#xff09;申请一个dmabuf&#xff0c;把dmabuf 设置给GPU驱动&#xff0c;并启动GPU将数据输出到dmabuf&#xff0c;GPU输出完成后&#xf…

Node.js和npm的安装及配置

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞 I/O 的模型。 npm&#xff08;node package manager&#xff09;是一个 Node.js 包管理和分发工具&#xff0c;也是整个 Node.js 社区最流行、支持第三方模块最多的包管理器。使…

HTML前端

html 超文本标记语言 文本&#xff1a;文字字符 超文本&#xff1a;网页内容 标记&#xff1a;标签 标识 提供许多标签&#xff0c;不同标签功能不同&#xff0c;网页就是通过这些标签描述出来的&#xff0c;最终由浏览器解释运行我们看到的网页 <!-- html注释<!DO…

kettle从入门到精通 第七十课 ETL之kettle kettle数据校验,脏数据清洗轻松拿捏

场景&#xff1a;输入在指定的错误(错误应涵盖数据类型不匹配的情况)行数内&#xff0c;trans不报错&#xff0c;但通过错误处理步骤捕捉&#xff0c;并记入文件&#xff0c;整个数据管线正常完成直至处理完最后一个输入行。 解决方案&#xff1a;使用步骤【数据检验】进行处理…

鸿蒙轻内核M核源码分析系列二一 03 文件系统LittleFS

2.2 文件信息数组操作 函数LfsAllocFd()设置文件信息数组元素信息。参数fileName为文件路径信息&#xff0c;传出参数fd为文件描述符即数组索引。遍历文件信息数组&#xff0c;遍历到第一个未使用的元素标记其为已使用状态&#xff0c;设置文件路径信息&#xff0c;把数组索引…

2000-2023年各省年末常住人口数据(无缺失)

2000-2023年各省年末常住人口数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;2000-2023年 2、来源&#xff1a;国家统计局、各省年鉴 3、指标&#xff1a;年末常住人口 4、范围&#xff1a;31省 5、指标解释&#xff1a; 年末人口数指每年12月31日24时的人口数。…

对抗式生成模仿学习(GAIL)

目录 1 预先基础知识 1.1 对抗生成网络&#xff08;GAN&#xff09; 1.1.1 基本概念 1.1.2 损失函数 1.1.2.1 固定G&#xff0c;求解令损失函数最大的D 1.1.2.2 固定D&#xff0c;求解令损失函数最小的G 1.2 对抗式生成模仿学习特点 2 对抗式生成模仿学习&#xff08;…

Java数据库编程

引言 在现代应用开发中&#xff0c;与数据库交互是不可或缺的一部分。Java提供了JDBC&#xff08;Java Database Connectivity&#xff09; API&#xff0c;允许开发者方便地连接到数据库并执行SQL操作。本文将详细介绍Java数据库编程的基础知识&#xff0c;包括JDBC的基本概念…

为什么 JavaScript 在国外逐渐用于前端+后端开发

这个问题其实没人能给出可证伪的结论&#xff0c;那不如干脆给一个感性的答案: 因为阿里“不争气”。 确切的说&#xff0c;因为阿里的nodejs团队没卷赢&#xff0c;至少暂时还没卷赢&#xff0c;没拿到真正有价值的业务场景&#xff0c;做出真正有说服力的案例项目。刚好我有…

如何进行LLM大模型推理优化

解密LLM大模型推理优化本质 一、LLM推理的本质以及考量点 LLM推理聚焦Transformer架构的Decoder以生成文本。过程分两步&#xff1a;首先&#xff0c;模型初始化并加载输入文本&#xff1b;接着&#xff0c;进入解码阶段&#xff0c;模型自回归地生成文本&#xff0c;直至满足…

邮件钓鱼--有无SPF演示--Swaks

目录 临时邮箱网址: Swaks 简单使用说明&#xff1a;(kali自带) 操作流程: 无SPF:(直接伪造发信人) 演示1 演示2 演示3 ​编辑 有SPF:--演示 临时邮箱网址: http://24mail.chacuo.net/ https://www.linshi-email.com/ Swaks 简单使用说明&#xff1a;(kali自带) -t –t…

专题六——模拟

目录 一替换所有的问号 二提莫攻击 三N字形变换 四外观数列 五数青蛙 一替换所有的问号 oj链接&#xff1a;替换所有的问号 思路&#xff1a;简单模拟&#xff1b;注意i0和in是处理越界问题就行&#xff01;&#xff01; class Solution { public:string modifyString…

基于scikit-learn的机器学习分类任务实践——集成学习

一、传统机器学习分类流程与经典思想算法简述 传统机器学习是指&#xff0c;利用线性代数、数理统计与优化算法等数学方式从设计获取的数据集中构建预测学习器&#xff0c;进而对未知数据分类或回归。其主要流程大致可分为七个部分&#xff0c;依次为设计获取数据特征集&#x…

Reactor 网络模型、Java代码实例

文章目录 1. 概述2. Reactor 单线程模型2.1 ByteBufferUtil2.2 服务端代码2.3 客户端2.4 运行截图 3. Reactor多线程模型3.1 服务端代码3.2 运行截图 4. 主从 Reactor多线程模型4.1 服务端代码4.2 运行截图 参考文献 1. 概述 在 I/O 多路复用的场景下&#xff0c;当有数据处于…

ChatTTS-WebUI测试页面项目

概述 分享可以一个专门为对话场景设计的文本转语音模型ChatTTS&#xff0c;例如LLM助手对话任务。它支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练。在HuggingFace中开源的版本为4万小时训练且未SFT的版本. 该模型能够预测和控制细粒度的韵律特…

跪求大数据把我推给做投资交易的红薯!

在qq群里认识了君诺金融Juno Markets外汇交易平台的业务经理&#xff0c;平台上大剌剌的打出20%交易返现活动&#xff0c;一时听信了他们的话在该平台有开户入金做交易&#xff0c;做了这家平台的代理&#xff0c;然而君诺金融Juno Markets平台却不给佣金&#xff0c;我都是属于…

浏览器必备插件:最新Allow copy万能网页复制下载,解锁网页限制!

今天阿星给大家安利一个超级实用的小工具&#xff0c;专治那些“禁止复制”的网页文字。学生党、资料搜集狂人&#xff0c;你们有福了&#xff01; 想象一下&#xff0c;你在网上冲浪&#xff0c;突然遇到一篇干货满满的文章&#xff0c;正想复制下来慢慢品味&#xff0c;结果…

值传递和址传递

值传递 上面的代码是想要交换x&#xff0c;y的值&#xff0c;把x&#xff0c;y传递给swap函数之后&#xff0c;执行下面的操作&#xff1a; 在swap中a和b交换了&#xff0c;但是和x&#xff0c;y没有关系&#xff0c;所以x&#xff0c;y在main中不会变。 址传递 下面再看把x…