PyQt5学习笔记-从主窗体打开一个子窗体

软件环境:

Eric6+Python3.5+PyQt5

试验目标:

1.点击菜单项Open,打开一个子窗体

2.点击按钮Open,打开一个子窗体

主窗体设计:

1、增加一个菜单项Open

2、增加一个按钮Open

子窗体设计:

1、只放一个按钮Exit

设计步骤

1、创建主窗体

启动Eric6,点击顶部菜单Project,点击New,给出Project Name,同时设置项目路径,然后点下面的OK按钮

2、点击如下图的1图标,然后点New form

3、Select a form type,选择Main Window

4.文件名,设置为mainWindow,保存后,则是MainWindow.ui

5、增加菜单,在窗体区域,点鼠标右键,点“创建菜单栏”,这里只增加一个主菜单项File,两个子菜单项Open和Exit

6、在窗体上放置一个按钮Open,从左侧栏找到push button,拖拽到窗体上,修改按钮属性,objectName:btn_Open,Text:Open

7、然后点左上角的保存按钮,关闭Qt Designer

8、增加第子窗体,参照前面第2步,点New form,然后Select a form type,选择Widget,文件名:ChildForm.ui

9、在这个子窗体上增加一个按钮Exit ,从左侧栏拖一个push button,调整按钮大小,修改属性,objectName:btn_Exit,Text:Exit

点左上角的保存按钮,保存这个窗体文件,然后关闭Qt Designer

10、编译窗体,从XXX.ui文件生成ui_XXX.py文件

依次选中这两个文件,点鼠标右键,点Compile form

点窗体左侧的页签图标,可以看到增加了两个文件:Ui_MainWindow.py、Ui_ChildForm.py

11、Ui_MainWindow.py和Ui_ChildForm.py是界面文件,下面增加业务逻辑文件

页签图标,选中MainWindow.ui文件,点鼠标右键,点选Generate Dialog Code菜单项

12、点New 按钮,className 为MainWindow,然后点OK按钮

13、绑定槽函数,

1)、绑定菜单项槽函数,选择on_ActionXXX_triggered()

依次点开actionExit(QAction)、actionOpen(QAction),勾选onAction_Exit_triggered()、onAction_Open_triggered()

2)、绑定按钮槽函数,点开btn_Open(QPushButton),勾选on_btn_Open_clicked()

3)、给子窗体绑定槽函数,选中Ui_ChildForm.ui,点鼠标右键,选中Generate Dialog Code菜单项,className命名为ChildForm

勾选on_btn_Exit_clicked()

14、重新编译两个窗体文件

选中一个ui文件,然后点鼠标右键,点选Compile all forms,生成代码文件

页签,则可以看到,系统新增了两个文件MainWindow.py和ChildForm.py

15、开始完善代码

双击MainWindow.py,打开这个文件,编辑代码,进行相应完善,项目启动,从MainWindow.py进行启动,需要实例化窗体界面类,包括主窗体和子窗体

修改内容:

1)、把.Ui_MainWindow前面的点号去掉,不然运行会报错

2)、导入子窗体

增加语句:from Ui_ChildForm import Ui_ChildForm

16、附相关文件的代码:

1)、MainWindow.py

# -*- coding: utf-8 -*-

