Important: Please read the Qt Code of Conduct -

"complete control" owner drawing of QListWidget rows

  • I need a view that's something like Skype's contact view. List of names, with an image at their side, and some buttons that become visible as you select a row. Using QListWidgetItem does answer some of these requirements but is severely limited, by icon width and others.

    One other thing that's less of a priority -- QListWidget scrolls in rigid steps. The scroll is not smooth and you can never see "half a row" like you can in Skype. It's like QListWidget scrolls up and down in row-height steps, while Skype scrolls in single pixels. Much smoother and pleasing from a UX standpoint. I know Skype is QT. Are they using a different control for this?

    How do I achieve complete control over the drawing of a row in QListWidget?

  • @setVerticalScrollMode(QAbstractItemView::ScrollPerPixel)@ took care of the smooth scrolling problem. now the owner draw issues remain.

  • Concerning the scrolling, check out QAbstractItemView::setVerticalScrollMode ( ScrollMode mode )

    If you need complete control, you need to use QItemDelegate.

  • Thanks. Will give those a try. Any idea how how implement custom sorting on such a list?

  • It depends a bit on what you want to do. If you can get away with it, the easiest way is to set something you can sort on as a custom role and use that role to sort on. If not, you will need to reimplement sort() on your data model.

  • Not so sure about a model. I have a QListWidget to which i "add" instances of QListWidgetItem. Are you saying I can instantiate an external "Data model", populate it with my data, and then have the QListWidget use that as the source to populate rows instead of me "adding" it manually there?

  • Errr... Sorry, no. I never use Q*Widget myself, so I am not so used to the limitations of these classes. I was thinking about the View versions where you can set your own model.

  • I can do that, so should I replace my QListWidget with the QListView?

  • That makes life sometimes a bit easier, especially when you do more complex things.

    You use a QListView as widget and create a custom model derived from QAbstractListModel, that's not too hard, especially if it's read only.

    Then you can use a QSFPM (QSortFilterProxyModel) which you use in the view to do sorting. If you use QSFPM you have full access to the sorting criteria.

    Via a custom delegate (derived from QStyledItemDelegate) you can do custom drawing, change the size hint for rows etc.

Log in to reply