前言

在做一个数据分析的桌面端程序遇到一些问题,这里简单整理下,分享出来供使用者参考。

1、网上查使用PyQt5工具栏的示例,发现很多只是一个简单的退出功能,如果有几个按钮如何处理?如何区分点击的究竟是哪个按钮?

2、使用Eric6开发的界面,实行的是界面和代码分离,那么在桌面端项目应用中如何集成到一起?

软件环境:

Python 3.5+Eric6+PyQt5

OS:Windows

项目需求:

1、点击菜单项,打开一个新窗体

2、点击工具栏上的某一按钮,打开相应的窗体

3、点击某一个菜单项,打开相应的窗体

设计:

作为示例,这里命名菜单项:

主菜单项:File、Help

子菜单项:New 、Open、Save、Exit

工具栏项:New、Open、Save

参考步骤:

1、准备,这里假定开发环境已经搭建、配置好了。

2、建立项目文件夹:PyQt5_Test1

在这个文件夹里,再放一个images文件夹,里面放一些作为图标文件的png文件

下载图标文件,可从下面网址下载:

http://www.easyicon.net

3、建立项目

启动Eric6,点顶端菜单项Project,点New,如下图,设置Project Name,PyQt5_Test1,点2处的图标按钮,选择项目文件夹,点OK按钮

4、系统会提示是否增加已有文件,因为是新建项目,没有待增加的文件,所以点No即可

刚建好的项目如下,系统自动生成一个_init_.py空文件

5、创建主窗体

点图标,选择窗体页签,点鼠标右键,点选New form菜单项

6、form type 选择Main Window

7、文件名命名为:QMainWindow,点保存按钮

8、至此,会进入Qt 设计师,鼠标点中窗体中见,点鼠标右键,分别点选“创建菜单栏”和“添加工具栏”菜单项

3、增加菜单项

一级菜单项:File

二级菜单项:New、Open、Save、Exit

在建立菜单项的时候,给菜单项命名,在右侧的属性编辑器里分别命名为actionNew、actionOpen、actionSave、actionExit

在Exit菜单项上面增加一个分隔符

点选Exit菜单项,点鼠标右键,再点选插入分隔符

9、给菜单项增加图标,以增加美观

选种某个菜单项,在右面的属性编辑器里,找到icon这一行,点右侧的下拉三角图标,选择images里的png图标文件

10、比照前面的增加菜单的方式,增加Help菜单项

11、工具栏的设计,在Qt 设计师里,不能像菜单栏那样直接增加,可在代码里添加,点鼠标右键,点添加“工具栏”

在窗体顶部会增加一个工具栏的横条,如下图

12、在Qt 设计师里,点顶部的菜单保存按钮

13、上面设计好了主窗体,下面再分别增加几个子窗体,在点击菜单项的时候,我们这里只是打开一个相应的新窗体,围绕着前面前言里讲的问题和项目需求进行讲解,不再往下拓展后续功能的实现。

参照前面第5步,点窗体标签,点New form,form type选择Widget,前面第5步建立主窗体选择的是MainWindow

文件命名为NewForm,点保存按钮

从左侧工具栏,拖一个按钮到窗体界面上,在右侧的属性编辑器,objectName命名为btn_Exit,text命名为Exit,icon从images里选择btn_Exit.png图标

点Qt 设计师顶部的保存按钮,关闭Qt设计师

14、参照上面这一步,分别建立子窗体OpenForm、SaveForm、HelpForm、AboutForm

建好以后,窗体界面文件如下:

前面是窗体界面设计,下面开始代码编辑

15、首先选中QMainWindow.ui文件,点鼠标右键,点选Generate Dialog code

如下图,点className右面的New ,给className命名为MainWindow,生成的文件名为:QMainWindow.py

给每一个菜单项绑定槽函数,勾选on_actionXXX_triggered()

16、给子窗体绑定槽函数

以NewForm为例,点选NewForm.ui,点选generate Dialog Code,点New按钮,默认的className为Form,更改为NewForm,点OK 按钮

绑定槽函数,勾选on_btn_Exit_clicked()

17、参照上一步分别点选OpenForm.ui、SaveForm.ui、HelpForm.ui、AboutForm.ui,点选Generate Dialog Code,创建类文件,并分别勾选槽函数

18、从ui文件转化生成py界面文件,点中任一个ui文件,比如QMainWindow.ui,点鼠标右键,编译,点Compile all files。

如果是单个文件,则点选compile form菜单项。如果修改了某个界面ui文件,则重新编译,以更新生成的界面文件

切换到代码页,点页签,则可以看到系统生成了对应的ui_xxxxxx.py文件

在系统运行中,运行的是这些xxx.py文件,而不包括xxx.ui文件

19.本项目的入口文件是QMainWindow.py,双击打开QMainWindow.py,开始编辑

