Qt QPushButton样式表悬停(Qt QPushButton stylesheet hover)
我有以下按钮样式表:
QPushButton:hover{
background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 : 1, stop : 0.0 #ffd9aa,
stop : 0.5 #ffbb6e, stop : 0.55 #feae42, stop : 1.0 #fedb74);
}
QPushButton {
border: 1px solid #6593cf;
border-radius: 2px;
padding: 5px 15px 2px 5px;
background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 : 1, stop : 0.0 #f5f9ff,
stop : 0.5 #c7dfff, stop : 0.55 #afd2ff, stop : 1.0 #c0dbff);
color: #006aff;
font: bold large "Arial";
height: 30px;
}
QPushButton:pressed {
background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 : 1, stop : 0.0 #c0dbff,
stop : 0.5 #cfd26f, stop : 0.55 #c7df6f, stop : 1.0 #f5f9ff);
padding-top: 2px;
padding-left: 3px;
}
QPushButton:on {
background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 : 1, stop : 0.0 #5AA72D,
stop : 0.5 #B3E296, stop : 0.55 #B3E296, stop : 1.0 #f5f9ff);
padding-top: 2px;
padding-left: 3px;
}
QPushButton:disabled {
background: transparent #e5e9ee;
padding-top: 2px;
padding-left: 3px;
color: black;
}
我有一个按钮。 当它被按下时,侧面小部件被调整大小。 因此按钮获得按下的样式,当我释放它时获得悬停样式。 此外,窗口小部件被调整大小并且按钮“跟随”窗口小部件。 问题是当我用鼠标进行一些移动时,按钮会保持悬停状态并丢失它。 这是来自qt的错误还是我在样式表代码中遗漏了一些东西。
我做了一个动画gif显示情况:
谢谢
I have the following pushbutton stylesheet:
QPushButton:hover{
background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 : 1, stop : 0.0 #ffd9aa,
stop : 0.5 #ffbb6e, stop : 0.55 #feae42, stop : 1.0 #fedb74);
}
QPushButton {
border: 1px solid #6593cf;
border-radius: 2px;
padding: 5px 15px 2px 5px;
background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 : 1, stop : 0.0 #f5f9ff,
stop : 0.5 #c7dfff, stop : 0.55 #afd2ff, stop : 1.0 #c0dbff);
color: #006aff;
font: bold large "Arial";
height: 30px;
}
QPushButton:pressed {
background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 : 1, stop : 0.0 #c0dbff,
stop : 0.5 #cfd26f, stop : 0.55 #c7df6f, stop : 1.0 #f5f9ff);
padding-top: 2px;
padding-left: 3px;
}
QPushButton:on {
background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 : 1, stop : 0.0 #5AA72D,
stop : 0.5 #B3E296, stop : 0.55 #B3E296, stop : 1.0 #f5f9ff);
padding-top: 2px;
padding-left: 3px;
}
QPushButton:disabled {
background: transparent #e5e9ee;
padding-top: 2px;
padding-left: 3px;
color: black;
}
I have a button. When it's pressed a side widget is resized. Thus the button gets the pressed style, when I release it gets the hover style. Furthermore the widget is resized and the button "follows" the widget. The problem is that the button keeps the hover state and loses it when I do some movement with the mouse. Is this a bug from qt or I miss something in the stylesheet code.
I did a animated gif showing the situation:
Thanks
原文:https://stackoverflow.com/questions/25318538
更新时间:2019-11-19 02:49
最满意答案
你可以说这是Qt中的一个错误。 我会说这是一种由正确逻辑引起的错误。 为自己判断。 Hover状态由WA_UnderMouse小部件属性定义。 此属性由应用程序设置:
if ((e->type() == QEvent::Enter || e->type() == QEvent::DragEnter) ...
widget->setAttribute(Qt::WA_UnderMouse, true);
else if (e->type() == QEvent::Leave || e->type() == QEvent::DragLeave)
widget->setAttribute(Qt::WA_UnderMouse, false);
QEvent::Enter和QEvent::Leave事件仅在应用程序从OS接收鼠标事件时发送。
您不移动鼠标,应用程序不会收到任何鼠标事件,因此WA_UnderMouse属性不会更改。
解决这个问题的方法之一是在移动按钮小部件时自己将Qt::WA_UnderMouse属性设置为正确的值。
You can say that it's a bug in Qt. I would say it's a kind of bugs caused by right logic. Judge for yourself. Hover state is defined by WA_UnderMouse widget attribute. This attribute is set by the application:
if ((e->type() == QEvent::Enter || e->type() == QEvent::DragEnter) ...
widget->setAttribute(Qt::WA_UnderMouse, true);
else if (e->type() == QEvent::Leave || e->type() == QEvent::DragLeave)
widget->setAttribute(Qt::WA_UnderMouse, false);
QEvent::Enter and QEvent::Leave events are only sent when the application receives mouse event from OS.
You don't move mouse, the application doesn't receive any mouse event and so WA_UnderMouse attribute is not changed.
One of the ways to fix that is to set Qt::WA_UnderMouse attribute to the right value by yourself when moving the button widget.
2014-08-15
相关问答
不要这么想,你可能会通过逐步完成绘图代码来找到某些东西。 但是样式表的解析和应用程序相当优化,并且使用了很多预处理。 我甚至不认为如果它实际设置在父项中,则可以访问小部件的样式表。 Don't think so, you might be able to find something by stepping through the drawing code. But the parsing and the application of stylesheets is pretty optimised
...
它似乎特定于您的平台。 有许多错误报告具有相同的错误。 但是尝试为您的应用设置cleanlooks样式。 像这样的东西: app = QtGui.QApplication(sys.argv)
#QCleanlooksStyle
app.setStyle('cleanlooks')
或者使用命令行: ./myapp -style cleanlooks
It seems that it is specific for your platform. There are many bug report
...
你可以说这是Qt中的一个错误。 我会说这是一种由正确逻辑引起的错误。 为自己判断。 Hover状态由WA_UnderMouse小部件属性定义。 此属性由应用程序设置: if ((e->type() == QEvent::Enter || e->type() == QEvent::DragEnter) ...
widget->setAttribute(Qt::WA_UnderMouse, true);
else if (e->type() == QEvent::Leave || e-
...
对于问题的第二部分:不要使用“平面”属性,而是修改样式表以实现平面外观,也许如下所示: QPushButton#pushButton {
background-color: #ffffff;
border: 0px;
}
/* ... plus the rest of your stylesheet ... */
关于“为什么不起作用”的部分? 根据我的经验,为窗口小部件混合样式表和非样式表单选项会产生许多难以解释的神秘效果。 我放弃了要求“为什么”。 For the seco
...
在命名对象之前,首先需要setObjectName(“somename”),然后objectName()将起作用,甚至更好 - findChild()或findChildren() 例 标题: QButton foo;
类: foo = new QButton();
foo.setObjectName("MySuperButton");
然后,最后在你的QSS .. #MySuperButton {
background: black;
}
这也与CSS类似 QButton#My
...
最后我得到了解决方案。 这个想法与CSS属性选择相同。 因此property_1 =“true”AND property_2 =“true”条件是: MyButton[property_1="true"][property_2="true"] { background-color: green; }
Finally I got the solution. The idea is the same as CSS attribute selection. Thus property_1="true
...
我不认为你可以搞乱边框或填充而不影响小部件的默认大小。 你可以设置min-width 。 从文档: If this property is not specified, the minimum width is derived based on the widget's contents and the style. QPushButton {
border-radius: 2px;
padding: 0.2em 0.2em 0.3em 0.2em;
border: 1px
...
当您使用setMenu()设置QPushButton的菜单时,菜单将继续作为其自己的实体存在,因此您将使用适当的选择器来定位QMenu对象本身。 QMenu支持盒子模型。 可以在此处找到一些示例样式。 When you set the menu for a QPushButton using setMenu(), the menu continues to exist as its own entity so you would target the QMenu object itself wit
...
好吧,我没有找到任何解释或建议,所以我自己找到了解决方案。 为了突出显示QWidgetAction按钮,我添加了动态属性,就像在下面的代码中构建按钮的地方一样: m_pasteButton->setProperty("mouseHover", false);
然后,在按钮上安装过滤器并捕获Enter和Leave事件以确定何时鼠标悬停: bool CustomWidgetAction::eventFilter(QObject* object, QEvent* event)
{
if (ob
...
正常状态按钮的样式: QPushButton
{
color: red;
}
“已禁用”状态按钮的样式: QPushButton:!enabled
{
color:blue;
}
这可能会解决您的问题 Style for the normal state button: QPushButton
{
color: red;
}
Style for the "Disabled" state button: QPushButton:!enabled
{
co
...