我需要设置自定义 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();
}
我无法完全理解它是如何工作的,但问题在于小部件在
ui->setupUi
之后初始化的顺序。
如果您的正确样式表不起作用,发现有两件事可以提供帮助:
在我的例子中,我将
initWin()
方法添加到我的自定义小部件中,将 setStylesheet()
移动到其中,然后从主窗口(在initWin()
之后)调用 ui->setupUi
,如下所示:ui->_objectName_->initWin()
。如果您需要设置多个小部件的样式,您可以使用以下方式访问它们
foreach (auto var, this->findChildren<_className_ *>())
{
var->initWin();
}