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


Автор: lxx 22.9.2010, 15:38
Приветствую!
Такая проблема:
Есть QlistWidget с возможностью выбора нескольких элементов. Чтобы выбрать несколько элементов нужно при выборе зажимать Ctrl.
Можно-ли сделать так, чтобы это можно было делать без удерживания Ctrl, то есть нажал на элемент один раз - он выбрался, второй раз - выбор снялся.
Пробовал в сигнале itemCliced делать следующее:
Код

void PlugApmBuilder::on_listWidget_itemClicked(QListWidgetItem* item)
{
    if (item->isSelected()) item->setSelected(false);
    else item->setSelected(true);

// Выбор обязательных элементов
    QList<QListWidgetItem *> list;
    list = ui->listWidget->findItems(QString("element"), Qt::MatchExactly);
    if (list.count() > 0) list[0]->setSelected(true);

}

Но при клике элемент выделяется и сразу сбрасывается.
Еще есть идея при клике как-то программно посылать Qt::ControlModifier, но как это сделать я не знаю.

Подскажите что-нибудь...

Автор: RedDigger 25.9.2010, 01:13
Цитата(lxx @ 22.9.2010,  15:38)
Приветствую!
Такая проблема:
Есть QlistWidget с возможностью выбора нескольких элементов. Чтобы выбрать несколько элементов нужно при выборе зажимать Ctrl.
Можно-ли сделать так, чтобы это можно было делать без удерживания Ctrl, то есть нажал на элемент один раз - он выбрался, второй раз - выбор снялся.
Пробовал в сигнале itemCliced делать следующее:
Код

void PlugApmBuilder::on_listWidget_itemClicked(QListWidgetItem* item)
{
    if (item->isSelected()) item->setSelected(false);
    else item->setSelected(true);

// Выбор обязательных элементов
    QList<QListWidgetItem *> list;
    list = ui->listWidget->findItems(QString("element"), Qt::MatchExactly);
    if (list.count() > 0) list[0]->setSelected(true);

}

Но при клике элемент выделяется и сразу сбрасывается.
Еще есть идея при клике как-то программно посылать Qt::ControlModifier, но как это сделать я не знаю.

Подскажите что-нибудь...


Интересная задачка.
Проблема тут состоит в следующем - При установке выбранного элемента в позицию "Включен" или "Выключен" запускается сигнал сного что и дает Ваш результат. Задача - остановить его от второго изменения.

Решил следующим образом - 
*.h
Код

public clots:
    void testSlot(QListWidgetItem *);

private:
    bool m_itemManuallyChanged;


*.cpp In constructor
Код

    connect(cardsList,SIGNAL(itemChanged(QListWidgetItem*)),this,SLOT(testSlot(QListWidgetItem*)));


*.cpp 
Код

void MainWindow::testSlot(QListWidgetItem * item) {
    if(m_itemManuallyChanged == false) {
        m_itemManuallyChanged = true;
        if (item->isSelected()) {
            item->setSelected(false);
        } else {
            item->setSelected(true);
        }

    } else
        m_itemManuallyChanged = false;
}


Надеюсь поможет.


Автор: Amp 25.9.2010, 10:01
QAbstractItemView::MultiSelection под описанное должен подойти.

Автор: RedDigger 25.9.2010, 13:06
Цитата(Amp @ 25.9.2010,  10:01)
QAbstractItemView::MultiSelection под описанное должен подойти.

В том то и дело что при установке его в положение Qt::MultiSelection придется выбирать разные элементы через контрол, как и было описано как проблема которую надо обойти в постановке вопроса.

Автор: Amp 26.9.2010, 19:27
Цитата(RedDigger @  25.9.2010,  13:06 Найти цитируемый пост)
В том то и дело что при установке его в положение Qt::MultiSelection придется выбирать разные элементы через контрол, как и было описано как проблема которую надо обойти в постановке вопроса. 

Сейчас специально запустил дизайнер, кинул QListWidgetm выставил Qt::MultiSelection - спокойно выбираю разные айтемы без зажатого ctrl.

Автор: RedDigger 26.9.2010, 21:29
Цитата(Amp @ 26.9.2010,  19:27)
Цитата(RedDigger @  25.9.2010,  13:06 Найти цитируемый пост)
В том то и дело что при установке его в положение Qt::MultiSelection придется выбирать разные элементы через контрол, как и было описано как проблема которую надо обойти в постановке вопроса. 

Сейчас специально запустил дизайнер, кинул QListWidgetm выставил Qt::MultiSelection - спокойно выбираю разные айтемы без зажатого ctrl.

Amp Прости.. Проверил сам.. видимо запарился.. спать надо больше.. 

lxx Qt::MultiSelection работает именно так как нужно для твоего примера.

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