PYQT5怎样使用数据库中的数据自动生成菜单

想用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)显示的各链接是正确的,但生成的菜单项不管选择哪一个只能打开同一个网页。

难道在循环体中为菜单项设置触发事件指向一个函数是不可行的?还有没有办法实现这样的操作???

望前辈指点/、

参考一下这里的解决办法:
https://stackoverflow.com/questions/38955281/pass-the-qaction-object-which-calls-triggered-connect-as-a-parameter-in-the-fu


# -*- 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_())

参考一下这段代码,有帮助请点一下采纳

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632