如何在QTableView中为特定单元格着色或使文本变为粗体?

时间:2014-01-21 17:20:47

标签: c++ qt qt4 qtableview

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

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

我阅读了QAbstractItemDelegate的文档,但无法理解,请使用示例进行说明。

3 个答案:

答案 0 :(得分:19)

为了在表格视图中以不同方式显示文字,您可以修改模型(如果存在),并在模型的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 {
        [..]
    }

}

答案 1 :(得分:4)

无需使用抽象委托。 Styled delegate完成了您需要的大部分工作。使用它并重新实现所需的行为。

·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);
}

的.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
}

然后将委托应用于视图。如果shouldBeBold()返回false,则委托将绘制为标准的。如果返回true,则将应用粗体字。

我希望你能够开始。

答案 2 :(得分:3)

如果您没有模特或代表并且您不想创建模型或代表,则可以直接设置单元格的字体:

QFont font(cell->font());
font.setBold(true);
cell->setFont(font);