1

我目前面临关于 Qt 和 QTreeView 样式表的问题。我只是希望在树中选择的当前项目以粗体书写。我之前做过研究,很多论坛给出的解决方案是:

myView->setStyleSheet("QTreeView::item:selected {font: bold;}");

但这对我不起作用。我尝试QTreeView {font: bold;}了哪个有效(适用于每个项目)并且QTreeView::item:selected {background-color:red;}也有效。为什么字体不适用于所选项目?谢谢 !

4

1 回答 1

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));
    }
}
于 2014-09-17T12:43:57.823 回答