qt - SortRole in QSortFilterProxyModel is not set -
i create qtableview custom model , custom sortfilterproxymodel
issuetablemodel *issuemodel = new issuetablemodel(this->_repository->getissuelist()); issuetablesortfilterproxymodel *proxymodel = new issuetablesortfilterproxymodel(this); proxymodel->setsourcemodel(issuemodel); this->_ui->issuestable->setmodel(proxymodel); and in sortfilterproxymodel constructor:
issuetablesortfilterproxymodel::issuetablesortfilterproxymodel(qobject *parent) : qsortfilterproxymodel(parent) { this->setsortrole(qt::userrole); this->setfilterrole(qt::userrole); } with custom lessthan method in proxymodel. when data retrieved via model data method,
- qt::displayrole
- qt::decorationrole
- qt::fontrole
- qt::textalignmentrole
- qt::backgroundrole
- qt::foregroundrole
- qt::checkstaterole
- qt::sizehintrole
are called, not qt::userrole need output correct sorting data model item:
qvariant issuetablemodel::data(const qmodelindex &index, int role) const switch (role) { case qt::decorationrole: // display icons switch (index.column()) { [...] } case qt::displayrole: // display text data switch (index.column()) { [...] } case qt::userrole: qdebug() << "user role!!!!"; // return data sorting/filtering switch (index.column()) { [...] } default: return qvariant(); } } so question is: why data method of model never called qt::userrole when sorting proxymodel?
solution:
i got data in lessthan method via:
bool issuetablesortfilterproxymodel::lessthan(const qmodelindex &left, const qmodelindex &right) const { qvariant leftdata = sourcemodel()->data(left); qvariant rightdata = sourcemodel()->data(right); switch (leftdata.type()) { case qvariant::int: return leftdata.toint() < rightdata.toint(); case qvariant::string: return leftdata.tostring() < rightdata.tostring(); case qvariant::datetime: return leftdata.todatetime() < rightdata.todatetime(); default: return false; } } but did not set second parameter of data method specifies role...
qvariant leftdata = sourcemodel()->data(left, qt::userrole);
if reimplement lessthan need perform sorting yourself. setsortrole affects default lessthan implementation.
Comments
Post a Comment