DEATH TO setItemWidget!
#include <QApplication>
#include <QStyledItemDelegate>
#include <QStandardItemModel>
#include <QSortFilterProxyModel>
#include <QTreeView>
#include <QHeaderView>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
int main(int argc, char **argv) {
QApplication app(argc, argv);
QStandardItemModel model;
model.insertColumns(0,3);
model.insertRows(0,3);
for(int i=0;i<3;++i){
model.setData(model.index(i,0),QStringLiteral("autor"));
model.setData(model.index(i,1),QStringLiteral("resolution"));
model.setData(model.index(i,2),QStringLiteral("type"));
model.setData(model.index(i,0),Qt::Unchecked,Qt::CheckStateRole);
model.item(i,0)->setFlags(model.flags(model.index(i,0)) | Qt::ItemIsUserCheckable);
}
QWidget mainWid;
QTreeView* mainView = new QTreeView(&mainWid);
const QColor backColor = mainWid.palette().background().color();
mainView->setStyleSheet(QStringLiteral("QTreeView{border: 0px;background-color:%1;} QTreeView::item:hover{background-color:%1;}").arg(backColor.name(QColor::HexRgb)));
mainView->setModel(&model);
mainView->setIndentation(0);
mainView->setSelectionMode(QAbstractItemView::NoSelection);
mainView->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::Preferred);
mainView->header()->setSectionResizeMode(QHeaderView::Stretch);
mainView->header()->hide();
mainView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
mainView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
QVBoxLayout* mainLay = new QVBoxLayout(&mainWid);
mainLay->addWidget(mainView);
QHBoxLayout* buttonLay=new QHBoxLayout;
buttonLay->addSpacerItem(new QSpacerItem(1,1,QSizePolicy::Expanding,QSizePolicy::Preferred));
buttonLay->addWidget(new QPushButton(QStringLiteral("select"),&mainWid));
mainLay->addLayout(buttonLay);
//mutual exclusion.
QObject::connect(&model,&QAbstractItemModel::dataChanged,[&model](const QModelIndex& idx,const QModelIndex&,const QVector<int>& roles){
#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
if(!roles.contains(Qt::CheckStateRole)
continue;
#endif
if(idx.column()==0 && idx.data(Qt::CheckStateRole)==Qt::Checked){
for(int i=0, maxRow =model.rowCount() ;i<maxRow;++i){
if(i==idx.row())
continue;
model.setData(model.index(i,0),Qt::Unchecked,Qt::CheckStateRole);
}
}
});
mainWid.show();
return app.exec();
}