我正在使用 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后代并覆盖绘制事件 http://doc.qt.nokia.com/4.6/qtableview.html#paintEvent方法。在那里,您可以绘制自己的网格,也可以让基类绘制它,然后使用 tableview 的背景颜色在网格顶部绘制水平线。
希望这有帮助,问候
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)