"""
Module implementing MainWindow.
""" from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow, QWidget
from PyQt5 import QtWidgets from Ui_MainWindow import Ui_MainWindow
from Ui_ChildForm import Ui_ChildForm class MainWindow(QMainWindow, Ui_MainWindow):
"""
Class documentation goes here.
"""
def __init__(self, parent=None):
"""
Constructor @param parent reference to the parent widget
@type QWidget
"""
super(MainWindow, self).__init__(parent)
self.setupUi(self) @pyqtSlot()
def on_btn_Open_clicked(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
#raise NotImplementedError
ch.show() @pyqtSlot()
def on_actionOpen_triggered(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
#raise NotImplementedError
ch.show() @pyqtSlot()
def on_actionExit_triggered(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
#raise NotImplementedError
sys.exit(0) class ChildForm(QWidget, Ui_ChildForm):
def __init__(self):
#super(QWidget, self).__init__(parent)
super(QWidget, self).__init__()
self.setupUi(self)
self.btn_Exit.clicked.connect(self.close) if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv) #实例化主窗体
mainForm = MainWindow() #显示主窗体
mainForm.show() #实例化子窗体
ch=ChildForm() sys.exit(app.exec_())

2)、Ui_MainWindow.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'C:\Work\Python\PyQt5\Test\MainWindow.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralWidget = QtWidgets.QWidget(MainWindow)
self.centralWidget.setObjectName("centralWidget")
self.btn_Open = QtWidgets.QPushButton(self.centralWidget)
self.btn_Open.setGeometry(QtCore.QRect(210, 120, 81, 31))
self.btn_Open.setObjectName("btn_Open")
MainWindow.setCentralWidget(self.centralWidget)
self.menuBar = QtWidgets.QMenuBar(MainWindow)
self.menuBar.setGeometry(QtCore.QRect(0, 0, 800, 23))
self.menuBar.setObjectName("menuBar")
self.menuFile = QtWidgets.QMenu(self.menuBar)
self.menuFile.setObjectName("menuFile")
MainWindow.setMenuBar(self.menuBar)
self.actionOpen = QtWidgets.QAction(MainWindow)
self.actionOpen.setObjectName("actionOpen")
self.actionExit = QtWidgets.QAction(MainWindow)
self.actionExit.setObjectName("actionExit")
self.menuFile.addAction(self.actionOpen)
self.menuFile.addAction(self.actionExit)
self.menuBar.addAction(self.menuFile.menuAction()) self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.btn_Open.setText(_translate("MainWindow", "Open"))
self.menuFile.setTitle(_translate("MainWindow", "File"))
self.actionOpen.setText(_translate("MainWindow", "Open"))
self.actionExit.setText(_translate("MainWindow", "Exit")) if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())

3)、ChildForm.py

# -*- coding: utf-8 -*-

"""
Module implementing ChildForm.
""" from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QWidget from Ui_ChildForm import Ui_Form class ChildForm(QWidget, Ui_Form):
"""
Class documentation goes here.
"""
def __init__(self, parent=None):
"""
Constructor @param parent reference to the parent widget
@type QWidget
"""
super(ChildForm, self).__init__(parent)
self.setupUi(self) @pyqtSlot()
def on_btn_Exit_clicked(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
raise NotImplementedError

4)、Ui_ChildForm.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'C:\Work\Python\PyQt5\Test\ChildForm.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_ChildForm(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.btn_Exit = QtWidgets.QPushButton(Form)
self.btn_Exit.setGeometry(QtCore.QRect(140, 110, 91, 41))
self.btn_Exit.setObjectName("btn_Exit") self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.btn_Exit.setText(_translate("Form", "Exit")) if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_ChildForm()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())

本示例测试可以运行:

运行,点击顶部的运行图标

设置运行使用的Python解释器及命令行,Python 本项目MainWindow.py的路径,点OK按钮

运行结果:

点菜单项里的Open或点Open按钮,则弹出子窗体

点子窗体里的Exit按钮,则关闭子窗体

代码下载,百度网盘分享:
https://pan.baidu.com/s/1LzUVY2uPggEktCtACwC-JQ

提取码:i0qq

