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'上时,我希望它像顶部,中间的组合框一样响应.
('响应'是美学本土的,与所有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
您可以在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)
正如@Roku所说,要解决这个问题,我们必须补充一下
label->setTextInteractionFlags(Qt::NoTextInteraction);
Run Code Online (Sandbox Code Playgroud)