2010-04-26 320 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

相關問題