首页 > 解决方案 > PySide6 setStatusTip() 显示 QAction 名称

问题描述

我正在学习 PySide6,我偶然发现了一件奇怪的事情。创建 QAction 并设置状态提示时,QAction 的名称显示为状态提示,而不是实际的状态提示。

我在这里想念什么?

这是我的简短示例代码:

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Test App")
        label = QLabel("Hello!")
        label.setAlignment(Qt.AlignCenter)
        self.setCentralWidget(label)

        toolbar = QToolBar("My main toolbar")
        self.addToolBar(toolbar)

        button_action = QAction("Test", self)
        button_action.setShortcut('Ctrl+T')
        button_action.setStatusTip('Test application')
        button_action.triggered.connect(self.onMyToolBarButtonClick)
        toolbar.addAction(button_action)

    def onMyToolBarButtonClick(self, s):
        print("click", s)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec()

这是奇怪的结果:

在此处输入图像描述

谢谢!

标签: pythonpyqtpyside6

解决方案


图像中显示的是工具提示,默认情况下,工具栏将操作显示text()为工具提示,除非使用 明确设置工具提示setToolTip()

相反,状态提示显示在状态栏中QStatusBar)。

在 QMainWindow 上,可以使用状态栏访问状态栏statusBar()(如果不存在,这是新空主窗口的默认设置,则创建并返回一个新窗口)。
只需在 中的任何位置添加以下内容__init__(),您就会看到"Test application"悬停操作时字符串实际上显示在那里:

        self.statusBar()

状态栏也可以安装在任何 QWidget 或继承的子类上,并可用于捕获从其自身或其子类接收到的任何状态事件:

class MainWindow(QWidget): # note: a basic QWidget
    def __init__(self):
        super().__init__()
        layout = QVBoxLayout(self)
        button = QPushButton('Test')
        layout.addWidget(button)
        button.setStatusTip('Test application')
        self.statusBar = QStatusBar()
        layout.addWidget(self.statusBar)

    def event(self, event):
        if event.type() == event.Type.StatusTip:
            self.statusBar.showMessage(event.tip())
            # returning True means that the event has been 
            # successfully handled and will not be propagated to 
            # the possible parent(s)
            return True
        return super().event(event)

以上实际上是 QMainWindow 在幕后所做的。


推荐阅读