pyqt5 iframe嵌套

重点:

使用Lambda往槽函数里面传递参数 self.pushButton().clicked.connect(lambda: 函数(args))

例:self.pushButton1.clicked.connect(lambda: self.change(self.pushButton1.objectName()))

其他方案:

1、pushButton、iframe、stackedWidget、stackedWidget.setCurrentIndex(0)

2、pushButton、tabWidget、tabWidget.setCurrentIndex(0)

        左右两侧分别是一个frame控件,左侧frame里含有两个按钮,右侧其实我只是用来占位。选中两个frame,点击 Lay out Horizontally in Splitter,将它设置为 Splitter 布局,将 Splitter 拖大,将 两个frame 显示出来。

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

# Form implementation generated from reading ui file '.\frame2.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
from one import Ui_MainWindow as one
from two import Ui_MainWindow as two
from PyQt5.QtWidgets import *


class Ui_Frame_Two(object):
    def setupUi(self, Frame_Two):
        Frame_Two.setObjectName("Frame_Two")
        Frame_Two.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(Frame_Two)
        self.centralwidget.setObjectName("centralwidget")
        self.splitter = QtWidgets.QSplitter(self.centralwidget)
        self.splitter.setGeometry(QtCore.QRect(0, 0, 800, 550))
        self.splitter.setOrientation(QtCore.Qt.Horizontal)
        self.splitter.setObjectName("splitter")
        self.frame1 = QtWidgets.QFrame(self.splitter)
        self.frame1.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame1.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame1.setObjectName("frame1")
        self.pushButton1 = QtWidgets.QPushButton(self.frame1)
        self.pushButton1.setGeometry(QtCore.QRect(20, 70, 75, 23))
        self.pushButton1.setObjectName("pushButton1")
        self.pushButton2 = QtWidgets.QPushButton(self.frame1)
        self.pushButton2.setGeometry(QtCore.QRect(20, 130, 75, 23))
        self.pushButton2.setObjectName("pushButton2")
        self.frame2 = QtWidgets.QFrame(self.splitter)
        self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame2.setObjectName("frame2")
        Frame_Two.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(Frame_Two)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
        self.menubar.setObjectName("menubar")
        Frame_Two.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(Frame_Two)
        self.statusbar.setObjectName("statusbar")
        Frame_Two.setStatusBar(self.statusbar)

        self.first = oneapp()
        self.second = twoapp()
        self.splitter.addWidget(self.first)
        self.pushButton1.clicked.connect(lambda: self.change(self.pushButton1.objectName()))
        self.pushButton2.clicked.connect(lambda: self.change(self.pushButton2.objectName()))

        self.retranslateUi(Frame_Two)
        QtCore.QMetaObject.connectSlotsByName(Frame_Two)


    def retranslateUi(self, Frame_Two):
        _translate = QtCore.QCoreApplication.translate
        Frame_Two.setWindowTitle(_translate("Frame_Two", "MainWindow"))
        self.pushButton1.setText(_translate("Frame_Two", "PushButton"))
        self.pushButton2.setText(_translate("Frame_Two", "PushButton"))

    def change(self, name):
        dic={
            self.pushButton1.objectName():self.first,
             self.pushButton2.objectName():self.second
        }
        for objectName,pushButton in dic.items():
            if name==objectName:
                self.splitter.widget(1).setParent(None)
                self.splitter.insertWidget(1,pushButton)

        # if name == "pushButton1":
        #     self.splitter.widget(1).setParent(None)
        #     self.splitter.insertWidget(1, self.first)
        #
        # if name == "pushButton2":
        #     self.splitter.widget(1).setParent(None)
        #     self.splitter.insertWidget(1, self.second)


class oneapp(QMainWindow,one):
    def __init__(self):
        super(oneapp, self).__init__()
        self.setupUi(self)

class twoapp(QMainWindow,two):
    def __init__(self):
        super(twoapp, self).__init__()
        self.setupUi(self)

按需在文件中增加内容:

        self.first = oneapp()
        self.second = twoapp()
        self.splitter.addWidget(self.first)
        self.pushButton1.clicked.connect(lambda: self.change(self.pushButton1.objectName()))
        self.pushButton2.clicked.connect(lambda: self.change(self.pushButton2.objectName()))

        self.retranslateUi(Frame_Two)
        QtCore.QMetaObject.connectSlotsByName(Frame_Two)


    def retranslateUi(self, Frame_Two):
        _translate = QtCore.QCoreApplication.translate
        Frame_Two.setWindowTitle(_translate("Frame_Two", "MainWindow"))
        self.pushButton1.setText(_translate("Frame_Two", "PushButton"))
        self.pushButton2.setText(_translate("Frame_Two", "PushButton"))

    def change(self, name):
        dic={
            self.pushButton1.objectName():self.first,
            self.pushButton2.objectName():self.second
        }
        for objectName,pushButton in dic.items():
            if name==objectName:
                self.splitter.widget(1).setParent(None)
                self.splitter.insertWidget(1,pushButton)

        # if name == "pushButton1":
        #     self.splitter.widget(1).setParent(None)
        #     self.splitter.insertWidget(1, self.first)
        #
        # if name == "pushButton2":
        #     self.splitter.widget(1).setParent(None)
        #     self.splitter.insertWidget(1, self.second)


class oneapp(QMainWindow,one):
    def __init__(self):
        super(oneapp, self).__init__()
        self.setupUi(self)

class twoapp(QMainWindow,two):
    def __init__(self):
        super(twoapp, self).__init__()
        self.setupUi(self)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值