更改QTableView

时间:2016-02-15 14:49:22

标签: qt qtableview qabstracttablemodel

我正在使用QTableView和QAbstractTableModel。

我已经为QAbstractTableModel创建了子类,并且在Qt::BackgroundRoleQt::ForegroundRole的模型类中,我根据某些条件返回了一些颜色。

我已经将QTableView类子类化了。

当我选择表格中的任何行/单元格时,行/单元格以tabelVeiw的默认颜色突出显示,它不显示从我的模型类返回的颜色

如何更改此行为?如何避免/忽略QTableView的默认着色并且只使用我的模型类返回的颜色?

1 个答案:

答案 0 :(得分:1)

您必须使用自定义委托。 将QStyledItemDelegate子类化并实现它的paint()方法,如下所示:

void MyDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
    QStyleOptionViewItem itemOption(option);              
    initStyleOption(&itemOption, index); 

    if ((itemOption.state & QStyle::State_Selected) &&
        (itemOption.state & QStyle::State_Active))
        itemOption.palette.setColor(QPalette::Highlight, Qt::red);  // set your color here

    QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &itemOption, painter, nullptr);
}

如果你想从模型中获得selecion颜色,我建议为此目的定义一个特殊的自定义角色:

enum MyRoles
{
    HighlightColorRole = Qt::UserRole
};

您的模型将使用此角色通过QAbstractItemModel::data()方法返回自定义突出显示(选择)颜色。

在你的代表中你可以获得这样的颜色:

QColor color = index.data(HighlightColorRole).value<QColor>();