前言
今天用PyQt给自己的程序写UI界面,想实现点击不同菜单选项转换到不同的界面。吃了没文化的亏,避免以后忘记,写出来给大家分享分享。
经验
PyQt5.QtWidgets
中有很多组件类,比如QMainWindow
、QWidget
、QAction
,可以用来创建主窗口(带菜单栏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_())
创作不易,如果有所帮助,求支持,谢谢!