为什么 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 {} 部分,那么不会发生任何奇怪的事情(也没有任何用处)。但是,如果我什至将填充设置为 1px0px,拉伸就会全力以赴。

为什么设置 水平 填充会导致垂直如此奇怪的变化?

哇哦,那确实很古怪。将任何 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的框线,虽然很细微。我不知道那是从哪里来的...尝试了一些猜测但无济于事。