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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]QAbstractListModel не работают чекбоксы.  (Прочитано 7071 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Июль 06, 2011, 15:09 »

Доброго времени.

Мне нужно отображать список имен неких плагинов с флагами в QListView.
Для этого я создал свою модель от QAbstractListModel.

Внутренние данные модели представляют собой список структур типа:
Код
C++ (Qt)
struct PluginState {
       QString location; //Имя плагина
       bool enabled;    //Его состояние: включен/отключен
};
 


В конструкторе модели (для её проверки) я создал список структур:
Код
C++ (Qt)
   PluginState ps;
 
   ps.location = "qwerty";
   ps.enabled = false;
   pluginsStateList.append(ps);
 
   ps.location = "asdfg";
   ps.enabled = true;
   pluginsStateList.append(ps);
 
с разными значениями флага enabled.

При запуске приложения все итемы отображаются корректно, т.е.:
- "qwerty" с пустым чекбоксом
- "asdfg" с галочкой в чекбоксе

Теперь я хочу изменить значение поля enabled=true плагина "qwerty" - для этого кликаю на его пустом чекбоксе,
после этого в нём появляется галочка.

Теперь я хочу изменить значение поля enabled=false плагина "qwerty" - для этого кликаю на его чекбоксе с галочкой (при этом, полагаю, что галочка должна пропасть), но галочка не пропадает!

В методе setData() этот код:
Код
C++ (Qt)
...
bool enabled = value.toBool();
...
 
всегда возвращает true!

Но почему? Как мне получить false?
Т.е. нужно при каждом клике на чекбокс сделать переключение false/true/false/true и т.п.
Что я не правильно делаю?

Вот код:
*.h
Код
C++ (Qt)
class PluginsListModel : public QAbstractListModel
{
   Q_OBJECT
public:
   PluginsListModel(QObject *parent = 0);
 
   virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
   virtual QVariant data(const QModelIndex &index, int role) const;
   virtual QVariant headerData(int section, Qt::Orientation orientation,
                               int role = Qt::DisplayRole) const;
   virtual Qt::ItemFlags flags(const QModelIndex &index) const;
   virtual bool setData(const QModelIndex &index, const QVariant &value,
                        int role = Qt::EditRole);
 
private:
   struct PluginState {
       QString location;
       bool enabled;
   };
 
   QList<PluginState> pluginsStateList;
};
 

*.cpp
Код
C++ (Qt)
PluginsListModel::PluginsListModel(QObject *parent)
   : QAbstractListModel(parent)
{
   PluginState ps;
 
   ps.location = "qwerty";
   ps.enabled = false;
   pluginsStateList.append(ps);
 
   ps.location = "asdfg";
   ps.enabled = true;
   pluginsStateList.append(ps);
}
 
int PluginsListModel::rowCount(const QModelIndex &parent) const
{
   return pluginsStateList.count();
}
 
QVariant PluginsListModel::data(const QModelIndex &index, int role) const
{
   if (!index.isValid())
       return QVariant();
 
   if (index.row() >= pluginsStateList.size())
       return QVariant();
 
   if (role == Qt::DisplayRole)
       return pluginsStateList.at(index.row()).location;
 
   if (role == Qt::CheckStateRole)
       return pluginsStateList.at(index.row()).enabled;
 
   return QVariant();
}
 
QVariant PluginsListModel::headerData(int section, Qt::Orientation orientation,
                                     int role) const
{
   if (role != Qt::DisplayRole)
       return QVariant();
 
   if (orientation == Qt::Horizontal)
       return QString("Column %1").arg(section);
 
   return QString("Row %1").arg(section);
}
 
Qt::ItemFlags PluginsListModel::flags(const QModelIndex &index) const
{
   if (!index.isValid())
       return Qt::ItemIsEnabled;
 
   return QAbstractListModel::flags(index) | Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
}
 
bool PluginsListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
   if (!index.isValid())
       return false;
 
   if (role == Qt::CheckStateRole) {
       PluginState state = pluginsStateList.at(index.row());
       bool enabled = value.toBool();
       if (state.enabled != enabled) {
           state.enabled = enabled;
           pluginsStateList.replace(index.row(), state);
           emit dataChanged(index, index);
           return true;
       }
   }
   return false;
}
 

Помогите плз.  Строит глазки


« Последнее редактирование: Июль 06, 2011, 15:25 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Июль 06, 2011, 15:25 »

Тьфу, решено:
в методе data() надо было так сделать:

Код
C++ (Qt)
...
return (pluginsStateList.at(index.row()).enabled) ? Qt::Checked : Qt::Unchecked;
...
 
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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