Название: Qt::CheckStateRole + QSqlTableModel
Отправлено: ildar от Сентябрь 19, 2009, 22:26
пытаюсь показывать чекбоксы в колонке с bool значениями, для этого использую флаг Qt::CheckStateRole class myTableModel : public QSqlTableModel { ... Qt::ItemFlags flags(const QModelIndex& index) const { Qt::ItemFlags flags = QSqlTableModel::flags(index); if (record().fieldName(index.column()) == "enabled") flags = flags | Qt::ItemIsUserCheckable; return flags; }
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const { if (record().fieldName(index.column()) == "enabled" && role == Qt::CheckStateRole) { return (QSqlQueryModel::data(index).toInt() != 0) ? Qt::Checked : Qt::Unchecked; }
return QSqlTableModel::data(index, role); }
bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) { if (role == Qt::CheckStateRole && record().fieldName(index.column()) == "enabled") { QSqlTableModel::setData(index, (value.toInt() == Qt::Checked) ? 1 : 0); return true; }
return QSqlTableModel::setData(index, value, role); } };
в результате: - в колонке показыватся чекбокс и значение поля в виде строки(1 или 0) - при клике на чекбокс, состояние чекбокса не меняется как показывать только чекбокс посередине ячейки? не могу найти причину игнорирования кликов по чекбоксу :-\ любые идеи велкам :)
Название: Re: Qt::CheckStateRole + QSqlTableModel
Отправлено: f0x от Сентябрь 20, 2009, 13:34
C++ (Qt) ..... QHash<int, bool> check; ..... QVariant MyRelationModel::data( const QModelIndex &index, int role) const { QVariant value = QSqlRelationalTableModel::data(index, role); switch (role) { case Qt::DisplayRole: // Данные для отображения if (check.contains(index.column()) && check.value(index.column())) return value.toInt() != 0 ? tr("Yes") : tr("No"); else return value; ... case Qt::CheckStateRole: // Галочка if (check.contains(index.column()) && check.value(index.column())) return (QSqlRelationalTableModel::data(index).toInt() != 0) ? Qt::Checked : Qt::Unchecked; else return value;
C++ (Qt) bool MyRelationModel::setData(const QModelIndex &index, const QVariant &value, int role) { <------>dataNeedSubmit = TRUE; <------>switch (role) { <------>case Qt::CheckStateRole: <------><------>if (check.contains(index.column()) && check.value(index.column())) { <------><------><------>qDebug("value = %s", qPrintable(value.toString())); <------><------><------>QSqlRelationalTableModel::setData(index, value, role); <------><------><------>QSqlRelationalTableModel::setData(index, QVariant(QSqlRelationalTableModel::data(index, Q <------><------>}
как то так...
Название: Re: Qt::CheckStateRole + QSqlTableModel
Отправлено: ildar от Сентябрь 20, 2009, 21:34
alFoX спасибо
с кликами по чекбоксу все понятно, а как избавиться от текста "Yes/No" и подвинуть чекбокс посередине ячейки?
Название: Re: Qt::CheckStateRole + QSqlTableModel
Отправлено: f0x от Сентябрь 20, 2009, 21:43
очевидно убрать из моего первого примера C++ (Qt) case Qt::DisplayRole: // Данные для отображения if (check.contains(index.column()) && check.value(index.column())) return value.toInt() != 0 ? tr("Yes") : tr("No"); else return value;
и возвращать QVariant(). для выравнивания поможет C++ (Qt) QVariant MyRelationModel::data( const QModelIndex &index, int role) const { ... case Qt::TextAlignmentRole: ...
... и RTFM
Название: Re: Qt::CheckStateRole + QSqlTableModel
Отправлено: ildar от Сентябрь 21, 2009, 16:12
очевидно пустой QVariant вместо текста и Qt::AlignHCenter | Qt::AlignVCenter в качестве Qt::TextAlignmentRole не влияют на выравнивание чекбокса ;)
в доках по вопросу выравнивания чекбокса тоже вроде бы ничего, похоже придется использовать делегат
Название: Re: Qt::CheckStateRole + QSqlTableModel
Отправлено: SABROG от Сентябрь 21, 2009, 16:23
в доках по вопросу выравнивания чекбокса тоже вроде бы ничего, похоже придется использовать делегат
Да, там с этим не всё так просто: http://qt.nokia.com/developer/faqs/faq.2008-01-03.2614755816
Название: Re: Qt::CheckStateRole + QSqlTableModel
Отправлено: ildar от Сентябрь 21, 2009, 19:49
спасибо, то что надо и даже почти работает!
Название: Re: Qt::CheckStateRole + QSqlTableModel
Отправлено: kirill от Октябрь 22, 2010, 09:18
Это писец, господа.
|