如何设置QTableView中特定单元格的行样式?

3 投票
1 回答
6061 浏览
提问于 2025-04-15 22:03

我正在使用QT图形用户界面(GUI)进行开发。我想用一个QTableView来实现一个简单的十六进制编辑控件。我的初步想法是使用一个有十七列的表格。每一行将包含16个十六进制字节,最后一列是这些数据的ASCII表示。理想情况下,我希望能够编辑或设置第十七列的样式,让每个单元格的上下没有线条,这样文本看起来更自然、更流畅。请问使用QTableView,应该怎么做比较好呢?

1 个回答

5

我想到几种方法可以满足你的需求;这两种方法都需要自己绘制网格,因为看起来没有简单的方法可以直接修改QTableView类的网格绘制过程:

1. 通过调用setShowGrid(false)来关闭树视图的标准网格,然后使用项目代理为需要的单元格绘制网格线。下面是一个例子:

// custom item delegate to draw grid lines around cells
class CustomDelegate : public QStyledItemDelegate
{
public:
    CustomDelegate(QTableView* tableView);
protected:
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
private:
    QPen _gridPen;
};

CustomDelegate::CustomDelegate(QTableView* tableView)
{
    // create grid pen
    int gridHint = tableView->style()->styleHint(QStyle::SH_Table_GridLineColor, new QStyleOptionViewItemV4());
    QColor gridColor = static_cast<QRgb>(gridHint);
    _gridPen = QPen(gridColor, 0, tableView->gridStyle());
}

void CustomDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    QStyledItemDelegate::paint(painter, option, index);

    QPen oldPen = painter->pen();
    painter->setPen(_gridPen);

    // paint vertical lines
    painter->drawLine(option.rect.topRight(), option.rect.bottomRight());
    // paint horizontal lines 
    if (index.column()!=1) //<-- check if column need horizontal grid lines
        painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());

    painter->setPen(oldPen);
}

// set up for your tree view:
ui->tableView->setShowGrid(false);
ui->tableView->setItemDelegate(new CustomDelegate(ui->tableView));

2. 创建一个QTableView的子类,并重写paintEvent方法。在这里,你可以选择自己绘制网格,或者让基类绘制网格,然后在网格上面用表格视图的背景颜色绘制水平线。

希望这能帮到你,祝好!

撰写回答