c-如何在QTableView中设置特定单元格的线条样式?

我正在使用QT GUI.我正在使用QTableView实现一个简单的十六进制编辑控件.我最初的想法是使用包含十七列的表.该表的每一行将具有16个十六进制字节,然后在第十七列中以ASCII表示该数据.理想情况下,我想编辑/设置第十七列的样式,以使每个单元格的顶部和底部都没有线条,从而使文本具有*流动的外观.使用QTableView解决此问题的最佳方法是什么?

解决方法:

我可以考虑几种完成所需工作的方式;两者都将包括绘制自定义网格,因为看起来没有直接连接到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方法.在那里,您既可以绘制自己的网格,也可以让基类来绘制它,然后使用tableview的背景色在网格顶部绘制水平线.

希望这会有所帮助,问候

上一篇:jeff dean的主页


下一篇:第15.24节 PyQt(Python+Qt)入门学习:Model/View架构中QTableView的作用及属性详解