我目前正面临关于Qt和QTreeView样式表的问题。 我只想让树中选中的当前项以粗体显示。 我之前做过研究,许多论坛提供的解决方案是:
myView->setStyleSheet("QTreeView::item:selected {font: bold;}");
但这对我不起作用。我尝试了QTreeView {font: bold;}
(适用于每个项目)和QTreeView::item:selected {background-color:red;}
也适用。为什么字体不适用于所选项目?
谢谢!
答案 0 :(得分:2)
很老的问题,但也许有人会发现它很有用。 我在使用Qt 5.3时遇到了同样的问题。
我在qt-center上找到了一些关于样式表无法完成的信息。
有没有办法改变的字体粗细(或字体大小最小值) QListWidget中的选定项目?不,因为这样的字体样式选项适用 到QWidgets,所以你可以应用字体(或其他像字体大小) 整个QWidget的样式选项(本例中为QListWidget)而不是 导出的QWidget的特殊行为,即QListWidget的选择 项目
我认为它也适用于QTreeView,因为我也无法改变它的风格。 我可以更改边框,颜色,背景颜色,但没有任何关于字体。 首先我认为我必须重新实现paintEvent函数,因为我正在重新实现QTreeView。这也不起作用。
解决方案解决方案:
但我找到了一些使用QStyledItemDelegate的解决方法。 基本上你必须继承QTreeView,然后继承QStyledItemDelegate。 也许它可以在没有子类化QTreeView的情况下工作,但你必须以某种方式用选定和取消选择的项捕获一些信号并调用setItemDelegateForRow和setItemDelegateForColumn(它应该只改变相交的单元格)
以这种方式重新实现QStyledItemDelegate :: paint:
QStyledItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItemV4 editedOpt = option;
editedOpt.font = QFont("Arial", 23, 500);
initStyleOption( &editedOpt, index );
QStyledItemDelegate::paint(painter, editedOpt, index);
}
重新实现QTreeView :: selectionChanged(或简单的QTreeView并捕获QItemSelectionModel :: selectionChanged):
void CustomTreeView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
foreach(const QModelIndex &index, selected.indexes()) {
setItemDelegateForRow(index.row(), new CustomDelegate(this));
setItemDelegateForColumn(index.column(), new CustomDelegate(this));
}
foreach(const QModelIndex &index, deselected.indexes()) {
setItemDelegateForRow(index.row(), new QStyledItemDelegate(this));
setItemDelegateForColumn(index.column(), new QStyledItemDelegate(this));
}
}