Qt QAbstractModel: снять флажок

Я начал изучать Qt, и я хотел бы реализовать таблицу, заполненную данными, через QTableView. Моя проблема в том, что я не знаю, как убрать галочки из ячеек. Вроде как они по умолчанию вставлены.

Однако я читал, что мне нужно было вернуть NULL-QVariant, но это не то, что я искал, поскольку у меня все еще есть данные для ввода.

Это мой код до сих пор:

QVariant MyModel::data(const QModelIndex &index, int role) const
{
int row = index.row();
int col = index.column();
QString daten;

switch (col)
{
case 0:
{
    daten = "column 1";
    break;
}
case 1:
{
    daten = "column 2";
    break;
}
case 2:
{
    daten = "column 3";
    break;
}
case 3:
{
    daten = "column 4";
    break;
}
}

return daten;
}

Теперь, как видите, я хочу заполнить ячейку QString с именем «daten». Но рядом со строкой в ​​каждой ячейке есть флажок.

Кто-нибудь знает, как снять флажок, но при этом заполнить содержимое «daten»?

Спасибо!


person VRTuomi    schedule 30.08.2012    source источник
comment
Флажки? У вас есть флаг Qt.ItemIsUserCheckable, который вы могли бы удалить?   -  person Pierre GM    schedule 30.08.2012
comment
в вашем data вы должны (1) принять во внимание случай, когда index недействителен, и (2) убедиться, что вы проверяете роль, прежде чем возвращать data (это должно быть Qt.DisplayRole для базового отображения).   -  person Pierre GM    schedule 30.08.2012
comment
хорошо, спасибо, это работает! не могли бы вы объяснить, какой эффект имеют эти строки?   -  person VRTuomi    schedule 30.08.2012
comment
Какие строки вы имеете в виду?   -  person Pierre GM    schedule 30.08.2012
comment
Ну, те, которые вы сказали мне добавить: if (!index.isValid()) return QVariant(); если (роль != Qt::DisplayRole) return QVariant();   -  person VRTuomi    schedule 31.08.2012
comment
Я дал правильный ответ, который должен ответить на ваш вопрос. Мы всегда можем отредактировать его с более подробной информацией   -  person Pierre GM    schedule 01.09.2012


Ответы (1)


Тот факт, что ячейки в вашем QTableView имеют некоторые флажки, намекает на то, что они были определены как проверяемые пользователем. Проверьте, не активирован ли где-нибудь в определении вашего QTableView флаг Qt.ItemIsUserCheckable, и если это так, деактивируйте его. Вы можете попробовать изменить метод flags, например, сделав каждую запись не доступной для проверки.

В качестве дополнительного комментария вам, вероятно, следует изменить свой метод ::data, чтобы он учитывал случай, когда index недействителен, и возвращал какое-то значение, только если роль соответствует Qt.DisplayRole. В Python синтаксис будет

if index.isvalid():
    if (role == Qt.DisplayRole):
        (row, col) = (index.row(), index.column()
        return_something_depending_on_col
    return QVariant()
return QVariant()

Таким образом, вы покрываете случай недопустимого индекса, иначе ваш код, скорее всего, выйдет из строя.

Тест на role позволяет вам выбрать, к какому типу данных вы хотите получить доступ. В документации говорится, например, что:

Каждый элемент в модели имеет набор связанных с ним элементов данных, каждый из которых имеет свою роль. Роли используются представлением, чтобы указать модели, какой тип данных ей нужен. Пользовательские модели должны возвращать данные в этих типах.

Основная роль — Qt.DisplayRole, где вы возвращаете QString, соответствующий вашей текущей ячейке. Вы также можете вернуть QBrush для рисования фона, если ваша роль Qt.BackgroundRole...

Хотя эти тесты на role не являются обязательными, они все же настоятельно рекомендуются: они делают ваш код чище и проще в обслуживании.

person Pierre GM    schedule 01.09.2012