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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как то не так раскрашен CheckBox в QTreeView  (Прочитано 10072 раз)
frostyland
Гость
« : Сентябрь 16, 2010, 12:48 »

Здравствуйте.

Нарисовал дерево с чекбоксами, вот такое

Как видно, состояние 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;
}
//----------------------------------------------------------------------------------------

Хочется то вот как ))



===================
С уважением, ВВК
Записан
Denjs
Гость
« Ответ #1 : Сентябрь 16, 2010, 13:06 »

мне кажется ваша не-комильфошная-галочка заблокирована для правки? не так?
Записан
frostyland
Гость
« Ответ #2 : Сентябрь 16, 2010, 15:19 »

мне кажется ваша не-комильфошная-галочка заблокирована для правки? не так?

Простите, видимо я не уяснил суть вопроса. Флаги позволяют мне редактировать итемы.
Кликом итем редактируется, то есть галочка снимается и ставится обратно, если Вы это имели в виду.
При снятом флаге квадрат чекбокса закрашен правильным белым, а вот при установленном - сереньким,
словно в промежуточном состоянии. Как с этим бороться???
Записан
crossly
Гость
« Ответ #3 : Сентябрь 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.
Записан
frostyland
Гость
« Ответ #4 : Сентябрь 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.

Стопудово нет. Там один ребенок, да и на ребенке тоже серенько... Я в затруднении ))) Шокированный
Записан
crossly
Гость
« Ответ #5 : Сентябрь 16, 2010, 15:53 »

а если поставить галку на родителе, а дочернем снять... какова будет картина.. ??
Записан
CroCIV
Гость
« Ответ #6 : Сентябрь 17, 2010, 10:08 »

а стилями точно не баловались? по идее чекбоксы дб унаследовать цветовую схему ОС по нисходящей по всем дочерним виджетом, если ее нигде до этого не переопределяли... а обычные чекбоксы на форме (не в QTreeWidget) обычные белые?

А если еще проверить состояние у чекбокса (на всякий случай) вдруг оно каким-то неведомым образом вернет таки PartilaryChecked?
« Последнее редактирование: Сентябрь 17, 2010, 10:14 от CroCIV » Записан
frostyland
Гость
« Ответ #7 : Сентябрь 20, 2010, 10:33 »

Непоняяятно )))
Тут что-то не то видимо в моем коде, но я убей не могу понять , что.
Вот для примера изменил код стандартного семпла editabletreemodel, а именно во вторую колонку вставил чекбоксы. И то же самое - полувыбор ((
ПРисоединяю измененный семпл, буду признателен, если укажете на решение.

С уважением, ВВК
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Сентябрь 20, 2010, 10:40 »

у вас он partitionally checked (видно на маке - такая штука отображается в виде минусика, а фулли чекед - в виде галочки). У вас минусик
Записан
frostyland
Гость
« Ответ #9 : Сентябрь 20, 2010, 10:53 »

у вас он partitionally checked (видно на маке - такая штука отображается в виде минусика, а фулли чекед - в виде галочки). У вас минусик

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

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Сентябрь 20, 2010, 10:58 »

Код:
		if(index.column()==1){
return item->checked();
}
заменить на
Код:
		if(index.column()==1){
return item->checked() ? 2 : 0;
}
Записан
frostyland
Гость
« Ответ #11 : Сентябрь 20, 2010, 11:49 »

Код:
		if(index.column()==1){
return item->checked();
}
заменить на
Код:
		if(index.column()==1){
return item->checked() ? 2 : 0;
}

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

Сообщений: 3260


Просмотр профиля
« Ответ #12 : Сентябрь 20, 2010, 12:02 »

логический концепт прост - состояние checked в модели кодируется не true/false (0 или 1) а 0, 1, 2 - (not checked, частично checked и полностью checked). True - это 1 == частично checked.
В доке это есть, я тоже "напоролся", но разобрался быстро (минут за 5)
Записан
frostyland
Гость
« Ответ #13 : Сентябрь 20, 2010, 12:57 »

...
В доке это есть, я тоже "напоролся", но разобрался быстро (минут за 5)
Уважаемый Авварон, специально еще раз перешерстил доку, никак не нашел. Если не затруднит, укажите место ))
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #14 : Сентябрь 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
« Последнее редактирование: Сентябрь 20, 2010, 13:03 от Авварон » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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