Je pense que vous devez sous-classe QItemDelegate.
QItemDelegate peut être utilisé pour fournir sur la base des sous-classes QAbstractItemView fonctions d'affichage personnalisé et éditeur widgets pour les vues de l'élément. L'utilisation d'un délégué à cet effet permet aux mécanismes d'affichage et d'édition d'être personnalisés et développés de manière indépendante à partir du modèle et de la vue.
Ce code provient des exemples de Qt, l'application 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);
}
};
En fait, comme vous pouvez le voir vérifie si la colonne à peindre est d'un indice spécifique, le cas échéant, il peint une barre de progression. Je pense que vous pourriez le modifier un peu et au lieu d'utiliser un QStyleOption, vous pouvez utiliser votre propre widget. Edit: ne pas oublier de configurer votre délégué d'article avec votre QListView en utilisant setItemDelegate. En étudiant votre question, je suis tombé sur thread this, qui explique comment peindre un widget personnalisé en utilisant un QItemDelegate, je crois qu'il a toutes les informations dont vous pourriez avoir besoin.
Merci pour le poste, je vais examiner plus demain. Pourriez-vous élaborer sur la façon dont je vais remplacer le dessin QStyleOption avec un widget personnalisé? –
Eh bien, il suffit de peindre votre widget avec le QPainter fourni dans la méthode de peinture de QItemDelegate. J'ai modifié mon message pour inclure un lien utile. –
Eh bien, je peux obtenir quelque chose de rude en utilisant cette technique. Mais le problème est l'aspect "widget arbitraire" - j'ai un widget composé qui contient des boutons, etc, qui sont interactifs - donc ils doivent être physiquement placés dans la liste ou l'utilisateur n'est pas capable de cliquer dessus. corrigez-moi si je me trompe, mais cela ne fera que dessiner un widget inactif. –