【PyQt】QMainWindow类中关于点击不同菜单选项实现页面转换,经验细节

前言

  今天用PyQt给自己的程序写UI界面,想实现点击不同菜单选项转换到不同的界面。吃了没文化的亏,避免以后忘记,写出来给大家分享分享。

经验

   PyQt5.QtWidgets中有很多组件类,比如QMainWindowQWidgetQAction,可以用来创建主窗口(带菜单栏menubar)、窗口和动作。我想实现“点击菜单栏的某个菜单选项转换到不同界面”,不同界面可以使用QStackedWidget创建,而我在菜单和不同界面的连接上吃了亏。最后得出以下几条经验:
  (1)执行事件的函数有传入参数,连接的时候如果报错就用lambda

action.triggered.connect(self.display(1))
# 类似上面的如果报错,使用下面的两种方式
action.triggered.connect(lambda :self.display(1))
action.triggered.connect(self.display)

  (2)菜单栏中的菜单选项不能直接触发事件

self.menu_setting.triggered.connect(lambda :self.display(1))
self.menu_introduction.triggered.connect(lambda :self.display(0))
# 上面的语句不会报错,但是运行后点击菜单没任何反应,必须创建action,再将action绑定到menu

  (3)在自己定义的UI类中,创建的组件必须和self绑定才能有效果

action_m_i = QtWidgets.QAction('shuoming')
action_m_i.triggered.connect(lambda :self.display(0))
self.menu_introduction.addAction(action_m_i)

action_m_s = QtWidgets.QAction('shezhi')
action_m_s.triggered.connect(lambda :self.display(1))
self.menu_setting.addAction(action_m_s)
# 上面给两个menu创建了两个action,运行不会报错,但是点击菜单没反应
# 因为action没和self(也就是实例)绑定,下面有两种和self绑定的形式
#-----------------创建动作“action”,补上参数“self”--------------------#
action_m_i = QtWidgets.QAction('shuoming', self)
action_m_i.triggered.connect(lambda :self.display(0))
self.menu_introduction.addAction(action_m_i)

action_m_s = QtWidgets.QAction('shezhi', self)
action_m_s.triggered.connect(lambda :self.display(1))
self.menu_setting.addAction(action_m_s)
#--------------------------------------------------------------------#

#-----------------或者这样写,将“action”和界面实例绑定------------------#
self.action_m_i = QtWidgets.QAction('shuoming')
self.action_m_i.triggered.connect(lambda :self.display(0))
self.menu_introduction.addAction(self.action_m_i)

self.action_m_s = QtWidgets.QAction('shezhi')
self.action_m_s.triggered.connect(lambda :self.display(1))
self.menu_setting.addAction(self.action_m_s)
#--------------------------------------------------------------------#

代码

   下面是我得出上面经验的代码,复制即可使用,安装了PyQt的读者可以体验体验。

from PyQt5 import  QtWidgets
import sys

class Myui(QtWidgets.QMainWindow):
    '''------构建自己的界面类-------'''
    def __init__(self):
        super(Myui, self).__init__()
        self.construct()
    def construct(self):
        self.setFixedSize(1000, 1000)
        self.setWindowTitle('PC端QQ腾讯文档打卡')
        self.menu = self.menuBar()
        self.menu_introduction = self.menu.addMenu('使用说明')
        self.menu_setting = self.menu.addMenu('设置')
        f_s = self.frame_setting()
        f_i = self.frame_introduction()
        self.frames = QtWidgets.QStackedWidget()
        self.frames.addWidget(f_i)
        self.frames.addWidget(f_s)
        self.setCentralWidget(self.frames)
        self.frames.setCurrentIndex(0)

        #-------------------单个的菜单选项不能直接用来触发事件------------------#
        # self.menu_setting.triggered.connect(lambda :self.display(1))
        # self.menu_introduction.triggered.connect(lambda :self.display(0))
        #--------------------------------------------------------------------#

        # --------创建动作“action”,参数“self”很重要,缺了功能无法实现----------#
        # action_m_i = QtWidgets.QAction('shuoming')
        # action_m_i.triggered.connect(lambda :self.display(0))
        # self.menu_introduction.addAction(action_m_i)
        #
        # action_m_s = QtWidgets.QAction('shezhi')
        # action_m_s.triggered.connect(lambda :self.display(1))
        # self.menu_setting.addAction(action_m_s)
        #--------------------------------------------------------------------#

        #-----------------创建动作“action”,补上参数“self”--------------------#
        # action_m_i = QtWidgets.QAction('shuoming', self)
        # action_m_i.triggered.connect(lambda :self.display(0))
        # self.menu_introduction.addAction(action_m_i)
        # 
        # action_m_s = QtWidgets.QAction('shezhi', self)
        # action_m_s.triggered.connect(lambda :self.display(1))
        # self.menu_setting.addAction(action_m_s)
        #--------------------------------------------------------------------#

        #-----------------或者这样写,将“action”和界面实例绑定------------------#
        self.action_m_i = QtWidgets.QAction('shuoming')
        self.action_m_i.triggered.connect(lambda :self.display(0))
        self.menu_introduction.addAction(self.action_m_i)

        self.action_m_s = QtWidgets.QAction('shezhi')
        self.action_m_s.triggered.connect(lambda :self.display(1))
        self.menu_setting.addAction(self.action_m_s)
        #--------------------------------------------------------------------#
    def frame_setting(self):
        frame = QtWidgets.QWidget()
        layout = QtWidgets.QFormLayout()
        layout.addRow('QQ账号:', QtWidgets.QLineEdit())
        layout.addRow('密码:', QtWidgets.QLineEdit())
        frame.setLayout(layout)
        return frame
    def frame_introduction(self):
        frame = QtWidgets.QWidget()
        layout = QtWidgets.QFormLayout()
        layout.addRow('这里是说明部分', QtWidgets.QLineEdit())
        frame.setLayout(layout)
        return frame
    def display(self, i):
        self.frames.setCurrentIndex(i)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    my = Myui()
    my.show()
    sys.exit(app.exec_())

                  创作不易,如果有所帮助,求支持,谢谢!

图1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值