Доброго времени.
Мне нужно отображать список имен неких плагинов с флагами в 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 и т.п.
Что я не правильно делаю?
Вот код:
*.hC++ (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;
};
*.cppC++ (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;
}
Помогите плз.