Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt]Выделение виджетов в QListWidget


Автор: feanor59 14.3.2009, 03:30
Что есть: QListWidget, итемами в котором являются QCheckBox. QCheckBox устанавливаются с помощью setItemWidget().
Что надо: дать возможность ещё и _выделять_ итемы, а не только устанавливать/снимать галки.

Автор: SABROG 14.3.2009, 17:20
Обрабатывай сигнал stateChanged и по нему выделяй или снимай выделение итема к которому он относится. Смотри в QItemSelectionModel.

Автор: feanor59 14.3.2009, 20:56
Цитата(SABROG @ 14.3.2009,  17:20)
Обрабатывай сигнал stateChanged и по нему выделяй или снимай выделение итема к которому он относится. Смотри в QItemSelectionModel.

да нет. всё не так просто. мне нужно, чтобы виджеты выделялись независимо от изменения состояния. т. е. чтобы я могу выделить, к примеру, все виджеты, не изменив их состояния

Автор: SABROG 15.3.2009, 01:27
А разве изначально сделано не так, чтобы виджет создавался только при двойном клике на итем? Или у тебя умышленно openPersistentEditor стоит?

Автор: feanor59 15.3.2009, 01:35
Цитата(SABROG @ 15.3.2009,  01:27)
А разве изначально сделано не так, чтобы виджет создавался только при двойном клике на итем? Или у тебя умышленно openPersistentEditor стоит?

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

Автор: Любитель 16.3.2009, 20:00
Быть может есть решение с QListWidget, но в любом случае лучше изначачально пользоваться чистым QListView, у него разрешается отметка элементов, у модели реализуется обработка соответствующей роли и устанавливается флаг, разрешающий отметку элементов. Как-то так smile Сорри за каламбурность - давно на практике не работал с Qt, но архитектура Model/View в 4-ке была всегда.

Автор: feanor59 17.3.2009, 12:35
Цитата(Любитель @ 16.3.2009,  20:00)
Быть может есть решение с QListWidget, но в любом случае лучше изначачально пользоваться чистым QListView, у него разрешается отметка элементов, у модели реализуется обработка соответствующей роли и устанавливается флаг, разрешающий отметку элементов. Как-то так smile Сорри за каламбурность - давно на парктике не работал с Qt, но архитектура Model/View в 4-ке была всегда.

хм, мб я не до конца вкурил, но как (где) в таком случае хранить состояния чекбоксов? т. е. модель это QStringListModel и она фактически  хранит подписи к чекбоксам, а что делать с состояниями?! 
зы
основываюсь на экземпле spinboxdelegate

Автор: Любитель 17.3.2009, 16:32
Создавать свою модель. Можно наследоваться. Где хранить - непринципиально.

Автор: feanor59 17.3.2009, 18:22
Цитата(Любитель @ 17.3.2009,  16:32)
Создавать свою модель. Можно наследоваться. Где хранить - непринципиально.

уже вычитал) пробую. спасибо.

Автор: feanor59 18.3.2009, 01:08
возникли проблемы:
1) при отображении делегата,  текст самого элемента остаётся на фоне => наложение текста чекбокса и текста элемента. (UPD: поборол введением новой своей роли и возвратом пустой строки на дисплей роль)
2) какой флаг и как нужно поставить, чтобы можно было выделять _делегаты_? пока такого не нашёл.
3) есть ли возможность единожды сказать, чтобы все элементы списка отображались перманентно с делегатом редактирования?

Автор: feanor59 18.3.2009, 06:19
Всплыла ещё одна проблема. После обновления QListView не устанавливается openPersistentEditor
Код обновления:
Код

QItemDelegate *delegate = new CheckBoxDelegate();    

    categoriesModel.reset(new PairListModel(pairs));
    categoriesModel->setWorkTable("adb_categories");
    m_ui.listCategories->setModel(categoriesModel.get());
    m_ui.listCategories->setItemDelegate(delegate);

    for (int i = 0; i < categoriesModel->rowCount(QModelIndex()); ++i)
        m_ui.listCategories->openPersistentEditor(categoriesModel->index(i, 0, QModelIndex()));

    m_ui.listCategories->update();


При первом выполнении этого кода, всё отлично, при повторном openPersistentEditor не срабатывает.
UPD: разобрался, проблема была в смарт поинтерах, а конкретно в том, что до того, как QListView получал новую модель, уничтожалась старая.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)