gpt4 book ai didi

qt - 子类化 QLabel 以显示 native 'Mouse Hover Button indicator'

转载 作者:行者123 更新时间:2023-12-02 04:54:47 25 4
gpt4 key购买 nike

我有一个带有“StyledPanel,凸起”框架的 QLabel。
通过子类化 QLabel,它是可点击的;

class InteractiveLabel(QtGui.QLabel):
def __init__(self, parent):
QtGui.QLabel.__init__(self, parent)

def mouseReleaseEvent(self, event):
self.emit(QtCore.SIGNAL('clicked()'))

但是,普遍的意见是这个“框”不容易被识别为可点击。
为了提高可用性,我希望“框”显示当鼠标悬停在其上时可单击。
显然,通过连接 mouseHoverEvent 可以轻松实现对鼠标悬停的 react 。

但是,“按钮指示器”必须是 native 继承的,因为我的 Qt 应用程序允许用户更改样式(在 Windows XP、Windows 7、plastique、motif、cde 之外)。

此图片以两种不同的样式显示了我想要的特定小部件(右下角)和鼠标悬停美学。

Image showing the 'Box' and the hover indicators of the plastique and Win7 styles

当鼠标悬停在“框”上时,我希望它能够像组合框在顶部、中间那样做出响应。
(“响应”在美学上是原生的,除了“CDE”和“motif”样式外,所有 Qt 按钮都会出现这种情况。)。

有没有办法用 PyQt4 来实现这个?
(我认为非 native 解决方案将涉及 QGradient 并检查 native 样式,但这很糟糕。)

更新:
lol4t0 的 QLabel 与 QPushButton 的想法。

这是我的 pythonic 实现,信号正常工作,并且具有所有适当的按钮美观。RichTextBox 是您要嵌入到程序中的小部件。

from PyQt4 import QtCore, QtGui

class RichTextButton(QtGui.QPushButton):
def __init__(self, parent=None):
QtGui.QPushButton.__init__(self, parent)
self.UnitText = QtGui.QLabel(self)
self.UnitText.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
self.UnitText.setAlignment(QtCore.Qt.AlignCenter)
self.UnitText.setMouseTracking(False)
self.setLayout(QtGui.QVBoxLayout())
self.layout().setMargin(0)
self.layout().addWidget(self.UnitText)

谢谢!

<小时/>

规范:
- python 2.7.2
- Windows 7
- PyQt4

最佳答案

主要思想

您可以在 QPushButton 上方添加 QLabel(使 QLabel 成为 QPushButton 的子级)并在标签中显示富文本,而点击和装饰可以用QPushButton

来处理

实验

好吧,我是一个C++程序员,但没有什么复杂的,我希望你能理解代码

  • 实现主要思想:

    QLabel * label = new QLabel(pushButton);
    label->setText("<strong>sss</strong>");
    label->setAlignment(Qt::AlignCenter);
    label->setMouseTracking(false);
    pushButton->setLayout(new QVBoxLayout(pushButton));
    pushButton->layout()->setMargin(0);
    pushButton->layout()->addWidget(label);

    几乎有效!唯一的一个愚蠢的错误(或我的全局误解)是,当您用鼠标按下按钮然后释放它时,它仍然被按下

- 所以,看来我们需要在 label 中重新实现 mouseReleaseEvent 来解决总是按下问题:

我很确定,有一个更优雅的解决方案,但我现在懒得找到它,所以,我做了以下:

    class TransperentLabel: public QLabel
{
public:
TransperentLabel(QWidget* parent):QLabel(parent) {}
protected:
void mouseReleaseEvent(QMouseEvent *ev)
{
/*
QApplication::sendEvent(parent(), ev); -- does not help :(
*/
static_cast<QPushButton*>(parent())->setDown(false);
static_cast<QPushButton*>(parent())->click(); //fixing click signal issues
}
};

  • 正如@Roku所说,要解决这个问题,我们必须添加

    label->setTextInteractionFlags(Qt::NoTextInteraction);

关于qt - 子类化 QLabel 以显示 native 'Mouse Hover Button indicator',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8960233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com