想用PyQt5网页收藏夹,读取数据库后自动生成动态菜单。
遇到的问题是,把数据写入后菜单生成正确,但发送的信号只能打开最后一个记录中的网页。
action=[]
i=0
for row in self.db_fav: # 遍历数据 row[0]为网页标题,row[1]为链接
w=row[0]
if len(title)>30:
title=title[0:30]+'..'
url=row[1]
action.append(QAction(QIcon(':/res/Resource/weball.png'), title,parent=menu))
menu.addAction(action[i])
action[i].triggered.connect(lambda: self.NewPage(url))
print(url)
i=i+1
print(url)显示的各链接是正确的,但生成的菜单项不管选择哪一个只能打开同一个网页。
难道在循环体中为菜单项设置触发事件指向一个函数是不可行的?还有没有办法实现这样的操作???
望前辈指点/、
# -*- coding: utf-8 -*-
import sys
from PyQt5 import QtCore,QtWidgets
class Ui_MainWindow(QtWidgets.QMainWindow):
def setupUi(self,MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800,600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0,0,800,23))
self.menubar.setObjectName("menubar")
# self.menu = QtWidgets.QMenu(self.menubar)
# self.menu.setObjectName("menu")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
# self.action0 = QtWidgets.QAction(MainWindow)
# self.action0.triggered.connect(lambda:print(0))
# self.menu.addAction(self.action0)
#
# self.action1 = QtWidgets.QAction(MainWindow)
# self.action1.triggered.connect(lambda:print(1))
# self.menu.addAction(self.action1)
#
# self.action2 = QtWidgets.QAction(MainWindow)
# self.action2.triggered.connect(lambda:print(2))
# self.menu.addAction(self.action2)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self,MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow","MainWindow"))
# self.menu.setTitle(_translate("MainWindow","文件"))
# self.action0.setText(_translate("MainWindow","打开"))
# self.action1.setText(_translate("MainWindow","保存"))
# self.action2.setText(_translate("MainWindow","另存为…"))
# 定义 key为菜单 value为子菜单
self.action = [{"文件":["打开","保存","另存为…"]},{"文件1":["打开1","保存1","另存为…1"]}]
# 遍历所有 action 提取出菜单 子菜单
# 缓存所有index,避免重复打印最后一个
self.index = []
for i in self.action:
for k,v in i.items():
menu = QtWidgets.QMenu(self.menubar)
menu.setObjectName("menu")
self.menubar.addAction(menu.menuAction())
menu.setTitle(_translate("MainWindow",k))
for index in range(len(v)):
action0 = QtWidgets.QAction(MainWindow)
# a = 0
# while True:
# # 循环寻找不重复index
# a = random.randint(1,99999)
# if a not in self.index:
# self.index.append(a)
# break
action0.triggered.connect(lambda checked,index = [i,index]:self.printf(v,index))
menu.addAction(action0)
action0.setText(_translate("MainWindow",v[index]))
del action0
def printf(selfm,v,index):
key = index[0]
v = list(key.values())[0]
print(v[index[1]])
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
win = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(win)
win.show()
sys.exit(app.exec_())
参考一下这段代码,有帮助请点一下采纳
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!