1)、把from .Ui_QMainWindow import Ui_MainWindow这一句Ui前面的点“.”去掉

from Ui_QMainWindow import Ui_MainWindow

2)、注释掉各个槽函数里的raise NotImplementedError

3)、由于本项目是从QMainWindow.py启动,所以,需要实例化窗体类,增加下面代码

if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
mainForm = MainWindow()
mainForm.show()
sys.exit(app.exec_())

4)、导入模块QWidgets

from PyQt5 import QtWidgets

5)、增加导入模块QMessageBox

from PyQt5.QtWidgets import QMainWindow, QAction, QMessageBox 

6)、给菜单项Exit的槽函数里增加退出系统的代码

    @pyqtSlot()
def on_actionExit_triggered(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
#raise NotImplementedError
print("Click Menu Exit")
reply = QMessageBox.question(self, "标题", "确定要退出系统吗?",
QMessageBox.Yes|QMessageBox.No) if reply == QMessageBox.Yes:
sys.exit(0)

7)、试运行,点顶部工具栏里的运行图标

注意下图中路径和文件名是否正确,不正确则需修改

试运行结果如下:

 

20、点击菜单项,打开相应的子窗体

点击每一个子菜单项,打开一个子窗体,

A、编辑子窗体的业务逻辑代码

B、需在QMainWindow.py里进行下面三步:

1)、导入子窗体的业务逻辑代码

2)、实例化子窗体类

3)、编辑连接菜单项的槽函数

以打开NewForm为例

21、双击打开NewForm.py

1)、把from .Ui_NewForm import Ui_Form里Ui前的点去掉

2)、注释掉槽函数里的raise NotImplementedError

3)、给按钮Exit增加代码

self.close()

22、编辑QMainWindow.py,双击打开

1)、导入NewForm模块

2)、实例化NewForm子窗体类

3)、编辑槽函数

    @pyqtSlot()
def on_actionNew_triggered(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
#raise NotImplementedError
subForm1.show()

试运行,结果如下:

23、参照第21、22步,分别编辑OpenForm.py、SaveForm.py、HelpForm.py、AboutForm.py,然后编辑QMainWindow.py,以点击按钮打开相应子窗体

24、增加工具栏按钮

1)导入QAction,QIcon模块

from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow, QMessageBox , QAction
from PyQt5 import QtWidgets
from PyQt5.QtGui import QIcon

2)、在 def __init__(self, parent=None):里进行编辑

    def __init__(self, parent=None):
"""
Constructor @param parent reference to the parent widget
@type QWidget
"""
super(MainWindow, self).__init__(parent)
self.setupUi(self) #工具栏
# 添加打开tool 在pyqt5里面是一个action
tb1 = QAction(QIcon("./images/menuNew.png"), "New", self)
self.toolBar.addAction(tb1)
tb2 = QAction(QIcon("./images/MenuOpen.png"), "Open", self)
self.toolBar.addAction(tb2)
tb3 = QAction(QIcon("./images/MenuSave.png"), "Save", self)
self.toolBar.addAction(tb3)

其中toolBar对应的是窗体界面文件MainWindow.ui里添加的工具栏的对象名称,如果工具栏的对象名称修改了,那么上面代码里self.toolBar中的toolBar也要相应更新

运行过以后如下图:

3)、增加点击不同工具栏按钮,打开相应窗体的代码

增加自定义的槽函数

def toolBtnPressed(self,qaction):
print("pressed too btn is",qaction.text())
if qaction.text()=="New":
print("Click ToolBar New Button")
subForm1.show()
subForm1.InitForm()
elif qaction.text()=='Open':
print("Click ToolBar Open Button")
subForm2.show()
subForm2.InitForm()
elif qaction.text()=='Save':
print("Click ToolBar Save Button")
subForm3.show()
subForm3.InitForm()

建立与槽函数的连接,在 def __init__(self, parent=None):里增加下面代码

        #连接槽函数
self.toolBar.actionTriggered[QAction].connect(self.toolBtnPressed)

25、增加状态栏

1)、打开MainWindow.ui,点鼠标右键,增加状态栏

2)、在QMainWindow.py的 def __init__(self, parent=None):里增加下面代码:

        #状态栏
self.statusBar.showMessage('XXXXXX Support')

附件:

本项目代码上传到了百度网盘:

链接: https://pan.baidu.com/s/1e-ho9k6vdk-0Hw9VkIAbKA  提取码:7j2v

