【发布时间】:2012-01-15 01:35:02
【问题描述】:
可以设置QComboBox下拉列表的选中项样式(Qt样式表)吗?
【问题讨论】:
可以设置QComboBox下拉列表的选中项样式(Qt样式表)吗?
【问题讨论】:
解决办法是
方法如下:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMainWindow * mainWindow = new QMainWindow();
QComboBox * combo = new QComboBox(mainWindow);
QListView * listView = new QListView(combo);
combo->addItem("foo");
combo->addItem("bar");
combo->addItem("foobar");
combo->addItem("fooooo");
listView->setStyleSheet("QListView::item { \
border-bottom: 5px solid white; margin:3px; } \
QListView::item:selected { \
border-bottom: 5px solid black; margin:3px; \
color: black; \
} \
");
combo->setView(listView);
mainWindow->show();
app.exec();
return 0;
}
备注: 我认为,according to the Qt docs 应用这种风格也应该可以工作......但它没有。
QComboBox QAbstractItemView::item {
border-bottom: 5px solid white; margin:3px;
}
QComboBox QAbstractItemView::item:selected {
border-bottom: 5px solid black; margin:3px;
}
【讨论】:
如果您的意思是当组合框显示其元素时(即处于“下拉”状态),您希望所选项目看起来不同,您可以更改调色板中 Highlight 和 HighlightedText 的颜色,或设置样式内QAbstractItemView
#include <QtGui>
int main(int argc, char **argv) {
QApplication app(argc, argv);
QComboBox cb;
cb.addItem("Item 1");
cb.addItem("Item 2");
cb.addItem("Item 3");
cb.show();
QPalette p = cb.palette();
p.setColor(QPalette::HighlightedText, QColor(Qt::red));
p.setColor(QPalette::Highlight, QColor(Qt::green));
cb.setPalette(p);
// OR ...
// cb.setStyleSheet("QComboBox QAbstractItemView { "
// "selection-background-color: green; "
// "selection-color: red; }");
return app.exec();
}
如果您只是指处于“折叠”状态的元素的样式,我会查看 Qt 样式表参考的“Customizing QComboBox”部分,以获取有关您尝试做什么的示例。
【讨论】:
@Sergey Vlasov:我不知道您的问题是否有更好的解决方案,但是我设法通过以下方式解决了它:
class MyDelegate : public QStyledItemDelegate
{
protected:
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
if (option.state & QStyle::State_HasFocus){
QStyleOptionViewItem my_option = option;
my_option.state = my_option.state ^ QStyle::State_HasFocus;
QStyledItemDelegate::paint(painter, my_option, index);
return;
}
QStyledItemDelegate::paint(painter, option, index);
}
};
然后在组合框中使用您的委托:
QStyledItemDelegate* itemDelegate = new MyDelegate();
combobox->setItemDelegate(itemDelegate);
这消除了所选项目周围令人讨厌的框架
【讨论】: