Russian Qt Forum

Qt => Model-View (MV) => Тема начата: ildar от Сентябрь 19, 2009, 22:26



Название: 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
Это писец, господа.