Russian Qt Forum

Qt => Model-View (MV) => Тема начата: frostyland от Сентябрь 16, 2010, 12:48



Название: Как то не так раскрашен CheckBox в QTreeView
Отправлено: frostyland от Сентябрь 16, 2010, 12:48
Здравствуйте.

Нарисовал дерево с чекбоксами, вот такое
(http://content.foto.mail.ru/mail/frost666/heap/i-187.jpg)
Как видно, состояние Checked имеет закрашенный квадрат, а это не комильфо.
Вроде все сделал правильно, в чем грабли-то?

Код:
//----------------------------------------------------------------------------------------
Qt::ItemFlags PluginModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::NoItemFlags;

Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled |
Qt::ItemIsEditable | Qt::ItemIsUserCheckable;
return flags;
}
//----------------------------------------------------------------------------------------
QVariant PluginModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid() || index.model() != this)
        return QVariant();

    const PluginNode *pluginNode = node(index);
    switch (role) {
    case Qt::EditRole:
    case Qt::DisplayRole:
        switch (index.column()) {
        case 0: return pluginNode->title();
        }
        break;
    case Qt::CheckStateRole:
        if(index.column()==1){
            return pluginNode->checked();
        }
        break;
    }

    return QVariant();
}
//----------------------------------------------------------------------------------------
bool PluginModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid() || (flags(index) & Qt::ItemIsEditable) == 0)
return false;

PluginNode *pluginNode = node(index);
switch (role) {
case Qt::CheckStateRole:
if (index.column() == 1) {

pluginNode->setChecked(!pluginNode->checked());
break;
}
}

return true;
}
//----------------------------------------------------------------------------------------

Хочется то вот как ))
(http://content.foto.mail.ru/mail/frost666/heap/i-188.jpg)


===================
С уважением, ВВК


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: Denjs от Сентябрь 16, 2010, 13:06
мне кажется ваша не-комильфошная-галочка заблокирована для правки? не так?


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: frostyland от Сентябрь 16, 2010, 15:19
мне кажется ваша не-комильфошная-галочка заблокирована для правки? не так?

Простите, видимо я не уяснил суть вопроса. Флаги позволяют мне редактировать итемы.
Кликом итем редактируется, то есть галочка снимается и ставится обратно, если Вы это имели в виду.
При снятом флаге квадрат чекбокса закрашен правильным белым, а вот при установленном - сереньким,
словно в промежуточном состоянии. Как с этим бороться???


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: crossly от Сентябрь 16, 2010, 15:26
может дело в этом
Цитировать
Qt::PartiallyChecked   1   The item is partially checked. Items in hierarchical models may be partially checked if some, but not all, of their children are checked.


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: frostyland от Сентябрь 16, 2010, 15:48
может дело в этом
Цитировать
Qt::PartiallyChecked   1   The item is partially checked. Items in hierarchical models may be partially checked if some, but not all, of their children are checked.

Стопудово нет. Там один ребенок, да и на ребенке тоже серенько... Я в затруднении ))) :o


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: crossly от Сентябрь 16, 2010, 15:53
а если поставить галку на родителе, а дочернем снять... какова будет картина.. ??


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: CroCIV от Сентябрь 17, 2010, 10:08
а стилями точно не баловались? по идее чекбоксы дб унаследовать цветовую схему ОС по нисходящей по всем дочерним виджетом, если ее нигде до этого не переопределяли... а обычные чекбоксы на форме (не в QTreeWidget) обычные белые?

А если еще проверить состояние у чекбокса (на всякий случай) вдруг оно каким-то неведомым образом вернет таки PartilaryChecked?


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: frostyland от Сентябрь 20, 2010, 10:33
Непоняяятно )))
Тут что-то не то видимо в моем коде, но я убей не могу понять , что.
Вот для примера изменил код стандартного семпла editabletreemodel, а именно во вторую колонку вставил чекбоксы. И то же самое - полувыбор ((
ПРисоединяю измененный семпл, буду признателен, если укажете на решение.

С уважением, ВВК


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: Авварон от Сентябрь 20, 2010, 10:40
у вас он partitionally checked (видно на маке - такая штука отображается в виде минусика, а фулли чекед - в виде галочки). У вас минусик


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: frostyland от Сентябрь 20, 2010, 10:53
у вас он partitionally checked (видно на маке - такая штука отображается в виде минусика, а фулли чекед - в виде галочки). У вас минусик

Остается открытым вопрос - кто же его болезного в это состояние  ввергает? Если во флагах нету TriState, и в setData прямо возвращается true?


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: Авварон от Сентябрь 20, 2010, 10:58
Код:
		if(index.column()==1){
return item->checked();
}
заменить на
Код:
		if(index.column()==1){
return item->checked() ? 2 : 0;
}


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: frostyland от Сентябрь 20, 2010, 11:49
Код:
		if(index.column()==1){
return item->checked();
}
заменить на
Код:
		if(index.column()==1){
return item->checked() ? 2 : 0;
}

Ай, спасибо, мил человек! Работает.
Логический Qt-концепт для меня пока еще далеко не ясен, но теперь я на полшага ближе к пониманию )))


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: Авварон от Сентябрь 20, 2010, 12:02
логический концепт прост - состояние checked в модели кодируется не true/false (0 или 1) а 0, 1, 2 - (not checked, частично checked и полностью checked). True - это 1 == частично checked.
В доке это есть, я тоже "напоролся", но разобрался быстро (минут за 5)


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: frostyland от Сентябрь 20, 2010, 12:57
...
В доке это есть, я тоже "напоролся", но разобрался быстро (минут за 5)
Уважаемый Авварон, специально еще раз перешерстил доку, никак не нашел. Если не затруднит, укажите место ))


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: Авварон от Сентябрь 20, 2010, 13:01
нашел за 20 секунд http://doc.qt.nokia.com/4.6/qt.html#CheckState-enum
гугл - qabstractitemmodel, на странице ctrl+f по checked, облом, метод дата: "See also Qt::ItemDataRole", ctrl+f checked


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: frostyland от Сентябрь 20, 2010, 13:03
нашел за 20 секунд http://doc.qt.nokia.com/4.6/qt.html#CheckState-enum
Аааа!!! Простите! ))) Я балбес! Колонка для балбесов: средняя 0/1/2. Причем, это выборочная слепота! Ведь я же на нее всегда опираюсь при высчитывании например суммы флагов )))))

ЗЫ. Пора в отпуск


Название: Re: Как то не так раскрашен CheckBox в QTreeView
Отправлено: CroCIV от Сентябрь 27, 2010, 11:03
Я пользую ассистант так: смотрю компонету, смотрю в ней нужнуюю функцию, смотрю в ней набор передаваемых параметров, смотрю в них используемые типы, смотрю в них все возможные варианты... вот и получаем на выхлопе Qt::Checked Qt::PartiallyChecked Qt::Unchecked
Предлагаю делать как я, т.к. там вас ждет еще много подобных "сюрпризов"