下拉列表中所选项目的QComboBox样式

时间:2015-04-29 09:44:36

标签: qt qcombobox qtstylesheets

我想在组合框的下拉列表中选择所选项目的突出显示。

与其他问题的区别在于我不想选择"选择" item(用鼠标悬停).. 但是我对已经选择的项目的样式感兴趣。

默认是某种在文本上绘制的自动收报机。我希望选择的项目有粗体文字,没有自动收报机图像。

在最坏的情况下只需 shifth 右侧的文字即可正确显示自动收报机。

我拥有的是:

enter image description here

注意第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;
}

我试图覆盖项目delagate:

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

我测试了set :: item:checked stylesheet但它没有帮助:

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模式的结果是(黑色只是鼠标悬停):

enter image description here

更新2

好的,我能够改变选中项目的字体重量,但我无法从项目中删除愚蠢的自动收报机..我试用了样式表文件,我发现这两个选择器负责检查项目的样式highlightation:

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

如果我删除了:: item:选中,那么:: item:checked不起作用(它不会对选中的项进行粗略化)并且代码消失了。

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

我觉得样式表是黑魔法,只有被选中的人才能理解里面发生的事情。

5 个答案:

答案 0 :(得分:2)

经过多次努力后我做了一些解决方法..它不是最好的,它不合适,但看起来还不错..

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

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

然后,当我添加项目时,我将空格添加到文本中以便将其移到右侧。我尝试了很多东西,但没有任何内容影响QAbstractItemView。

结果如下:

enter image description here

答案 1 :(得分:2)

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

    echo $form->field($model, 'user_id[]', [
          ])->widget(Select2::classname(), [
          'data' => $user_data,
          'pluginOptions' => [
              'allowClear' => true,
              'placeholder' => 'Select user...',
              'multiple' => true,
          ],
      ])->dropDownList($user_data,     [
          'multiple'=>'multiple',
          'class'=>'chosen-select input-md required',
         ]    )->label(Yii::t('app','User').' : '); 

(也可能是一些不必要的重复!)

答案 2 :(得分:1)

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

这应隐藏指标/勾号:

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

答案 3 :(得分:1)

@Miklemyers的答案删除了指标/技巧,但我发现空间仍然剩余。要删除空间,我发现我还必须使用

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

答案 4 :(得分:-3)

这对我有用!:

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