Penso che sia necessario sottoclasse QItemDelegate.
QItemDelegate può essere utilizzato per fornire funzioni di visualizzazione personalizzato e redattore widget per le viste elemento basato su sottoclassi QAbstractItemView. L'utilizzo di un delegato per questo scopo consente ai meccanismi di visualizzazione e modifica di essere personalizzati e sviluppati indipendentemente da dal modello e dalla vista.
Questo codice è preso dagli esempi di Qt, l'applicazione torrent.
class TorrentViewDelegate : public QItemDelegate
{
Q_OBJECT
public:
inline TorrentViewDelegate(MainWindow *mainWindow) : QItemDelegate(mainWindow) {}
inline void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if (index.column() != 2) {
QItemDelegate::paint(painter, option, index);
return;
}
// Set up a QStyleOptionProgressBar to precisely mimic the
// environment of a progress bar.
QStyleOptionProgressBar progressBarOption;
progressBarOption.state = QStyle::State_Enabled;
progressBarOption.direction = QApplication::layoutDirection();
progressBarOption.rect = option.rect;
progressBarOption.fontMetrics = QApplication::fontMetrics();
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.textAlignment = Qt::AlignCenter;
progressBarOption.textVisible = true;
// Set the progress and text values of the style option.
int progress = qobject_cast<MainWindow *>(parent())->clientForRow(index.row())->progress();
progressBarOption.progress = progress < 0 ? 0 : progress;
progressBarOption.text = QString().sprintf("%d%%", progressBarOption.progress);
// Draw the progress bar onto the view.
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
}
};
In sostanza, come si può vedere controlla se la colonna da verniciare è di un indice specifico, se così dipinge una barra di avanzamento. Penso che potresti modificarlo un po 'e invece di usare QStyleOption puoi usare il tuo widget.
modifica: non dimenticare di configurare l'elemento delegato con QListView utilizzando setItemDelegate.
Mentre analizzo la tua domanda, mi sono imbattuto nel thread this, che elabora come dipingere un widget personalizzato utilizzando un QItemDelegate, credo che abbia tutte le informazioni che potrebbero essere necessarie.
fonte
2009-06-04 07:38:13
Grazie per il post, mi guarderò in esso più domani. Potresti approfondire come andrei a sostituire il disegno QStyleOption con un widget personalizzato? –
beh, è solo questione di dipingere il tuo widget con QPainter fornito nel metodo di pittura di QItemDelegate. Ho modificato il mio post per includere un link utile. –
Bene, posso ottenere qualcosa di grezzo lavorando con questa tecnica. Ma il problema è rappresentato dall'aspetto "widget arbitrari": ho un widget composto che contiene pulsanti, ecc., Che sono interattivi, quindi devono essere collocati fisicamente nella lista o l'utente non è in grado di fare clic su di essi. correggimi se sbaglio, ma questo disegnerà solo un widget inattivo. –