Qt 4.8:如何拥有一个看起来像QLabel的QPushButton?

Qt 4.8: how to have a QPushButton that looks like a QLabel?

提问人:benblo 提问时间:7/16/2021 最后编辑:benblo 更新时间:9/19/2022 访问量:1131

问:

我想画一个(可点击等),但让它看起来像一个.(另一种方式是,我想要一个可点击的标签,即一个行为像按钮的标签,但这似乎更困难。QPushButtonQLabel

我试过了,不起作用。 有没有办法告诉按钮使用另一个样式类?还是从中“窃取”风格?button.setStyleSheet("QLabel")QLabel

如果可能的话,我想避免重新定义整个风格(我不拥有样式表,Qt嵌入在第三方应用程序中),除非这是微不足道的。

编辑:我最终使用了 @musicamante 的样式表解决方案,我添加了(按钮居中,标签不是)和颜色(青色/蓝色看起来像程序员艺术,但其目的:):text-align: left:hover/:pressed

QPushButton {
    border: none;
    background: transparent;
    text-align: left;
    color: palette(window-text);
}
QPushButton:hover {
    color: cyan;
}
QPushButton:pressed {
    color: blue;
}
蟒蛇 QT QT4.8

评论

1赞 ThePyGuy 7/16/2021
您需要设置样式表以删除边框、单击效果、背景颜色等。你可以看看QPushButton样式表参考 如果你使用的是一些应用程序级的全局样式,那么设置按钮的objectname也可以正常工作。button.setStyleSheet({'background-color: red; border: none; }')

答:

0赞 musicamante 7/17/2021 #1

通常不建议将按钮设置为标签样式,因为它不会使其清晰地显示其状态,尤其是当按下鼠标按钮并将其释放到按钮矩形之外时。

在任何情况下,将属性设置为 就足够了,这也将删除背景。为了安全和一致,您可以将背景设置为透明(某些样式可能会覆盖它)并确保使用调色板的颜色角色(而不是角色):bordernoneWindowTextButtonText

button.setStyleSheet("""
    border: none;
    color: palette(window-text);
    background: transparent;
""")

不过,制作一个可点击的标签并不难,并且有一个好处是允许使用富文本内容,这是QPushButton无法做到的。

class ClickableLabel(QLabel):
    clicked = Signal()
    def mousePressEvent(self, event):
        super(ClickableLabel, self).mousePressEvent(event)
        if event.button() == Qt.LeftButton:
            self.clicked.emit()

或者,为了提供与按钮行为的一致性(如上所述,如果在按钮矩形的边界内释放鼠标按钮,则认为“单击”有效):

class ClickableLabel(QLabel):
    clicked = Signal()
    def mouseReleaseEvent(self, event):
        super(ClickableLabel, self).mouseReleaseEvent(self, event)
        if event.button() == Qt.LeftButton and event.pos() in self.rect():
            self.clicked.emit()

评论

0赞 HiFile.app - best file manager 7/17/2021
这是一个正确的解决方案。但只是关于您的主张“使用富文本内容,这是无法做到的”的一点评论。实际上,里面有一个富文本是很容易的。您只需在空内插入一个,然后在布局中添加一个富文本。是的,就这么简单!:)QPushButtonQPushButtonQLayoutQPushButtonQLabel
0赞 musicamante 7/17/2021
@V.K. 理论上是的,但有一个问题:与标准容器小部件不同,QPushButton忽略了其布局的大小提示/策略。因此,如果文本需要,不仅按钮无法调整自身大小,而且如果文本太长,文本实际上会在水平和垂直方向上被截断。然后是布局默认边距的问题,除非布局边距设置为 0,否则即使是短文本也会截断。子类化 QLabel 只需要重新实现 mouseReleaseEvent,它更简单,更符合标准 QLabel 行为。
0赞 HiFile.app - best file manager 7/17/2021
你试过吗?根据我的测试,按钮内的布局一切正常。该按钮可以完美地调整其大小以适应布局。默认布局边距可以通过设置 来更改。我没有看到这种方法有任何问题。QLayout::setContentsMargins()
0赞 musicamante 7/17/2021
@V.K.是的,我显然试过了。是的,它可以在所有调整中正常工作,但是,如前所述,我没有看到尝试对嵌入其他两个对象的对象进行子类化的好处,并且需要许多预防措施和修改,而它足以添加基本功能重新实现。
0赞 HiFile.app - best file manager 7/17/2021
我不是在谈论子类,我是在谈论构图。如果您想使用我建议的方法将富文本放入按钮中,则不需要细分。如果你不了解组合相对于继承的好处,那么你可能应该获得更多的编程经验。:)
0赞 chiZhang 7/17/2021 #2

您可以创建一个自定义 QLabel,首先公共继承一个 QLabel,然后重载void mouseReleaseEvent(QMouseEvent *e)

void mouseReleaseEvent(QMouseEvent *e){
    if(e.button == Qt::LeftButton){
          //emit a signal or you want to do when the label are clicked
    }    
}