crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Работ с элементами модели - неужели цикл?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
shamanix Дата 13.3.2010, 15:52
  кажется добил все таки. вот так работает
class MyModel : public QStandardItemModel{
    Qt::ItemFlags flags(const QModelIndex & index ) const{
        return  QStandardItemModel::flags(index) | Qt::ItemIsUserCheckable;
    }

    QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const{
        if ( !index.isValid() )
          return QVariant();

        if ( role == Qt::CheckStateRole )
        {
            QStandardItem* item = static_cast<QStandardItem*>(index.internalPointer());

            return item->checkState();
        }
        return QStandardItemModel::data(index,role);
    }

    bool setData( const QModelIndex& index, const QVariant& value, int role ){
        if (role == Qt::CheckStateRole){
            QStandardItem* item = static_cast<QStandardItem*>(index.internalPointer());
            Qt::CheckState state = (value.toInt() == 2) ? Qt::Checked : Qt::Unchecked;
            item->setCheckState(state);

            return QStandardItemModel::setData(index,value,role);
        }        
        return QStandardItemModel::setData(index,value,role);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QListView list;
    MyModel model;
    QStandardItem item;

    item.setText("Test row");

    model.appendRow(&item);    

    list.setModel(&model);
    list.show();
    return a.exec();
}


почитав доки увидел что допустил ошибку - в переопределении setData необходимо высылать сигнал dataChanged.
shamanix Дата 13.3.2010, 14:55
 
Цитата(DIMEDROLL @ 12.3.2010, 9:16) *
Цитата(shamanix @ 11.3.2010, 21:10) *
добился чтобы появился чекбокс,но теперь что-то галка в нем не ставится :o: :lol:

Заккоментируй свое переопределение метода data, что то ты там нашаманил не то.
А просто добавь
item.setCheckState(Qt::Unchecked);

или
item.setCheckState(Qt::Сhecked);

И будет твой элемент с чекбоксом ;)

ну так это понятно,но в том то и вопрос как сделать так чтобы не пришлось для каждого итема вызывать setCheckState. Итемы то берутся в данном случае из базы. Тогда после заполнения модели придется еще и цикл организовывать с setCheckState :)
DIMEDROLL Дата 12.3.2010, 9:16
 
Цитата(shamanix @ 11.3.2010, 21:10) *
добился чтобы появился чекбокс,но теперь что-то галка в нем не ставится :o: :lol:

Заккоментируй свое переопределение метода data, что то ты там нашаманил не то.
А просто добавь
item.setCheckState(Qt::Unchecked);

или
item.setCheckState(Qt::Сhecked);

И будет твой элемент с чекбоксом ;)
shamanix Дата 11.3.2010, 22:10
  добился чтобы появился чекбокс,но теперь что-то галка в нем не ставится :o: :lol:
class MyModel : public QStandardItemModel{
    Qt::ItemFlags flags(const QModelIndex & index ) const{
        return  QStandardItemModel::flags(index) | Qt::ItemIsUserCheckable;
    }

    QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const{
        if ( !index.isValid() )
            return QVariant();

        if ( role == Qt::CheckStateRole )
        {
            QStandardItem* item = static_cast<QStandardItem*>(index.internalPointer());
            return item->checkState();
        }
        else{
            return QStandardItemModel::data(index,role);
        }
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QListView list;
    MyModel model;
    QStandardItem item;

    item.setText("Test row");

    model.appendRow(&item);

    list.setModel(&model);
    list.show();
    return a.exec();
}
shamanix Дата 11.3.2010, 20:48
 
Цитата(DIMEDROLL @ 10.3.2010, 13:29) *
Цитата(shamanix @ 10.3.2010, 12:00) *
Добрый день. Задача тривиальная - сделать QListView с чекбоксами.

Какой класс ты используешь в качестве модели?

Нужно отнаследоваться от него и переопределить flags:

Цитата
Qt::ItemFlags QAbstractItemModel::flags ( const QModelIndex & index ) const [virtual]


что бы в добавок к дефолтным флагам, возвращал так же:
Qt::ItemIsUserCheckable

Не проверял в коде, попробуй и напиши вышло аль нет :)


попробовал - не вышло
Раскрывающийся текст

class MyModel : public QStandardItemModel{
Qt::ItemFlags flags(const QModelIndex & index ) const{
return Qt::ItemIsUserCheckable | QStandardItemModel::flags(index);
}

};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QListView list;
MyModel model;
QStandardItem item;

item.setText("Test row");
model.appendRow(&item);

list.setModel(&model);
list.show();
return a.exec();
}
Гость Дата 10.3.2010, 18:50
  Можно и переопределить делегат , наследоваться лучше от QItemDelegate
и переопределять функции paint() и editorEvent()
я не придумав как сделать tristate чекбокс в представлении сделал именно так.
Хотя для обычного чекбокса лучше переопределять модель.
SABROG Дата 10.3.2010, 14:22
 
Цитата(shamanix @ 10.3.2010, 13:33) *
на чем основываясь?


Да я вечно путаю наследование модели от наследования делегатов.
shamanix Дата 10.3.2010, 13:33
 
Цитата(SABROG @ 10.3.2010, 13:10) *
Писать делегата.

на чем основываясь? какие методы помогут? поглядел документацию по делегатам,что-то ничего связанного с элементами не нашел... :)

Цитата(DIMEDROLL @ 10.3.2010, 13:29) *
Цитата(shamanix @ 10.3.2010, 12:00) *
Добрый день. Задача тривиальная - сделать QListView с чекбоксами.

Какой класс ты используешь в качестве модели?

Нужно отнаследоваться от него и переопределить flags:

Цитата
Qt::ItemFlags QAbstractItemModel::flags ( const QModelIndex & index ) const [virtual]


что бы в добавок к дефолтным флагам, возвращал так же:
Qt::ItemIsUserCheckable

Не проверял в коде, попробуй и напиши вышло аль нет :)

Класс QStandartItemModel. Сейчас попробую, спасибо за совет.
DIMEDROLL Дата 10.3.2010, 13:29
 
Цитата(shamanix @ 10.3.2010, 12:00) *
Добрый день. Задача тривиальная - сделать QListView с чекбоксами.

Какой класс ты используешь в качестве модели?

Нужно отнаследоваться от него и переопределить flags:

Цитата
Qt::ItemFlags QAbstractItemModel::flags ( const QModelIndex & index ) const [virtual]


что бы в добавок к дефолтным флагам, возвращал так же:
Qt::ItemIsUserCheckable

Не проверял в коде, попробуй и напиши вышло аль нет :)
SABROG Дата 10.3.2010, 13:10
  Писать делегата.
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 5.7.2025, 0:39