将 QAction 与 QLabel 结合使用并使用 QStackedWidget 创建手风琴

Luk*_*kas 2 pyqt

我正在尝试使用 QLabel.addAction() 方法将 QAction 对象添加到 QLabel 对象,但它似乎不起作用。它不应该起作用还是我做错了什么?

我正在尝试使用 QStackedWidget 制作手风琴。

在此输入图像描述

为此,我需要一个部分标题,当用户按下该标题时,它将隐藏或显示标题的部分。我可以使用 mouseReleasedEvent,但我更喜欢正确的 QActiontoggle() 实现。也许我可以使用 QLabel 以外的其他东西来解决这个问题?

Tri*_*ion 5

addAction的功能用于QWidget提供上下文菜单,与在标签上单击鼠标时触发的操作不直接相关。

因此,您必须使用某种 mousexxxevent。

如果您更喜欢信号,这也很简单:

from PySide.QtGui import *
from PySide.QtCore import *

class ClickableLabel(QLabel):
    """
        A Label that emits a signal when clicked.
    """

    clicked = Signal()

    def __init__(self, *args):
        super().__init__(*args)

    def mousePressEvent(self, event):
        self.clicked.emit()

# example
app = QApplication([])
window = QWidget()
layout = QVBoxLayout(window)
labelA = ClickableLabel('Click on me for more.')
layout.addWidget(labelA)
labelB = QLabel('Here I am.')
layout.addWidget(labelB)
labelB.hide()
labelA.clicked.connect(labelB.show)
window.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要一个动作,请像这样:

from PySide.QtGui import *
from PySide.QtCore import *

class ClickableLabel(QLabel):
    """
        A Label that emits a signal when clicked.
    """

    def __init__(self, *args):
        super().__init__(*args)

    def mousePressEvent(self, event):
        self.action.triggered.emit()

# example
app = QApplication([])
window = QWidget()
layout = QVBoxLayout(window)
labelA = ClickableLabel('Click on me for more.')
layout.addWidget(labelA)
labelB = QLabel('Here I am.')
layout.addWidget(labelB)
labelB.hide()

action = QAction('Action', labelA)
labelA.action = action
action.triggered.connect(labelB.show)

window.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)

该示例采用 Python 3.X 表示法并适用于 PySide,但转换为 Python 2.X 或 PyQt 可能非常简单。