QCombobox 禁用状态样式

问题描述 投票:0回答:1

我需要设置自定义 QComboBox 的禁用状态的样式。对于正常状态,我使用这样的样式表:

"QComboBox {"
    "border: 1px solid grey;" 
    "border-radius: 8px;" 
    "combobox-popup: 0;" 
    "background: transparent;"
    "padding: 0px 0px 0px 10px;""}" 

而且工作正常。

当我使用“QComboBox:disabled {}”样式表时,没有任何反应,并且小部件使用通常的禁用颜色绘制。我该怎么办?

这是完整的小部件代码(小部件是在设计器中创建的):

customdropdown::customdropdown(QWidget *parent) : QComboBox(parent)
{
    this->view()->window()->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint );
    this->view()->window()->setAttribute(Qt::WA_TranslucentBackground);
    this->setItemDelegate(new Delegate());
    setStyleSheet("QComboBox {"                                 //ComboBox
         "border: 1px solid grey;"
         "border-radius: 8px;"
         "combobox-popup: 0;"
         "background: transparent;"
         "padding: 0px 0px 0px 10px;""}"
   "QComboBox QAbstractItemView {"
          "color: black;"
          "border: 1px solid grey;"
          "border-radius: 8px;""}"
    "QListView::item {"
          "height: 26px;""}"
    "QComboBox::down-arrow {"
         "image: url("\":/rsc/img/down_arrow.png\"");""}"
    "QComboBox::drop-down:button {"
          "border: 1px solid grey;"
          "border-radius: 8px;"
          "border-left: none;"
          "background-color: transparent;"
          "width: 30px;""}"
    "QComboBox:disabled{"
          "border: 1px solid red;"
          "border-radius: 8px;"
          "combobox-popup: 0;"
          "background: red;"
          "padding: 0px 0px 0px 10px;""}");
}

void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QPainterPath path;
    path.addRect(option.rect.x(), option.rect.y(), option.rect.width(), option.rect.height());
    if (index.row() == (index.model()->rowCount()-1))  //if the last item
    {
        path.clear();
        path.addRoundedRect( option.rect, QString("8").toInt(), QString("8").toInt() );
        path.addRect( QRect( (option.rect.x()+option.rect.width()-10), option.rect.y(), 10, 10 ) ); // Top right corner not rounded
        path.addRect( QRect( option.rect.x(), option.rect.y(), 10, 10 ) ); // TOp left corner not rounded
    }
    painter->save();
    painter->setClipping(true);
    painter->setClipPath(path);
    QStyledItemDelegate::paint(painter, option, index);
    painter->restore();
}
c++ qt
1个回答
0
投票

我无法完全理解它是如何工作的,但问题在于小部件在

ui->setupUi
之后初始化的顺序。

如果您的正确样式表不起作用,发现有两件事可以提供帮助:

  1. 自定义小部件声明不应位于 mainwindow.cpp 中
  2. 小部件样式表应该应用于某些方法(而不是构造函数中)

在我的例子中,我将

initWin()
方法添加到我的自定义小部件中,将
setStylesheet()
移动到其中,然后从主窗口(在
initWin()
之后)调用
ui->setupUi
,如下所示:
ui->_objectName_->initWin()
。如果您需要设置多个小部件的样式,您可以使用以下方式访问它们

foreach (auto var, this->findChildren<_className_ *>()) 
    {
        var->initWin();
    }
© www.soinside.com 2019 - 2024. All rights reserved.