【问题标题】:Why does padding-left style result in QComboBox menu stretching to screen height?为什么 padding-left 样式会导致 QComboBox 菜单拉伸到屏幕高度?
【发布时间】:2019-11-26 14:16:18
【问题描述】:

考虑以下示例。它创建了QComboBox 的两个实例:一个带有样式表,另一个没有。如果单击第一个(小部件样式为 Fusion),则菜单按预期调整大小,尽管悬停项和非悬停项之间的文本填充不一致。但是如果你点击第二个,padding 问题现在已经解决了,但是菜单看起来有很大的条目,使得菜单填满了整个屏幕的高度。

#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,则拉伸已经尽其所能发生了。

为什么设置horizo​​ntal padding 会导致垂直方向如此奇怪的变化?

【问题讨论】:

  • QWidget:item 应该是什么? QWidget 上没有这样的子控件(也许您正在考虑 QAbstractItemView::item?)此外,控件通常与 :: 分隔,而状态与 : 分隔。
  • @MaximPaperno 其实好像是笔误,应该有::。它只是采用与我正在编辑的代码QWidget:item:selected { background-color: #0000ff; } 中先前存在的形式相同的形式(使用另一种颜色)。这导致组合框中的当前活动项目,除了菜单中的背景外,悬停时还有一个勾号,并且任何悬停项目上的文本都缩进 - 与未悬停的项目不一致,我试图找到补救措施.如果QWidget 中没有这样的子控件,我不确定为什么这仍然有效...
  • 好的,显然QCheckBox::item 确实适用于列表视图中的项目,即使我没有看到它记录在任何地方,并明确覆盖项目视图上设置的任何样式(以奇怪的方式,即使docs 说要做到这一点)。我的猜测是QWidget::item 有效,因为组合框继承自它......啊,QSS 的奥秘! :) 我可以用填充重现这个问题——不知道这是怎么回事,但它确实把几何计算搞砸了。但是发布一个带有这个图标/勾选行为的完整示例。
  • @MaximPaperno 好的,更新样式表并将其本地化为 QComboBox 而不是 QWidget(具有相同的行为)。
  • 我的意思是发布一个图标/复选标记或其他实际问题的示例(不确定我是否理解该部分,图标来自哪里?)。 CSS 填充很明显是一个错误或其他一些“异常”,我们可以花费all day 追查——我建议专注于解决您想要解决的实际问题。或者等着看之前是否有人遇到过这个确切的问题。

标签: css qt padding qcombobox


【解决方案1】:

哇,好吧,这确实很糟糕。将任何 CSS 添加到组合框会使其进入其他一些“复古”模式,并在当前项目旁边显示图标。多年来我从未注意到这一点,但我在这个问题上看到了很多共同点。不过似乎只会影响 Fusion 风格,我在 Windows 机器上困惑了一段时间,直到我弄清楚了。

问题是你是否想要复选框。这是摆脱它的一种方法,这是我在玩了一段时间后发现的唯一一致的方法。主要技巧是在::item 而不是::item:selected 上设置选择颜色(后者使复选标记出现)。

QComboBox::item { 
  selection-background-color: #0000ff;
  selection-color: palette(highlighted-text);
}

附言。造成混淆的另一个原因以及为什么QComboBox::item:checked 甚至可以工作的另一个原因是 QComboBox 默认项目委托(用于在组合框用于选项列表的 QListView 中绘制项目)“假装”它是QMenuQComboMenuDelegate::paint()
所以另一种解决方法是为委托使用更理智/可定制的东西,甚至可能是默认的QStyledItemDelegate


添加:保留复选框并确保未选中项目具有填充的版本(不使用 padding 属性,当在具有 Fusion 样式的组合框项目中使用时,该属性似乎是 FUBAR)。图标大小似乎最容易通过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(根据 cmets):

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 的框架线,尽管它非常微妙。我不知道这是从哪里来的……尝试了一些猜测,但无济于事。

【讨论】:

  • 我确实觉得这个图标很有用。有没有办法保留它,但将文本填充调整为 1) 一致且 2) 小于其他情况?
  • @Ruslan 也添加了该示例。我说,QComboBox 必须是样式最令人困惑(也许记录最差)的小部件之一 - 基本上只是反复试验才能看到哪些有效(例如,一些 QMenu 样式有效,但并非几乎全部.. . 虽然 QMenu 样式文档也很模糊,而且样式菜单也很烂)。
  • 这几乎是理想的......但是如何摆脱这个新出现的框架围绕着对勾的空白空间?它似乎不是一个取代复选标记的“空框”,而是某种边框/框架......
  • @Ruslan 给你...不是像素完美但还可以。如果您提供自己的复选标记图标,或者完全自己设置指示器的样式(沉没的框架或其他什么......在QMenu 的 QSS 示例中有一个示例),您可能会走得更远。
猜你喜欢
  • 1970-01-01
  • 2015-09-03
  • 2017-03-31
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 2010-11-07
  • 2015-01-21
相关资源
最近更新 更多