Добрый день. Задача тривиальная - сделать QListView с чекбоксами. Я так понял что один единственный способ это сделать это для каждого элемента модели устанавливать флаги? В цикле? Гугл перерыл в поисках чего-нибудь типа model->getItems().setFlags(...); но нашел только обращение к каждому элементу в цикле...может не допонял сути истинной.
Писать делегата.
Можно и переопределить делегат , наследоваться лучше от QItemDelegate
и переопределять функции paint() и editorEvent()
я не придумав как сделать tristate чекбокс в представлении сделал именно так.
Хотя для обычного чекбокса лучше переопределять модель.
добился чтобы появился чекбокс,но теперь что-то галка в нем не ставится
class MyModel : public QStandardItemModel{
Qt::ItemFlags flags(const QModelIndex & index ) const{
return QStandardItemModel::flags(index) | Qt::ItemIsUserCheckable;
}
QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const{
if ( !index.isValid() )
return QVariant();
if ( role == Qt::CheckStateRole )
{
QStandardItem* item = static_cast<QStandardItem*>(index.internalPointer());
return item->checkState();
}
else{
return QStandardItemModel::data(index,role);
}
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QListView list;
MyModel model;
QStandardItem item;
item.setText("Test row");
model.appendRow(&item);
list.setModel(&model);
list.show();
return a.exec();
}
item.setCheckState(Qt::Unchecked);
item.setCheckState(Qt::Сhecked);
item.setCheckState(Qt::Unchecked);
item.setCheckState(Qt::Сhecked);
кажется добил все таки. вот так работает
class MyModel : public QStandardItemModel{
Qt::ItemFlags flags(const QModelIndex & index ) const{
return QStandardItemModel::flags(index) | Qt::ItemIsUserCheckable;
}
QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const{
if ( !index.isValid() )
return QVariant();
if ( role == Qt::CheckStateRole )
{
QStandardItem* item = static_cast<QStandardItem*>(index.internalPointer());
return item->checkState();
}
return QStandardItemModel::data(index,role);
}
bool setData( const QModelIndex& index, const QVariant& value, int role ){
if (role == Qt::CheckStateRole){
QStandardItem* item = static_cast<QStandardItem*>(index.internalPointer());
Qt::CheckState state = (value.toInt() == 2) ? Qt::Checked : Qt::Unchecked;
item->setCheckState(state);
return QStandardItemModel::setData(index,value,role);
}
return QStandardItemModel::setData(index,value,role);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QListView list;
MyModel model;
QStandardItem item;
item.setText("Test row");
model.appendRow(&item);
list.setModel(&model);
list.show();
return a.exec();
}
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)