如何在QTableView中为特定单元格着色或制作粗体文字?

Vij*_*y13 5 c++ qt qt4 qtableview

我已经习惯QTableView在我的Qt程序中看到表格数据,并且我需要将某些单元格与其他单元格区分开来,可以在这些特定单元格中绘制字体粗体或绘制这些特定单元格的背景.

有人可以提供代码而不仅仅是说使用QAbstractItemDelegate吗?

我阅读了文档,QAbstractItemDelegate但无法理解,请使用示例解释.

vah*_*cho 23

为了使文本在表​​视图中以不同方式显示,您可以修改模型(如果存在)以及模型函数中的句柄Qt::FontRole和/或Qt::ForegroundRole角色QAbstractItemModel::data().例如:

QVariant MyModel::data(const QModelIndex &index, int role) const
{
    if (role == Qt::FontRole && index.column() == 0) { // First column items are bold.
        QFont font;
        font.setBold(true);
        return font;
    } else if (role == Qt::ForegroundRole && index.column() == 0) {
        return QColor(Qt::red);
    } else {
        [..]
    }
Run Code Online (Sandbox Code Playgroud)

}

  • 这是正确的解决方案,其他人都错了:-) (4认同)
  • @sami1592,`data()`函数不返回`QColor`,而是使用`QColor`或`QBrush`构建的`QVariant`。不管它是什么,它最终都会通过 `qvariant_cast<QBrush>()` 转换为 `QBrush`。 (2认同)
  • 是的,我查看了消息来源. (2认同)

Goo*_*gie 5

无需使用抽象委托。样式化委托可以完成您所需的大部分工作。使用它并重新实现仅需要的行为。

。H:

#include <QStyledItemDelegate>

class MyDelegate : public QStyledItemDelegate
{
    Q_OBJECT

    public:
        explicit MyDelegate(QObject *parent = 0);

        void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;

    private:
        bool shouldBeBold(const QModelIndex &index);
}
Run Code Online (Sandbox Code Playgroud)

.cpp:

MyDelegate::MyDelegate(QObject *parent) :
    QStyledItemDelegate(parent)
{
}


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

    QVariant data = index.data(...); // pick the data you need here
    opt.font.setBold(shouldBeBold(data));

    QStyledItemDelegate::paint(painter, opt, index);
}

bool MyDelegate::shouldBeBold(const QModelIndex &index)
{
    // you need to implement this
}
Run Code Online (Sandbox Code Playgroud)

然后将委托应用于视图。如果shouldBeBold()返回false,则委托将像标准油漆一样绘制。如果返回true,它将应用粗体。

我希望这足以让您开始。