对QLabel进行子类化以显示本机"鼠标悬停按钮指示器"

Ant*_*rth 3 qt pyqt subclass mouseover qlabel

我有一个带有'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()'))
Run Code Online (Sandbox Code Playgroud)

但是,一般意见认为这个'Box'不容易识别为可点击.
为了实现可用性,我希望"Box"显示当鼠标悬停在它上面时它是可点击的.
显然,通过连接mouseHoverEvent可以轻松实现对鼠标悬停的反应.

但是,"按钮指示器"必须是原生继承的,因为我的Qt应用程序允许用户更改样式(Windows XP,Windows 7,plastique,motif,cde).

此图像显示了我想要的两种不同风格的特定小部件(右下角)和鼠标悬停美学.

图像显示'Box'和plastique和Win7样式的悬停指示器

当鼠标悬停在'Box'上时,我希望它像顶部,中间的组合框一样响应.
('响应'是美学本土的,与所有Qt按钮一起出现,除了'CDE'和'motif'styles.).

有没有办法用PyQt4实现这个?
(我认为非原生解决方案会涉及QGradient并检查原生样式,但这很令人讨厌.)

更新:
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)
Run Code Online (Sandbox Code Playgroud)

谢谢!


规格:
- python 2.7.2
- Windows 7
- PyQt4

Lol*_*4t0 5

大意

您可以在QLabel上面添加QPushButton(make QLabelchild of 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);
    
    Run Code Online (Sandbox Code Playgroud)

    几乎可以工作!唯一一个愚蠢的错误(或我的全球误解)是当你用鼠标按下按钮然后释放它时,它仍然被按下.

- 所以,似乎我们需要重新实现mouseReleaseEvent我们label解决永远紧迫的问题:

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

    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
        }
    };
Run Code Online (Sandbox Code Playgroud)

  • 添加`label-> setTextInteractionFlags(Qt :: NoTextInteraction);`修复了始终紧迫的问题. (3认同)