Qt StyleSheet用于QTreeView

时间:2012-11-16 08:47:02

标签: c++ qt model-view-controller qtreeview qtstylesheets

我目前正面临关于Qt和QTreeView样式表的问题。 我只想让树中选中的当前项以粗体显示。 我之前做过研究,许多论坛提供的解决方案是:

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

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

1 个答案:

答案 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));
    }
}