如何设置QTableView中特定单元格的行样式?
我正在使用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方法。在这里,你可以选择自己绘制网格,或者让基类绘制网格,然后在网格上面用表格视图的背景颜色绘制水平线。
希望这能帮到你,祝好!