【问题标题】:QComboBox style for choosen item in drop-down list下拉列表中所选项目的 QComboBox 样式
【发布时间】:2015-07-08 12:25:57
【问题描述】:

我想在组合框的下拉菜单中设置所选项目的突出显示样式。

与其他问题的不同之处在于我不想设置“选定”项目的样式(悬停在上面),而是设置已经选择的项目的样式。

默认是在文本上绘制的某种刻度。我希望所选项目具有粗体文本且没有刻度。

或者在最坏的情况下,将文本向右移动,以使刻度正确可见。

我拥有的是这样的:

请注意第 17 个项目,它在数字 17 上打勾。

这是我的样式表:

QComboBox
{
    subcontrol-origin: padding;
    subcontrol-position: top right;
    selection-background-color: #111;
    selection-color: yellow;
    color: white;
    background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646);
    border-style: solid;
    border: 1px solid #1e1e1e;
    border-radius: 5;
    padding: 1px 0px 1px 20px;
}


QComboBox:hover, QPushButton:hover
{
    border: 1px solid yellow;
    color: white;
}

QComboBox:editable {
    background: red;
    color: pink;
}

QComboBox:on
{
    padding-top: 0px;
    padding-left: 0px;
    color: white;
    background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2d2d2d, stop: 0.1 #2b2b2b, stop: 0.5 #292929, stop: 0.9 #282828, stop: 1 #252525);
    selection-background-color: #ffaa00;
}

QComboBox:!on
{
    color: white;
    background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #666, stop: 0.1 #555, stop: 0.5 #555, stop: 0.9 #444, stop: 1 #333);
}

QComboBox QAbstractItemView
{
    border: 2px solid darkgray;
    color: black;
    selection-background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #111, stop: 1 #333);
}

QComboBox::drop-down
{
     subcontrol-origin: padding;
     subcontrol-position: top right;
     width: 15px;
     color: white;
     border-left-width: 0px;
     border-left-color: darkgray;
     border-left-style: solid; /* just a single line */
     border-top-right-radius: 3px; /* same radius as the QComboBox */
     border-bottom-right-radius: 3px;
     padding-left: 10px;
 }

QComboBox::down-arrow, QSpinBox::down-arrow, QTimeEdit::down-arrow, QDateEdit::down-arrow
{
     image: url(:/icons/down_arrow.png);
     width: 7px;
     height: 5px;
}

我试图覆盖项目延迟:

ui->modeComboBox->setItemDelegate(new QStyledItemDelegate());

随着

QComboBox QAbstractItemView::item:selected style 

或者覆盖视图:

QListView * listView = new QListView(ui->modeComboBox);

listView->setStyleSheet("QListView::item {                              \
                         border-bottom: 5px solid white; margin:3px; }  \
                         QListView::item:selected {                     \
                         border-bottom: 5px solid black; margin:3px;    \
                         color: black;                                  \
                        }");
ui->modeComboBox->setView(listView);

但在这两种情况下,这都会完全禁用所选项目的突出显示(即第 17 个项目)

更新 1

我测试设置 ::item:checked 样式表,但没有帮助:

QListView * listView = new QListView(ui->modeComboBox);
listView->setStyleSheet("QListView::item {                              \
                         border-bottom: 5px solid white; margin:3px; }  \
                         QListView::item:selected {                     \
                         border-bottom: 5px solid black; margin:3px;    \
                         color: black; }                                \
                         QListView::item:checked {                      \
                         background-color: green;                       \
                         color: green;}"
                         );
ui->modeComboBox->setView(listView);

为了确定,我还把它添加到样式表中:

QComboBox QListView::item:checked {
 background-color: green;
}

选中17模式的结果是(黑色只是鼠标悬停):

更新 2

好的,我可以更改选中项目的字体粗细,但我无法从项目中删除勾号。我对我的样式表文件进行了试验,发现这两个选择器负责突出显示选中项的样式:

QWidget:item:selected
{
     border: 0px solid #999900;
     background: transparent;
}
QWidget:item:checked
{
     font-weight: bold;
}

如果我删除 ::item:selected 则 ::item:checked 不起作用(它不会使选中的项目变为粗体)并且勾号消失。

在 Qt 论坛上,他们建议我以某种方式缩短“组合框图标的空间”。我找不到负责的选择器。

【问题讨论】:

  • 从未测试过,但您尝试过:QComboBox QListView::item:checked { background-color: green; }?
  • @iuliu 我试过没用,更新问题..谢谢
  • @Iuliu 你的建议对我有帮助,但我在 QWidget 上设置了它.. 但我仍然无法删除代码..

标签: qt qcombobox qtstylesheets


【解决方案1】:

好吧,经过大量的努力,我做了一些解决方法.. 它不是最好的,它不正确,但它看起来还可以..

我以这种方式添加了粗体效果(​​它会影响其他小部件,例如可检查的菜单项,但我可以接受):

QWidget:item:selected
{
     border: 0px solid #999900;
     background: transparent;
}
QWidget:item:checked
{
     font-weight: bold;
}

然后,当我添加项目时,我会在其文本中添加空格以将其向右移动。我尝试了很多东西,但没有任何影响内部的 QAbstractItemView。

这是结果:

【讨论】:

    【解决方案2】:

    这对我有用!:

    myComboBox->setStyleSheet("QListView{color:black; background-color:white;}");
    

    【讨论】:

    • 这看起来不会突出显示 选定 项 - 它只会将所有文本设置为黑色并将背景设置为白色
    【解决方案3】:

    我在不太具体的样式表选择器和“padding-left”方面取得了成功:

    QComboBox:item {
        padding-left: 20px;  /* move text right to make room for tick mark */
    }
    QComboBox:item:selected {
        padding-left: 20px;  /* move text right to make room for tick mark */
        border: 2px solid black;
    }
    QComboBox:item:checked {
        padding-left: 20px;  /* move text right to make room for tick mark */
        font-weight: bold;
    }
    

    (可能还有一些不必要的重复!)

    【讨论】:

    • 我想我试过了..也许在较新的 Qt 中它可以正常工作..但是我想要实现的是只有粗体并且根本没有自动收报机 - 但如果这样工作它比添加空格(我没有时间检查您的解决方案),也许如果有人在这里至少可以尝试并提供反馈..
    • 这解决了问题,但它创建了一个新问题(Qt 5.9.2)。每个项目的高度取屏幕高度的一半。我必须添加一个最大高度...
    【解决方案4】:

    我知道现在已经很晚了,但是对于遇到同样问题的人来说: 我在这里的另一个问题上找到了这个:Not able to hide Choice-Indicator of the QComboBox

    这应该隐藏指标/刻度:

    QComboBox::indicator{
        background-color:transparent;
        selection-background-color:transparent;
        color:transparent;
        selection-color:transparent;
    }
    

    【讨论】:

    • 它看起来非常好,但我不再有项目来测试这个..所以只是投票
    【解决方案5】:

    @Miklemyers 回答删除了指标/刻度,但我发现空间仍然存在。要删除空间,我发现我还必须使用

    QComboBox::item:selected {                                                                                                      
        border: none;
    } 
    

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 2023-03-29
      • 2012-06-30
      • 1970-01-01
      相关资源
      最近更新 更多