2010-04-26 37 views
3

我正在使用QT GUI。我正在使用QTableView实现一个简单的十六进制编辑控件。我最初的想法是使用一个有17列的表格。表格的每一行将有16个十六进制字节,然后是第十七列中的那个数据的ASCII表示。理想情况下,我想编辑/设置第十七列的样式,在每个单元格的顶部和底部没有任何线条,以使文本具有自由流动的外观。使用QTableView解决这个问题的最好方法是什么?如何在QTableView中设置特定单元格的线条样式?

回答

3

我可以考虑几种做你需要的方法;都将包括绘制自定义网格,因为它看起来像没有直接的方式挂钩到QTableView类的网格绘制例程中:

1.通过调用setShowGrid(false)并绘制您的treeview网格的标准网格使用物品代理需要它们的单元格的网格线。下面是一个例子:

// 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的背景颜色在网格顶部绘制水平线。

希望这有助于,关心

+0

我会给它一个重击。感谢您的建议。这将是棘手的。我可能会最终创建我自己的HexEdit小部件来隐藏这种混乱。不过,最终的结果应该不错。谢谢。 – 2010-04-27 03:47:50

相关问题