PyQt5学习笔记-从主窗体打开一个子窗体
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学习笔记-从主窗体打开一个子窗体的更多相关文章
- stm32学习笔记----双串口同时打开时的printf()问题
stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...
- 如何实现MDI窗体不重复打开同一个子窗体?
使用MDI窗体时,默认是可以多次打开同一个子窗体的,那么如何控制不重复打开同一个子窗体呢?MDI窗体有个重要属性——MdiChildren,该属性表示MDI窗体打开的子窗体的数组,循环遍历该数组,可以 ...
- Pyqt5学习笔记(一)
Python已有的GUI框架: Tkinter(python内嵌的GUI环境,使用TCL实现,易学易用,方便简单创GUI自带无需安装,适用于Unix.Windows和Mac系统组,在Tk8.0的后续版 ...
- PyQt5学习笔记----标准文件打开保存框QFileDialog
单个文件打开 QFileDialog.getOpenFileName()多个文件打开 QFileDialog.getOpenFileNames() 文件夹选取 QFileDialog.getE ...
- Python pyQt4/pyQt5 学习笔记1(空白窗口,按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox)
PyQt4是用来编写有图形界面程序(GUI applications)的一个工具包.PyQt4作为一个Python模块来使用,它有440个类和超过6000种函数和方法.同时它也是一个可以在几乎所有主流 ...
- c#学习笔记之使用 TableLayoutPanel 控件设置窗体布局
使用 TableLayoutPanel 控件设置窗体布局 在 Visual Studio IDE 左侧,找到“工具箱”选项卡. 选择“工具箱”选项卡,随即将显示工具箱.(或者,在菜单栏上,依次选择“视 ...
- MongoDB学习笔记~ObjectId主键的设计
回到目录 说一些关于ObjectId的事 MongoDB确实是最像关系型数据库的NoSQL,这在它主键设计上可以体现的出来,它并没有采用自动增长主键,因为在分布式服务器之间做数据同步很麻烦,而是采用了 ...
- PyQt5学习笔记14----初识pyqt多线程操作
转载:翻滚吧挨踢男 首先来看一个例子: # coding=utf-8 __author__ = 'a359680405' from PyQt5.QtCore import * from PyQt5.Q ...
- Python pyQt4/pyQt5 学习笔记2(状态栏、菜单栏和工具栏)
例子:状态栏.菜单栏和工具栏 import sys from PyQt4 import QtGui class Example(QtGui.QMainWindow): def __init__(sel ...
随机推荐
- 网络流最大流——dinic算法
前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问 ...
- git需要设置再次弹出输入账号密码
今天在用命令行pull线上代码到本地时遇到一个尴尬的问题,因为新下载的git貌似默认了在pull,push代码时只弹出一次输入账号密码,反正我这里是这样的. 开始在pull线上代码的时候不小心密码输错 ...
- WPF DataGrid标题Header Binding失效
前言:因业务需要对WPF中的DataGrid控件中的行数进行统计,同时把统计的行数显示在列标题上. 如果我们用常规的Binding手段更新DataGridTextColunm的Header的话是不会生 ...
- js判断苹果安卓操作系统,js更换css
//判断是哪个操作系统 if(plus.os.name=="Android"){ var lsyshowline=document.getElementById("lsy ...
- 洛谷P1067 多项式输出 NOIP 2009 普及组 第一题
洛谷P1067 多项式输出 NOIP 2009 普及组 第一题 题目描述 一元n次多项式可用如下的表达式表示: 输入输出格式 输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数. ...
- P1642 规划 [01分数规划]
裸题,考虑size完了跑一个树上背包,这题没了. // by Isaunoya #include <bits/stdc++.h> using namespace std; #define ...
- Python静态方法、类方法、属性方法
静态方法 使用静态方法以后,相当于把下面的函数和类的关系截断了,它的作用相当于是类下面的一个独立函数,不会自动传入参数self. class people:..... @staticmethod de ...
- Linux vim三种模式的快捷键
1.移动光标 数字 + h,j,k,l 上,下,左,右 ctrl-e 移动页面 ctrl-f 上翻一页 ctrl-b 下翻一页 ctrl-u 上翻半页 ctrl-d 下翻半页 w 跳到下一个字首,按标 ...
- Codeforces 1304F2 Animal Observation (hard version) 代码(dp滑动窗口线段树区间更新优化)
https://codeforces.com/contest/1304/problem/F2 #include<bits/stdc++.h> using namespace std; ; ...
- Docker最全教程——从理论到实战(十六)
前言 与其他语言相比,Go非常值得推荐和学习,真香!为什么?主要是可以直接编译成机器代码(性能优越,体积非常小,可达10来M,见实践教程图片)而且设计良好,上手门槛低.本篇主要侧重于讲解了Go语言的优 ...