Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Модель/Представление _ Работ с элементами модели - неужели цикл?

Автор: shamanix 10.3.2010, 13:00

Добрый день. Задача тривиальная - сделать QListView с чекбоксами. Я так понял что один единственный способ это сделать это для каждого элемента модели устанавливать флаги? В цикле? Гугл перерыл в поисках чего-нибудь типа model->getItems().setFlags(...); но нашел только обращение к каждому элементу в цикле...может не допонял сути истинной.

Автор: 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

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

Автор: 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. Сейчас попробую, спасибо за совет.

Автор: SABROG 10.3.2010, 14:22

Цитата(shamanix @ 10.3.2010, 13:33) *
на чем основываясь?


Да я вечно путаю наследование модели от наследования делегатов.

Автор: Гость 10.3.2010, 18:50

Можно и переопределить делегат , наследоваться лучше от QItemDelegate
и переопределять функции paint() и editorEvent()
я не придумав как сделать tristate чекбокс в представлении сделал именно так.
Хотя для обычного чекбокса лучше переопределять модель.

Автор: 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();
}

Автор: 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();
}

Автор: DIMEDROLL 12.3.2010, 9:16

Цитата(shamanix @ 11.3.2010, 21:10) *
добился чтобы появился чекбокс,но теперь что-то галка в нем не ставится :o: :lol:

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

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

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

Автор: 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 :)

Автор: 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.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)