PyQt5+Eric6开发的一个使用菜单栏、工具栏和状态栏的示例的更多相关文章

  1. python3.5 + PyQt5 +Eric6 实现的一个计算器

    目前可以实现简单的计算.计算前请重置,设计的时候默认数字是0,学了半天就做出来个这么个结果,bug不少. python3.5 + PyQt5 +Eric6 在windows7 32位系统可以完美运行 ...

  2. 三、PyQt5不同方法创建菜单栏、工具栏和状态栏

    创建菜单栏.工具栏和状态栏可以直接通过代码实现,也可以通过Qt Designer中的属性编辑器等实现.通过两种方法的学习可以加深理解,更好的掌握PyQt5. 一.菜单栏与状态栏 状态栏的设置比较简单, ...

  3. 【Qt开发】菜单栏,工具栏和状态栏

    概述 菜单栏,工具栏,状态栏应用中经常见到,下图解释一目了然,实际开发中 两种方式来实现,一种是使用纯代码QMenuBar,QToolBar,QStatusBar来设计开发,另一种使用Qt Desig ...

  4. Qt 学习之路 :菜单栏、工具栏和状态栏

    在之前的<添加动作>一文中,我们已经了解了,Qt 将用户与界面进行交互的元素抽象为一种“动作”,使用QAction类表示.QAction可以添加到菜单上.工具栏上.期间,我们还详细介绍了一 ...

  5. Qt 学习之路 2(12):菜单栏、工具栏和状态栏

    Home / Qt 学习之路 2 / Qt 学习之路 2(12):菜单栏.工具栏和状态栏 Qt 学习之路 2(12):菜单栏.工具栏和状态栏  豆子  2012年9月10日  Qt 学习之路 2  2 ...

  6. Robot Framework--02 菜单栏&工具栏

    转自:http://blog.csdn.net/tulituqi/article/details/7584795 我把RIDE的界面大致分了四个区域:菜单栏.工具栏.案例及资源区.工作区,如下图 菜单 ...

  7. 学习spring2--跟我一起学Spring 3(3)–使用Spring开发第一个HelloWorld应用

    http://www.importnew.com/13246.html     首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所有文章 资讯 ...

  8. 我开发了一个产品--Markdown Notes

    大家好,我开发了一个工具类软件产品--Markdown Notes,中文名是Markdown笔记.想写一篇有关它的文章,目的就是为了推广.推广.推广:) BTW:本文就是用这个工具所写的.

  9. [Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序

    本系列前两部分已经介绍了如何配置Ruby on Rails开发环境,现在终于进入正题啦! Part1.开发前的准备 本次的主要任务是开发第一个Rails程序.需要特别指出的是,本次我选用了一个(Paa ...

随机推荐

  1. Linux 用户、用户组管理

    Linux系统是一个多用户多任务的分时操作系统,每个用户都有用户名(唯一).口令,用户名唯一标识该用户账号. 用户管理主要涉及到用户添加.修改和删除. 切换用户 su  用户名     su即swit ...

  2. Android实战项目——家庭记账本(七)

    今天主要实现了登录注册功能的客户端和服务端,但由于短信接口调用出现问题,导致注册功能还不完整. 截止到今天,APP的功能已经基本完成,后续还会陆陆续续的完善各功能模块与服务端的交互,因为需要和云端关联 ...

  3. 题解 Luogu P3370

    讲讲这题的几种做法: 暴力匹配法 rt,暴力匹配,即把字符串存起来一位一位判相等 时间复杂度$ O(n^2·m) $ 再看看数据范围 \(n\le10^5,m\le10^3\) 当场爆炸.当然有暴力分 ...

  4. opencv —— getRotationMatrix2D、warpAffine 仿射变换实现图像旋转缩放

    仿射变换的基本概念 仿射变换是一种二维坐标(x, y)到二维坐标(u, v)的线性变换,其数学表达式形式如下: 对应的齐次坐标矩阵表示形式为: 仿射变换保持了二维图形的“平直性”(直线经仿射变换后依然 ...

  5. es5和es6中如何处理不确定参数

    场景:求出不定参数的总数和 //利用arguments function sum () { let num = 0 //Array.prototype.forEach.call(arguments,f ...

  6. JavaSE学习笔记(14)---File类和IO流(字节流和字符流)

    JavaSE学习笔记(14)---File类和IO流(字节流和字符流) File类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方 ...

  7. Java与Go语言差异1 传值还是传引用

    在Java中,复杂类型(除原始类型外的其它类)作为入参,在方法中被修改后,跳出方法对象内的值仍会保持,也就是传的是引用.原始类型传的是值,如int, double等原始类型. Java代码: publ ...

  8. maven 3.6.3 安装及配置

    1.下载 下载地址:http://maven.apache.org/download.cgi 2.配置环境变量 解压压缩包到磁盘. 注意:各种系统配置环境变量位置不一样,已windows10为例. 我 ...

  9. 开发分支管理模型之阿里AoneFlow

    说到分支管理模型,令人最为熟悉的莫过于TrunkBased 和 GitFlow. TrunkBased 模型是持续集成思想所崇尚的工作方式,它由单个master分支和许多release分支组成,每个r ...

  10. JN_0015:ping IP 地址

    1,打开命令窗口 2,ping www.baidu.com