André, your a rock star !!! I did as you suggested and "wahhla, bingo, bango" - it all works. Thanks a lot for taking the time to answer my question.
-David On Thu, May 10, 2012 at 4:52 AM, André Somers <an...@familiesomers.nl>wrote: > Op 10-5-2012 13:45, David Boosalis schreef: > > Hope someone can help me here. I have a QTableView for which I use my > > own QSortFilterProxyModel and own Delegate which is based on > > QStyledItemDelegate. My issue is in the Delegates::paintEvent() > > I get core dumps if I have the following (Not using a proxy filter it > > works by the way): > > > > void DataDelegate::paint(QPainter *painter, > > const QStyleOptionViewItem &option, > > const QModelIndex &index) const > > { > > QStandardItem *item = 0; > > if (!index.isValid()) { > > qWarning() << "Invalid index" << __FILE__ << __LINE__; > > return; > > } > > QStyledItemDelegate::paint(painter,option,index); > > QStandardItemModel *m = (QStandardItemModel *) index.model(); > > bool isWatched = index.data(Qt::UserRole+4).toBool(); > > if ( (isWatched) && (index.column() == 0)) { > > item = (QStandardItem *) m->itemFromIndex(index); // > > <--------------- CORE DUMPS HERE------------------ > > if (!item) { > > return; > > } > > .// continue to do some custom painting... > > > ------------------------------------------------------------------------------------------------------------------------ > > > > Now if I do something like this: > > void DataDelegate::paint(QPainter *painter, > > const QStyleOptionViewItem &option, > > const QModelIndex &proxyIndex) const > > { > > QStandardItem *item = 0; > > if (!proxyIndex.isValid()) { > > qWarning() << "Invalid proxy index" << __FILE__ << __LINE__; > > return; > > } > > QStyledItemDelegate::paint(painter,option,proxyIndex); > > if (!proxyFilter) { // store in Delegate class and is pointer to a > > class derived from QSortFilterProxyModel > > qWarning() << "Invalid model for data delegate" << __FILE__ << > > __LINE__; > > return; > > } > > QModelIndex index = proxyFilter->mapToSource(proxyIndex); > > if (!index.isValid()) { > > // qWarning() << "Invalid index for data delegate" << __FILE__ << > > __LINE__; > > return; > > } > > QStandardItemModel *m = (QStandardItemModel *) index.model(); > > bool isWatched = index.data(Qt::UserRole+4).toBool(); > > if ( (isWatched) && (index.column() == 0)) { > > item = (QStandardItem *) m->itemFromIndex(index); // > > if (!item) { > > return; > > } > > // continue to do some custom painting.... > > > > > > This works, with the following ugly exception. I get a lot of run > > time warnings > > " QSortFilterProxy Model: index from wrong model passed to mapToSource" > > > > Despite these warnings I doI get my custom painting to occur. I would > > like to figure out a way to do it right so that I do not get thousands > > of these warning messages at runitme. > > > > Any suggestions on how to properly do a Delegate::paint() on a > > QTableView with a custom QSortFilterProxyModel is greatly appreciated. > > > > > > -David > That seems completely logical to me. As you found out, you need to check > any pointer you get back to see if it is not 0 before you dereference > it. In your case, your issue is that you're mixing indexes from your > proxy model and your source model. Don't do that. They can be mapped to > each other, but only by the proxy model itself. > > Instead of trying to get a QStandardItem*, why don't use simply use the > actual data exposed throught the model API itself? Any data you need for > rendering should be available through the data() or flags() method. > Nothing more. What you are doing is tightly binding your delegate to the > model that feeds the data to the view. That will break down as soon as > you decide to change the model (or, as in your case, put a proxy between > the model and the view). Instead, you should limit yourself to the > interface you get from QAbstractItemModel. That is the only thing your > delegate should know about. > > André > > _______________________________________________ > Interest mailing list > Interest@qt-project.org > http://lists.qt-project.org/mailman/listinfo/interest >
_______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest