为什么 padding-left 样式会导致 QComboBox 菜单拉伸到屏幕高度?
Why does padding-left style result in QComboBox menu stretching to screen height?
考虑以下示例。它创建了 QComboBox
的两个实例:一个带有样式表,另一个没有。如果单击第一个(小部件样式为 Fusion),菜单会按预期大小调整,但悬停项和非悬停项之间的文本填充不一致。但是如果你点击第二个,填充问题现在已经解决了,但是菜单看起来有很大的条目,使菜单填满整个屏幕高度。
#include <QComboBox>
#include <QApplication>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QComboBox box1, box2;
const QString stylesheetOrig=R"(
QComboBox::item:selected
{
background-color: #0000ff;
}
)";
box1.setStyleSheet(stylesheetOrig);
box2.setStyleSheet(stylesheetOrig+R"(
QComboBox::item
{
padding-left: 27px;
}
)");
box1.addItems({"Hello 1","Goodbye 1"});
box2.addItems({"Hello 2","Goodbye 2"});
box1.show();
box2.show();
return app.exec();
}
如果我删除填充语句,仍然保留 QComboBox::item {}
部分,那么不会发生任何奇怪的事情(也没有任何用处)。但是,如果我什至将填充设置为 1px
或 0px
,拉伸就会全力以赴。
为什么设置 水平 填充会导致垂直如此奇怪的变化?
哇哦,那确实很古怪。将任何 css 添加到组合框都会使其进入其他 "retro" 模式,并在当前项目旁边显示图标。多年来我从未注意到这一点,但我看到了很多关于这个问题的共同话题。不过似乎只影响 Fusion 风格,我在我的 Windows 盒子上困惑了一段时间,直到我弄明白了。
问题是您是否需要复选框。这是摆脱它的一种方法,这是我在玩了一会儿之后发现的唯一一致的方法。主要技巧是在 ::item
而不是 ::item:selected
上设置选择颜色(后者使复选标记出现)。
QComboBox::item {
selection-background-color: #0000ff;
selection-color: palette(highlighted-text);
}
PS。混淆的另一个原因以及 QComboBox::item
和 :checked
甚至工作的原因是 QComboBox 默认项目委托(用于在组合框用于选项列表的 QListView 中绘制项目)"pretends"这是 QMenu
: QComboMenuDelegate::paint()
所以另一种解决方法是为委托使用更多 sane/customizable 的东西,甚至可能是默认的 QStyledItemDelegate
.
ADDED:保留复选框并确保未选中的项目有填充的版本(w/out 使用 padding
属性 这似乎是FUBAR 在具有 Fusion 样式的组合框项目中使用时)。图标大小似乎最容易通过 iconSize
属性 设置——我通过 css icon/image/element width/height 尝试了几种方法,但没有任何影响......可能是因为iconSize
属性 覆盖它。
QComboBox { qproperty-iconSize: 12px; } /* or QComboBox::setIconSize() */
QComboBox::indicator { color: transparent; } /* to force space for the icon column */
/* Using ::item:selected vs. ::item { selection-*-color: } will apparently make the
checkbox column appear... at least with Fusion as the main style */
QComboBox::item:selected {
color: palette(highlighted-text);
background-color: #0000ff;
}
版本 3(根据评论):
QComboBox { qproperty-iconSize: 12px; } /* or QComboBox::setIconSize() */
QComboBox::indicator:!checked { border: 0; } /* to force space for the icon column */
QComboBox::item { background-color: palette(base); } /* gets rid of icon|text separator */
/* Using ::item:selected vs. ::item { selection-*-color: } will apparently make the
checkbox column appear... at least with Fusion as the main style */
QComboBox::item:selected {
color: palette(highlighted-text);
background-color: #0000ff;
}
在未选中的图标区域顶部还有一条1px的框线,虽然很细微。我不知道那是从哪里来的...尝试了一些猜测但无济于事。
考虑以下示例。它创建了 QComboBox
的两个实例:一个带有样式表,另一个没有。如果单击第一个(小部件样式为 Fusion),菜单会按预期大小调整,但悬停项和非悬停项之间的文本填充不一致。但是如果你点击第二个,填充问题现在已经解决了,但是菜单看起来有很大的条目,使菜单填满整个屏幕高度。
#include <QComboBox>
#include <QApplication>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QComboBox box1, box2;
const QString stylesheetOrig=R"(
QComboBox::item:selected
{
background-color: #0000ff;
}
)";
box1.setStyleSheet(stylesheetOrig);
box2.setStyleSheet(stylesheetOrig+R"(
QComboBox::item
{
padding-left: 27px;
}
)");
box1.addItems({"Hello 1","Goodbye 1"});
box2.addItems({"Hello 2","Goodbye 2"});
box1.show();
box2.show();
return app.exec();
}
如果我删除填充语句,仍然保留 QComboBox::item {}
部分,那么不会发生任何奇怪的事情(也没有任何用处)。但是,如果我什至将填充设置为 1px
或 0px
,拉伸就会全力以赴。
为什么设置 水平 填充会导致垂直如此奇怪的变化?
哇哦,那确实很古怪。将任何 css 添加到组合框都会使其进入其他 "retro" 模式,并在当前项目旁边显示图标。多年来我从未注意到这一点,但我看到了很多关于这个问题的共同话题。不过似乎只影响 Fusion 风格,我在我的 Windows 盒子上困惑了一段时间,直到我弄明白了。
问题是您是否需要复选框。这是摆脱它的一种方法,这是我在玩了一会儿之后发现的唯一一致的方法。主要技巧是在 ::item
而不是 ::item:selected
上设置选择颜色(后者使复选标记出现)。
QComboBox::item {
selection-background-color: #0000ff;
selection-color: palette(highlighted-text);
}
PS。混淆的另一个原因以及 QComboBox::item
和 :checked
甚至工作的原因是 QComboBox 默认项目委托(用于在组合框用于选项列表的 QListView 中绘制项目)"pretends"这是 QMenu
: QComboMenuDelegate::paint()
所以另一种解决方法是为委托使用更多 sane/customizable 的东西,甚至可能是默认的 QStyledItemDelegate
.
ADDED:保留复选框并确保未选中的项目有填充的版本(w/out 使用 padding
属性 这似乎是FUBAR 在具有 Fusion 样式的组合框项目中使用时)。图标大小似乎最容易通过 iconSize
属性 设置——我通过 css icon/image/element width/height 尝试了几种方法,但没有任何影响......可能是因为iconSize
属性 覆盖它。
QComboBox { qproperty-iconSize: 12px; } /* or QComboBox::setIconSize() */
QComboBox::indicator { color: transparent; } /* to force space for the icon column */
/* Using ::item:selected vs. ::item { selection-*-color: } will apparently make the
checkbox column appear... at least with Fusion as the main style */
QComboBox::item:selected {
color: palette(highlighted-text);
background-color: #0000ff;
}
版本 3(根据评论):
QComboBox { qproperty-iconSize: 12px; } /* or QComboBox::setIconSize() */
QComboBox::indicator:!checked { border: 0; } /* to force space for the icon column */
QComboBox::item { background-color: palette(base); } /* gets rid of icon|text separator */
/* Using ::item:selected vs. ::item { selection-*-color: } will apparently make the
checkbox column appear... at least with Fusion as the main style */
QComboBox::item:selected {
color: palette(highlighted-text);
background-color: #0000ff;
}
在未选中的图标区域顶部还有一条1px的框线,虽然很细微。我不知道那是从哪里来的...尝试了一些猜测但无济于事。