Russian Qt Forum
Ноябрь 05, 2024, 22:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt::CheckStateRole + QSqlTableModel  (Прочитано 8752 раз)
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)
- при клике на чекбокс, состояние чекбокса не меняется

как показывать только чекбокс посередине ячейки?
не могу найти причину игнорирования кликов по чекбоксу  В замешательстве

любые идеи велкам  Улыбающийся
Записан
f0x
Гость
« Ответ #1 : Сентябрь 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
<------><------>}

как то так...


« Последнее редактирование: Сентябрь 20, 2009, 13:39 от alFoX » Записан
ildar
Гость
« Ответ #2 : Сентябрь 20, 2009, 21:34 »

alFoX спасибо

с кликами по чекбоксу все понятно, а как избавиться от текста "Yes/No" и подвинуть чекбокс посередине ячейки?

Записан
f0x
Гость
« Ответ #3 : Сентябрь 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
Записан
ildar
Гость
« Ответ #4 : Сентябрь 21, 2009, 16:12 »

очевидно пустой QVariant вместо текста и Qt::AlignHCenter | Qt::AlignVCenter в качестве Qt::TextAlignmentRole не влияют на выравнивание чекбокса  Подмигивающий

в доках по вопросу выравнивания чекбокса тоже вроде бы ничего, похоже придется использовать делегат
Записан
SABROG
Гость
« Ответ #5 : Сентябрь 21, 2009, 16:23 »

в доках по вопросу выравнивания чекбокса тоже вроде бы ничего, похоже придется использовать делегат

Да, там с этим не всё так просто: http://qt.nokia.com/developer/faqs/faq.2008-01-03.2614755816
Записан
ildar
Гость
« Ответ #6 : Сентябрь 21, 2009, 19:49 »

спасибо,
то что надо и даже почти работает!
Записан
kirill
Гость
« Ответ #7 : Октябрь 22, 2010, 09:18 »

Это писец, господа.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.121 секунд. Запросов: 21.