更改QTableView的默认选择颜色

更改QTableView的默认选择颜色,qt,qtableview,qabstracttablemodel,Qt,Qtableview,Qabstracttablemodel,我正在将QTableView与QAbstractTableModel一起使用 我对QAbstractTableModel进行了子类化,并且在Qt::BackgroundRole和Qt::foreggroundrole的模型类中,我根据某些条件返回了一些颜色 我已经对QTableView类进行了子类化 选择表中的任何行/单元格时,该行/单元格将以选项卡视图的默认颜色高亮显示,它不会显示从模型类返回的颜色 我怎样才能改变这种行为?如何避免/忽略默认的QTableView颜色,并仅使用模型类返回的颜色

我正在将QTableView与QAbstractTableModel一起使用

我对
QAbstractTableModel
进行了子类化,并且在
Qt::BackgroundRole
Qt::foreggroundrole
的模型类中,我根据某些条件返回了一些颜色

我已经对
QTableView
类进行了子类化

选择表中的任何行/单元格时,该行/单元格将以选项卡视图的默认颜色高亮显示,它不会显示从模型类返回的颜色

我怎样才能改变这种行为?如何避免/忽略默认的
QTableView
颜色,并仅使用模型类返回的颜色?

您必须使用自定义委托。 子类化
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);
}
QColor color = index.data(HighlightColorRole).value<QColor>();
如果您想从模型中选择颜色,我建议为此定义一个特殊的自定义角色:

enum MyRoles
{
    HighlightColorRole = Qt::UserRole
};
您的模型将使用此角色通过
qabstractemmodel::data()
方法返回自定义高亮显示(选择)颜色

在代理中,您可以获得如下颜色:

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);
}
QColor color = index.data(HighlightColorRole).value<QColor>();
QColor color=index.data(HighlightColorRole.value();

有代码示例吗?为什么需要子类化
QTableView
?我子类化了
QTableView
,因为在我的例子中,表会对左键单击、双击和右键单击做出反应。如果我实现了
QWidget::customContextMenureQuest
qabstrationView::click
则如果我右键单击,则如果我右键单击它也会发出click()信号。这就是为什么我必须将QTableView子类化并重新实现
mousePressEvent
来区分鼠标左键和右键单击。您应该使用
QItemDelegate
来处理鼠标事件。请您花点时间详细说明一下好吗?:)我只需要从模型类返回的QColor/QBrush来表示我的TableView单元格,其他什么都不需要。我该怎么做?您详细的回答将不胜感激:)Stackoverflow不是为免费编写代码而设计的。再次-您需要澄清您的问题并提供SSCCE。您可以从Qt文档开始,如果有不清楚的地方,可以询问额外的问题。这里我们将行颜色设置为红色
itempoption.palete.setColor(Qpalete::Highlight,Qt::red)但所选行的颜色在模型类中根据某些条件确定。如果我只想要从模型返回的颜色,而不想要其他颜色,我该怎么办?谢谢,希望这能解决问题:D目前我正在尝试您的解决方案,但是
initStyleOption(&itemOption,index)抛出一个错误,显示“'initStyleOption':找不到标识符”。似乎函数属于
QStyledItemDelegate
。知道吗?由于某种原因,疼痛函数没有被调用。这是我的自定义委托类头文件源文件,我将委托设置为我的视图类,如下
myTableView->setItemDelegate(mCustomDelegateClass)
我做错了什么:/Yeah,你是对的,
initStyleOption()
方法不是
QItemDelegate
的一部分,因此从
QStyledItemDelegate
派生自定义委托。您的
paint()
方法没有被调用,因为在派生委托中它没有定义为常量方法。我已经更正了我的答案。因此,将const修饰符放在
paint()
方法声明之后,就可以了。