Python 如何在添加新内容后刷新收件箱菜单

Python 如何在添加新内容后刷新收件箱菜单,python,pyside2,qtwidgets,Python,Pyside2,Qtwidgets,添加新项目后,我需要刷新托盘菜单上的列表 我需要做什么 class SystemTrayIcon(QtWidgets.QSystemTrayIcon): def __init__(self, icon, parent=None): QtWidgets.QSystemTrayIcon.__init__(self, icon, parent) menu = QtWidgets.QMenu(parent) c.execute('SELECT *

添加新项目后,我需要刷新托盘菜单上的列表

我需要做什么

class SystemTrayIcon(QtWidgets.QSystemTrayIcon):
    def __init__(self, icon, parent=None):
        QtWidgets.QSystemTrayIcon.__init__(self, icon, parent)
        menu = QtWidgets.QMenu(parent)

        c.execute('SELECT * FROM projects')
        for row in c.fetchall():
                path = row[0]
                open_app = menu.addAction(path.split('/')[-1])
                open_app.triggered.connect( lambda: self.vscode(path))           

    def add(self):
        Tkinter.Tk().withdraw() # Close the root window
        in_path = tkFileDialog.askdirectory()
        c.execute("INSERT INTO projects VALUES ('"+str(in_path)+"')")


一种可能的解决方案是消除依赖于数据库的QAction,并通过插入新信息来创建新的QAction:

从PySide2导入QtCore、QtGui、QtWidgets、QtSql
def create_connection():
db=QtSql.QSqlDatabase.addDatabase(“QSQLITE”)
db.setDatabaseName(“tray.db”)
如果不是db.open():
qtwidts.QMessageBox.critical(
没有一个
qtwidts.qApp.tr(“无法打开数据库”),
qtwidts.qApp.tr(
“无法建立数据库连接。\n”
“此示例需要SQLite支持。请阅读”
“有关详细信息,请参阅Qt SQL驱动程序文档”
“如何构建它。\n\n”
“单击“取消”退出。”
),
qtwidts.QMessageBox.Cancel,
)
返回错误
query=QtSql.QSqlQuery(
“如果项目不存在,则创建表(路径文本不为NULL唯一)”
)
如果不是,则query.exec_389;()
打印(query.lastError().text())
返回错误
返回真值
类SystemTrayIcon(QtWidgets.QSystemTrayIcon):
定义初始化(自我、图标、父项=无):
super()。\uuuu init\uuuu(图标,父级)
self.\u路径\u操作=[]
self.\u menu=qtwidts.QMenu(父菜单)
self.setContextMenu(self.\u菜单)
self.\u separator=self.\u menu.addSeparator()
add_action=qtwidts.QAction(
“Adicionar”,self,icon=QtGui.QIcon(“img/plus.png”),triggered=self.add
)
quit_action=qtwidts.QAction(
“退出”,
自己
icon=QtGui.QIcon(“img/logout.png”),
触发=qtwidts.QApplication.quit,
)
self.\u菜单.addAction(添加操作)
self.\u menu.addAction(退出操作)
self.refresh_菜单()
自激活连接(自激活)
@插槽(QtWidgets.QSystemTrayIcon.ActivationReason)
def onTrayIconActivated(自身、原因):
如果有理由(
qtwidts.QSystemTrayIcon.Trigger,
qtwidts.QSystemTrayIcon.DoubleClick,
):
qtwidts.QApplication.quit()
def刷新菜单(自我):
menu=self.contextMenu()
对于在自我中的操作。\u路径\u操作:
action.deleteLater()
query=QtSql.QSqlQuery(“从项目中选择*)
self.\u路径\u操作=[]
while query.next():
directory=query.value(0)
info=QtCore.QFileInfo(目录)
action=qtwidts.QAction(info.fileName(),self,triggered=self.vscode)
action.setData(目录)
self.\u path\u actions.append(action)
菜单插入(self.\u分隔符、self.\u路径\u操作)
@QtCore.Slot()
def添加(自我):
directory=QtWidgets.QFileDialog.getExistingDirectory(
无,self.tr(“打开getExistingDirectory”)
)
query=QtSql.QSqlQuery()
query.prepare(“插入到项目值(?))
query.addBindValue(目录)
如果不是,则query.exec_389;()
打印(query.lastError().text())
返回
self.refresh_菜单()
@QtCore.Slot()
def vscode(自我):
action=self.sender()
directory=action.data()
打印(目录)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
如果没有,请创建_连接():
系统出口(-1)
如果不是QtWidgets.QSystemTrayIcon.isSystemTrayAvailable():
qtwidts.QMessageBox.critical(
无,“Systray”,“我无法在此系统上检测到任何系统托盘。”
)
系统出口(1)
QtWidgets.QApplication.setQuitOnLastWindowClosed(False)
托盘图标=SystemTrayIcon(QtGui.QIcon(“img/icon.png”))
托盘_图标。显示()
托盘图标。显示消息(“TrayCode”,“Hi”bitter“)
sys.exit(app.exec_())

如何用鼠标左键单击打开菜单并删除项目?