Domanda

Ho una sottoclasse QTreeView (e QAbstractItemModel sottoclasse), che ha un bel colpo di testa orizzontale. Vorrei aggiungere intestazioni verticali (andando lungo il lato sinistro) da abbinare. Ma a differenza QTableView che ha separato verticale ( setVerticalHeader() ) e le intestazioni orizzontali ( setHorizontalHeader() ), QTreeView consente solo un singolo colpo di testa ( setHeader() ).

So che posso solo far finta che la colonna più a sinistra è l'intestazione e il rendering con un colore di sfondo diverso (non ho bisogno la possibilità di ridimensionare o riorganizzare le file, in modo da non dover implementare una delle quei comportamenti speciali). Ma che non si tiene conto stili locali. Per esempio, sul mio sistema intestazioni hanno una leggera pendenza, dando loro un aspetto quasi 3D.

Sono quindi alla ricerca sia per un modo per aggiungere un connettore verticale adeguata (sto indovinando che sarebbe una sottoclasse di QHeaderView), oppure il rendering di un colpo di testa verso il basso la colonna più a sinistra, ma rendendo il giusto senso.

È stato utile?

Soluzione

Il tuo probabilmente ragione che si dovrà "far finta", ma si dovrebbe essere in grado di disegnare a guardare buono come le intestazioni orizzontali.

Quello che dovete fare è essere responsabile della paintEvent per quelle cellule e quindi utilizzare lo stile corrente per disegnare un controllo personalizzato. Qualcosa di simile:

//QWidget* w is the widget who's style you want
QPainter painter(this);
QStyleOptionHeader opt;
opt.initFrom(this);
opt.state = QStyle::State_None;
opt.orientation = Qt::Vertical;
opt.state |= QStyle::State_Vertical;
if (w->isEnabled())
    opt.state |= QStyle::State_Enabled;
opt.state |= QStyle::State_Active;
w->style()->drawControl(QStyle::CE_Header, &opt, &painter, w);

Il modo più semplice per essere responsabile di un evento di vernice per le celle che si desidera sarebbe quello di creare un delegato elemento personalizzato e reimplementare il metodo virtual void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const = 0. Basta cancello tua pittura agli indici che ti interessano e passare il resto della classe super (vedi documentazione di Qt per questa classe).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top