如何制作一个只会立即弹出菜单的PyQt应用程序?

2024-05-16 06:27:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我想我的应用程序只包括一个弹出式菜单,一旦它运行立即打开。我尝试了此解决方案,但运行时没有显示任何内容:

#!/usr/bin/env python3
from PyQt5.QtCore import (Qt, QPoint)
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import (QApplication, QMenu, QAction)

def clicked():
    print("CLICKED")

if __name__ == '__main__':       
    import sys

    app = QApplication(sys.argv)
    menu = QMenu()
    menu.addAction(QAction("&Click me", triggered=clicked))
    menu.exec_(QCursor().pos())
    sys.exit(app.exec_())

Tags: fromimportapp应用程序sys菜单pyqt5menu
2条回答

好吧,我不确定你希望这个菜单有多简约,但这是一个更静态的菜单(也就是说它坚持左右),有多个选项,以防你试图建立某种菜单驱动的窗口平台或只是一个菜单的命令。同时,作为一个类,它可以被导入到任何你可能正在大规模开发的东西中。此外,您还可以通过添加具有不同操作的附加菜单项来扩展菜单,最后它遵循基本的pyqt编程方法

from sys import exit as sysExit

from PyQt5.QtWidgets import QApplication, QAction, QWidget, QHBoxLayout, QMenuBar

class MainMenu(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setMaximumSize(self.minimumSize())

        self.Click1Act = QAction("&Click Me 1", triggered=self.Clicked1)
        self.Click2Act = QAction("&Click Me 2", triggered=self.Clicked2)

        self.SimpleMenu = QMenuBar()
        self.ClickMenu  = self.SimpleMenu.addMenu('Clickables')
        self.ClickMenu.addAction(self.Click1Act)
        self.ClickMenu.addSeparator()
        self.ClickMenu.addAction(self.Click2Act)

        HBox = QHBoxLayout()
        HBox.addWidget(self.SimpleMenu)

        self.setLayout(HBox)

    def Clicked1(self):
        print("CLICKED ONE")

    def Clicked2(self):
        print("CLICKED TWO")

if __name__ == "__main__":
    MainThred = QApplication([])

    MainGui = MainMenu()
    MainGui.show()

    sysExit(MainThred.exec_())

这将显示一个带有单个选项的简单弹出窗口,该窗口在单击时调用clicked函数:

from PySide2.QtGui import QCursor
from PySide2.QtWidgets import QApplication, QMenu


def clicked():
    print("CLICKED")


if __name__ == '__main__':
    app = QApplication()
    menu = QMenu()
    menu.addAction("Click me", clicked)
    menu.exec_(QCursor().pos())

或者,如果仍要使用QAction,请将其定义移到外部:

from PySide2.QtGui import QCursor
from PySide2.QtWidgets import QApplication, QMenu, QAction


def clicked():
    print("CLICKED")


if __name__ == '__main__':
    app = QApplication()
    menu = QMenu()
    action = QAction("&Click me", triggered=clicked)
    menu.addAction(action)
    menu.exec_(QCursor().pos())

正如ekhumoro在下面的评论中指出的:

Qt does not take ownership of actions added via addAction. You must keep an explicit reference to them, otherwise they will get garbage-collected.

注意我使用的是PySide2,但它不应该改变任何东西。你知道吗

相关问题 更多 >