pyqt5通过qt designer 设计方式连接多个UI图形界面

当我们通过pyqt开发时,eric6为我们提供了一个方便的工具:图形化的绘制UI工具--qtdesigner。我们可以通过它开发多个UI,然后利用信号-槽工具,将功能代码附着在上面。也可以将多个界面连接起来。接下来,我要提供将多个UI链接起来的思路。一:讲解:qtdesigner自动生成的代码是怎样运行的:(一)组成qtdesinger自动生成的代码为一个对象和对象启动命令,(如何将.ui文件生成.py文件查看:https://blog.csdn.net/qq_37193537/article/details/82080285)对象中包含两个函数,setupUi()和retranslateUi()。两个函数负责绘制Ui,其中setupUI会调用retranslateUi。

使用四个函数,一个主窗口,两个弹出窗口,一个主运行函数。对于所有的窗口都可以通过qtdesigner来设计,之后在主运行函数中来调用。直接运行run函数,即可查看效果。

主窗口:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
################################################
#######创建主窗口
################################################
class FirstMainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle(‘主界面‘)

        ###### 创建界面 ######
        self.centralwidget = QWidget()
        self.setCentralWidget(self.centralwidget)
        self.Layout = QVBoxLayout(self.centralwidget)

        # 设置顶部三个按钮
        self.topwidget = QWidget()
        self.Layout.addWidget(self.topwidget)
        self.buttonLayout = QHBoxLayout(self.topwidget)

        self.pushButton1 = QPushButton()
        self.pushButton1.setText("打开主界面")
        self.buttonLayout.addWidget(self.pushButton1)

        self.pushButton2 = QPushButton()
        self.pushButton2.setText("打开对话框")
        self.buttonLayout.addWidget(self.pushButton2)

        self.pushButton3 = QPushButton()
        self.pushButton3.setText("打开提示框")
        self.buttonLayout.addWidget(self.pushButton3)

        # 设置中间文本
        self.label = QLabel()
        self.label.setText("第一个主界面")
        self.label.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setFont(QFont("Roman times", 50, QFont.Bold))
        self.Layout.addWidget(self.label)

        # 设置状态栏
        self.statusBar().showMessage("当前用户:mxh")

        # 窗口最大化
        self.showMaximized()

        ###### 三个按钮事件 ######

        self.pushButton3.clicked.connect(self.on_pushButton3_clicked)

    # 按钮三:打开提示框
    def on_pushButton3_clicked(self):
        QMessageBox.information(self, "提示", "这是information框!")
        #QMessageBox.question(self, "提示", "这是question框!")
        #QMessageBox.warning(self, "提示", "这是warning框!")
        #QMessageBox.about(self, "提示", "这是about框!")

################################################
#######程序入门
################################################
if __name__ == "__main__":
    app = QApplication(sys.argv)
    the_mainwindow = FirstMainWindow()
    the_mainwindow.show()
    sys.exit(app.exec_())

main_window

第一个弹出窗口:

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog1(object):
    def setupUi1(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(480, 297)
        self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
        self.buttonBox.setGeometry(QtCore.QRect(260, 240, 181, 32))
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")
        self.hostlnedt = QtWidgets.QLineEdit(Dialog)
        self.hostlnedt.setGeometry(QtCore.QRect(120, 20, 113, 27))
        self.hostlnedt.setObjectName("hostlnedt")
        self.hostlbl = QtWidgets.QLabel(Dialog)
        self.hostlbl.setGeometry(QtCore.QRect(20, 26, 81, 21))
        self.hostlbl.setObjectName("hostlbl")
        self.usernamelbl = QtWidgets.QLabel(Dialog)
        self.usernamelbl.setGeometry(QtCore.QRect(20, 90, 51, 17))
        self.usernamelbl.setObjectName("usernamelbl")
        self.userlnedt = QtWidgets.QLineEdit(Dialog)
        self.userlnedt.setGeometry(QtCore.QRect(120, 80, 113, 27))
        self.userlnedt.setObjectName("userlnedt")
        self.passwdlbl = QtWidgets.QLabel(Dialog)
        self.passwdlbl.setGeometry(QtCore.QRect(20, 140, 81, 20))
        self.passwdlbl.setObjectName("passwdlbl")
        self.passwdlnedit = QtWidgets.QLineEdit(Dialog)
        self.passwdlnedit.setGeometry(QtCore.QRect(120, 130, 113, 27))
        self.passwdlnedit.setObjectName("passwdlnedit")
        self.retranslateUi(Dialog)
        self.buttonBox.accepted.connect(Dialog.accept)
        self.buttonBox.rejected.connect(Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "登陆mysql"))
        self.hostlnedt.setText(_translate("Dialog", "localhost"))
        self.hostlbl.setText(_translate("Dialog", "HOST地址"))
        self.usernamelbl.setText(_translate("Dialog", "用户名"))
        self.passwdlbl.setText(_translate("Dialog", "数据库密码"))
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog1 = QtWidgets.QDialog()
    ui = Ui_Dialog1()
    ui.setupUi1(Dialog1)
    Dialog1.show()
    sys.exit(app.exec_())

Ui_one

第二个弹出窗口:

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog2(object):
    def setupUi2(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 296)
        self.dialogButtonBox = QtWidgets.QDialogButtonBox(Dialog)
        self.dialogButtonBox.setGeometry(QtCore.QRect(190, 240, 181, 32))
        self.dialogButtonBox.setOrientation(QtCore.Qt.Horizontal)
        self.dialogButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.dialogButtonBox.setObjectName("dialogButtonBox")
        self.author = QtWidgets.QLabel(Dialog)
        self.author.setGeometry(QtCore.QRect(40, 20, 191, 17))
        self.author.setObjectName("author")
        self.email = QtWidgets.QLabel(Dialog)
        self.email.setGeometry(QtCore.QRect(40, 50, 271, 17))
        self.email.setObjectName("email")
        self.github = QtWidgets.QLabel(Dialog)
        self.github.setGeometry(QtCore.QRect(40, 80, 351, 17))
        self.github.setObjectName("github")
        self.GPL = QtWidgets.QLabel(Dialog)
        self.GPL.setGeometry(QtCore.QRect(40, 110, 161, 17))
        self.GPL.setObjectName("GPL")
        self.retranslateUi(Dialog)
        self.dialogButtonBox.accepted.connect(Dialog.accept)
        self.dialogButtonBox.rejected.connect(Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.author.setText(_translate("Dialog", "作者:maxiaohui"))
        self.email.setText(_translate("Dialog", "联系邮箱:[email protected]"))
        self.github.setText(_translate("Dialog", "github: https://github.com/xxx"))
        self.GPL.setText(_translate("Dialog", "本软件遵循GPL v2协议"))
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog2 = QtWidgets.QDialog()
    ui2 = Ui_Dialog2()
    ui2.setupUi2(Dialog2)
    Dialog2.show()
    sys.exit(app.exec_())

Ui_two

主运行函数:

# coding:utf-8
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from pyqt5_work.GUI_more.main_window import FirstMainWindow
from pyqt5_work.GUI_more.Ui_one import Ui_Dialog1
from pyqt5_work.GUI_more.Ui_two import Ui_Dialog2

# part 1
# 实例化启动qt应用
app = QtWidgets.QApplication(sys.argv)
#  取得UI class 的实例
the_mainwindow = FirstMainWindow()

# part 2 登录mysql
Dialog1 = QtWidgets.QDialog()
ui1 = Ui_Dialog1()
ui1.setupUi1(Dialog1)
# part 3 关于界面
Dialog2 = QtWidgets.QDialog()
ui2 = Ui_Dialog2()
ui2.setupUi2(Dialog2)

# part 4
# 设计信号-槽点
# 建立对象实例化的访问
bttn = the_mainwindow.pushButton1
bttn.clicked.connect(Dialog1.show)

bttn2 = the_mainwindow.pushButton2
bttn2.clicked.connect(Dialog2.show)

if __name__ == "__main__":
    # 展示主窗口 chenSpider
    the_mainwindow.show()
    sys.exit(app.exec_())

run



另外还查看了另外一种方式,所有的窗口和函数都在一个函数当中(函数直接运行即可查看效果)

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
################################################
#######创建主窗口
################################################
class FirstMainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle(‘主界面‘)

        ###### 创建界面 ######
        self.centralwidget = QWidget()
        self.setCentralWidget(self.centralwidget)
        self.Layout = QVBoxLayout(self.centralwidget)

        # 设置顶部三个按钮
        self.topwidget = QWidget()
        self.Layout.addWidget(self.topwidget)
        self.buttonLayout = QHBoxLayout(self.topwidget)

        self.pushButton1 = QPushButton()
        self.pushButton1.setText("打开主界面")
        self.buttonLayout.addWidget(self.pushButton1)

        self.pushButton2 = QPushButton()
        self.pushButton2.setText("打开对话框")
        self.buttonLayout.addWidget(self.pushButton2)

        self.pushButton3 = QPushButton()
        self.pushButton3.setText("打开提示框")
        self.buttonLayout.addWidget(self.pushButton3)

        # 设置中间文本
        self.label = QLabel()
        self.label.setText("第一个主界面")
        self.label.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setFont(QFont("Roman times", 50, QFont.Bold))
        self.Layout.addWidget(self.label)

        # 设置状态栏
        self.statusBar().showMessage("当前用户:一心狮")

        # 窗口最大化
        self.showMaximized()

        ###### 三个按钮事件 ######
        self.pushButton1.clicked.connect(self.on_pushButton1_clicked)
        self.pushButton2.clicked.connect(self.on_pushButton2_clicked)
        self.pushButton3.clicked.connect(self.on_pushButton3_clicked)

    # 按钮一:打开主界面
    windowList = []
    def on_pushButton1_clicked(self):
        the_window =SecondWindow()
        self.windowList.append(the_window)   ##注:没有这句,是不打开另一个主界面的!
        self.close()
        the_window.show()

    # 按钮二:打开对话框
    def on_pushButton2_clicked(self):
        the_dialog = demoDialog_t()
        if the_dialog.exec_() == QDialog.Accepted:
            pass

    # 按钮三:打开提示框
    def on_pushButton3_clicked(self):
        QMessageBox.information(self, "提示", "这是information框!")
        #QMessageBox.question(self, "提示", "这是question框!")
        #QMessageBox.warning(self, "提示", "这是warning框!")
        #QMessageBox.about(self, "提示", "这是about框!")

################################################
#######第二个主界面
################################################
class SecondWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle(‘第二主界面‘)

        # 设置中间文本
        self.label = QLabel()
        self.label.setText("第二个主界面")
        self.label.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setFont(QFont("Roman times", 50, QFont.Bold))
        self.setCentralWidget(self.label)

        # 设置状态栏
        self.statusBar().showMessage("当前用户:一心狮")

        # 窗口最大化
        self.showMaximized()

    ###### 重写关闭事件,回到第一界面
    windowList = []
    def closeEvent(self, event):
        the_window = FirstMainWindow()
        self.windowList.append(the_window)  ##注:没有这句,是不打开另一个主界面的!
        the_window.show()
        event.accept()

################################################
#######对话框
################################################
class demoDialog_t(QDialog):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle(‘对话框‘)

        ### 设置对话框类型
        self.setWindowFlags(Qt.Tool)

################################################
#######程序入门
################################################
if __name__ == "__main__":
    app = QApplication(sys.argv)
    the_mainwindow = FirstMainWindow()
    the_mainwindow.show()
    sys.exit(app.exec_())

参考:

https://www.aliyun.com/jiaocheng/522668.html

https://blog.csdn.net/qq_20265805/article/details/82153143

原文地址:https://www.cnblogs.com/mxhmxh/p/9803354.html

时间: 2024-11-09 14:43:27

pyqt5通过qt designer 设计方式连接多个UI图形界面的相关文章

使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件

使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件 前期准备: 安装 python:https://www.python.org/downloads/ 安装 PySide2:安装 python 后,在安装目录下有 /script 文件夹,里面有 pip.exe ,cmd执行:pip install PySide,pip install PySide2(注意: python2.x 对应 PySide,py

【PyQt5】QT designer + eclipse 集成开发

[写在前面的话] 考虑将pyqt5的界面开发qt designer 集成在eclipse中,并且,不利用cmd命令行进行转换. [工具] 1.pyqt5 2.qt designer 3.eclipse +pydy [步骤] 1.首先配置Qt designer. 菜单 run-->external Tools-->External tools configurations 2.在Program 中new 一个新项目 3.配置PyUIC,如图2所示: ******但是这里有个问题,最后转换的py文

用Python设计一个基于命令行的图形界面

Introduction 如今很多开发工作都需要远程进行,比如深度学习需要登录到专门的服务器上.当你需要看一些可视化的结果时,可能需要用到matplotlib或是seaborn这样的绘图库.那么你或许还需要通过ssh或者scp把图片下载到你本地的桌面才能看,这样非常麻烦. 考虑到现在的terminal基本都已经支持24-bit真彩色表示,所以很自然地联想到,能不能直接在terminal中进行画图呢?比如常用的柱状图或热图,就足够能解决很多问题了. 原文地址:http://blog.51cto.c

编写Qt Designer自定义控件(一)——如何创建并使用Qt自定义控件

在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等.虽然Qt Designer里的控件可以满足我们大部分的需求,但是有时候,也会产生一些特殊的需要,比如一个输入框,我们要输入的是经纬度,此时就会有两种输入方式,一种是小数形式,一种是度分秒的形式,此时只使用一个简单的LineEdit是无法满足需求的.我们设想构造这样一个输入控件,它可以支持浮点数输入,同时它还具有一个属性,更改这个属性可以使其切换为经纬度

Qt Designer 无响应

Author: Notus([email protected]) Create: 2019-02-11 Update: 2019-02-11 Qt Designer 在使用过程中突然无响应 环境 操作系统: Windows 10 专业版 64-bit (10.0, Build 16299) (16299.rs3_release.170928-1534) Python Version: 3.7.1 PyQt5 Version: 5.11.3 Qt Designer Version: 5.11.2

痞子衡嵌入式:超级好用的可视化PyQt GUI构建工具(Qt Designer)

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PyQt GUI构建工具Qt Designer. 痞子衡开博客至今已有好几年,一直以嵌入式开发相关主题的文章为主线,偶尔穿插一些其他技术或工具的介绍,前段时间因为要做一个跟恩智浦MCU启动相关的上位机工具 NXP-MCUBootUtility,网上搜索对比了几个Python下的GUI框架,最终选择了wxPython这个成熟稳定的GUI库,从而接触到wxFormBuilder这个配套wxPython使用的GUI构建工具.苦于网上关于该

python+QT designer 做图形化界面EXE程序

1.安装python 2.安装QT designer 或QT creator 3.打开QT designer 绘制你想要的图形化界面 类似这样 之后将文件保存,以ui后缀形式保存 4.下载安装pyside 直接easy_install 或pip安装 可能会保存,我安装的时候,提示 msvc 版本问题 查看许多国外论坛后,可以选择,pyside网站下载 对应Python版本的 whl安装包,下载成功之后,进入对应目录路径,直接 pip install  *.whl    *为包名 安装成功 5.将

在Qt中如何使用QtDesigner创建的UI文件(一) (转)

使用Qt有一些时间了,一直在IDE环境(qtcreator和VS2003+集成器)中使用,自然少了很多麻烦的步骤.但是在享受这种便利的同时,我们也失去了理解更多知识背后的点滴.在IDE中,如果我们要开发一个对话框,通常是使用 "新建->Qt->Qt设计师界面类" 这样IDE会自动的帮我们生成三个文件(filename.ui, filename.h,filename.cpp).qmake也非常智能,可以自动检测到这个用户界面文件(filename.ui)并且生产适当的make

在Qt中如何使用QtDesigner创建的UI文件

使用Qt有一些时间了,一直在IDE环境(qtcreator和VS2003+集成器)中使用,自然少了很多麻烦的步骤.但是在享受这种便利的同 时,我们也失去了理解更多知识背后的点滴.在IDE中,如果我们要开发一个对话框,通常是使用 “新建—>Qt—>Qt设计师界面类” 这样IDE会自动的帮我们生成三个文件(filename.ui, filename.h,filename.cpp).qmake也非常智能,可以自动检测到这个用户界面文件(filename.ui)并且生产适当的 makefile规则.这