【问题标题】:Change default selection color for QTableView更改 QTableView 的默认选择颜色
【发布时间】:2016-05-26 12:56:38
【问题描述】:

我正在使用带有 QAbstractTableModel 的 QTableView。

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

我已经继承了QTableView 类。

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

如何改变这种行为?如何避免/忽略 QTableView 的默认颜色,并且只使用模型类返回的颜色?

【问题讨论】:

  • 任何代码示例?为什么你需要继承QTableView
  • 我将QTableView 子类化,因为在我的情况下,表格将对左键单击、双击和右键单击做出反应。没有子类化,如果我实现QWidget::customContextMenuRequestedQAbstractItemView::clicked,则使用给定的信号槽,然后如果我右键单击它也会发出 click() 信号。这就是为什么我必须继承 QTableView 并重新实现 mousePressEvent 以区分鼠标左键和右键
  • 你应该使用QItemDelegate来处理鼠标事件。
  • 请您花时间详细说明一下好吗? :) 我只想要从我的模型类返回的 QColor/QBrush 来表示我的 TableView 单元格,而不是其他任何东西。我怎样才能做到这一点?您的详尽回答将不胜感激:)
  • Stackoverflow 不是为免费代码编写而设计的。再一次 - 您需要澄清您的问题并提供 SSCCE。您可以从 Qt 文档开始,如果有不清楚的地方,可以提出额外的问题。

标签: qt qtableview qabstracttablemodel


【解决方案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);
}

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

enum MyRoles
{
    HighlightColorRole = Qt::UserRole
};

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

在您的委托中,您可以像这样获得该颜色:

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

【讨论】:

  • 这里我们将行颜色设置为红色itemOption.palette.setColor(QPalette::Highlight, Qt::red);,但我选择的行/行的颜色取决于某些条件在我的模型类中确定。如果我只想要从模型返回的颜色而不想要其他颜色,该怎么办?
  • 谢谢,希望这能解决问题:D 目前我正在尝试您的解决方案,但initStyleOption(&amp;itemOption, index); 会抛出一个错误,提示“'initStyleOption': identifier not found”。似乎函数属于 QStyledItemDelegate doc.qt.io/qt-4.8/qstyleditemdelegate.html#initStyleOption 。有什么想法吗?
  • 由于某种原因没有调用疼痛函数。这是我的自定义委托类头文件ideone.com/6xS5uK 源文件ideone.com/Hdbjtk 我将委托设置为我的视图类,如下myTableView-&gt;setItemDelegate(mCustomDelegateClass); 我做错了什么:/
  • 是的,你是对的,initStyleOption() 方法不是QItemDelegate 的一部分,所以从QStyledItemDelegate 派生你的自定义委托。并且您的 paint() 方法没有被调用,因为在您的派生委托中它没有被定义为 const 方法。
  • 我已经更正了我的答案。所以把那个 const 修饰符放在你的 paint() 方法声明后面就可以了。
猜你喜欢
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多