PyQt5学习笔记-从主窗体打开一个子窗体的更多相关文章

  1. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  2. 如何实现MDI窗体不重复打开同一个子窗体?

    使用MDI窗体时,默认是可以多次打开同一个子窗体的,那么如何控制不重复打开同一个子窗体呢?MDI窗体有个重要属性——MdiChildren,该属性表示MDI窗体打开的子窗体的数组,循环遍历该数组,可以 ...

  3. Pyqt5学习笔记(一)

    Python已有的GUI框架: Tkinter(python内嵌的GUI环境,使用TCL实现,易学易用,方便简单创GUI自带无需安装,适用于Unix.Windows和Mac系统组,在Tk8.0的后续版 ...

  4. PyQt5学习笔记----标准文件打开保存框QFileDialog

    单个文件打开 QFileDialog.getOpenFileName()多个文件打开 QFileDialog.getOpenFileNames() 文件夹选取     QFileDialog.getE ...

  5. Python pyQt4/pyQt5 学习笔记1(空白窗口,按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox)

    PyQt4是用来编写有图形界面程序(GUI applications)的一个工具包.PyQt4作为一个Python模块来使用,它有440个类和超过6000种函数和方法.同时它也是一个可以在几乎所有主流 ...

  6. c#学习笔记之使用 TableLayoutPanel 控件设置窗体布局

    使用 TableLayoutPanel 控件设置窗体布局 在 Visual Studio IDE 左侧,找到“工具箱”选项卡. 选择“工具箱”选项卡,随即将显示工具箱.(或者,在菜单栏上,依次选择“视 ...

  7. MongoDB学习笔记~ObjectId主键的设计

    回到目录 说一些关于ObjectId的事 MongoDB确实是最像关系型数据库的NoSQL,这在它主键设计上可以体现的出来,它并没有采用自动增长主键,因为在分布式服务器之间做数据同步很麻烦,而是采用了 ...

  8. PyQt5学习笔记14----初识pyqt多线程操作

    转载:翻滚吧挨踢男 首先来看一个例子: # coding=utf-8 __author__ = 'a359680405' from PyQt5.QtCore import * from PyQt5.Q ...

  9. Python pyQt4/pyQt5 学习笔记2(状态栏、菜单栏和工具栏)

    例子:状态栏.菜单栏和工具栏 import sys from PyQt4 import QtGui class Example(QtGui.QMainWindow): def __init__(sel ...

随机推荐

  1. netty 的事件驱动

    netty 是事件驱动的,这里面有两个含义,一是 netty 接收到 socket 数据后,会产生事件,事件在 pipeline 上传播,二是事件由特定的线程池处理. NioEventLoop 轮询网 ...

  2. gdck01

    有好几年 好几年 好几年 我成天在抱怨 我没钱 我没钱 恨老天不开眼 不开眼 不开眼 为什么好的事 都跟我没有缘

  3. Pikachu-RCE(远程命令/代码执行漏洞)

    RCE(remote command/code execute)概述 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行一般出现这种漏洞,是因为 ...

  4. html+layui

    添加html+layui项目 先引用一个js文件 <form class="layui-form" action=""> <link href ...

  5. C#设计模式学习笔记:(1)单例模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8250985.html,记录一下学习过程以备后续查用. 一.引言 设计模式的分类: 1)依目的: 创建型(Cr ...

  6. 将smarty安装到MVC架构中

    首先是composer.json { "require": { "smarty/smarty": "^3.1" }, // 自动加载 // ...

  7. linux笔记-硬件命令【2】

    1- 磁盘 1.1- 查看电脑磁盘类型 cat /sys/block/sda/queue/rotational 0 #固态盘 cat /sys/block/sdb/queue/rotational 1 ...

  8. gulp常用插件之gulp-rev-collector使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-rev-collector这是一款根据gulp-rev生成的manifest.json文件中的映射, 去替换文件名称, 也可以替换路径. ...

  9. JavaScript 删除某个数组中指定的对象和删除对象属性

    Javascript: 删除指定对象:使用过程中只适合删除对象,如果数组中添加的是类型Function的话是删除不了的. function removeObjWithArr(_arr,_obj) { ...

  10. IntelliJ IDEA 2019年最新版2019.3.1 安装激活教程【最强,可用至2100、2089年】

    IntelliJ IDEA 2019年最新版 永久激活教程 本文包括最新[2019.3.1 & 1.3]激活 和[2018.3.2]激活 说明:①2019.3.②2019.1.③2018.3版 ...