2010-04-26 5 views
3

Je travaille avec une interface graphique QT. J'implémente un contrôle d'édition hexadécimal simple en utilisant un QTableView. Mon idée initiale est d'utiliser une table avec dix-sept colonnes. Chaque ligne de la table aura 16 octets hexadécimaux, puis une représentation ASCII de ces données dans la dix-septième colonne. Idéalement, je voudrais modifier/définir le style de la dix-septième colonne pour ne pas avoir de lignes en haut et en bas de chaque cellule pour donner au texte une apparence fluide. Quelle est la meilleure façon d'aborder cela en utilisant QTableView?Comment puis-je définir le style de ligne d'une cellule spécifique dans un QTableView?

Répondre

3

Je pourrais penser à quelques façons de faire ce dont vous avez besoin; les deux incluraient le dessin d'une grille personnalisée car il semble qu'il n'y ait pas de moyen simple de se connecter à la routine de peinture de grille de la classe QTableView:

1.Éteignez la grille standard pour votre grille treeview en appelant setShowGrid (false) et dessinez lignes de grille pour les cellules qui en ont besoin en utilisant délégué article. Voici un exemple:

// 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.Créez un descendant QTableView et remplacer la méthode paintEvent. Vous pouvez soit dessiner votre propre grille, soit laisser la classe de base la dessiner, puis peindre des lignes horizontales sur la grille en utilisant la couleur d'arrière-plan de tableview.

espérons que cela aide, salutations

+0

Je vais lui donner un coup de main. Merci pour le conseil. Ce sera difficile. Je finirai probablement par créer mon propre widget HexEdit pour cacher ce désordre. Le résultat final devrait être agréable, cependant. Merci. –

Questions connexes