Как обнаружить выборки строк в QListView <-> QAbstractListModel с делегатом элемента? - PullRequest
4 голосов
/ 21 марта 2011

Кажется, что в моем выборе QListView -> QAbstractListModel отсутствует встроенная поддержка выбора.Должен ли я писать все с нуля?перехват события выбора в пользовательском интерфейсе, маркировка выбранного элемента модели и т. д.?Кажется, что для этого нет встроенной поддержки.

странная вещь в том, что существует QItemSelectionModel, который поддерживает это, но вы не можете использовать его с QListView, так как он не является производным от QAbstract….

Должен ли мой класс модели использовать множественное наследование для наследования как от QItemSelectionModel, так и от QAbstractListModel?В противном случае я не понимаю, как мне избежать переписывания этой функции самостоятельно.

Моя конечная цель состоит в том, чтобы делегат, который рисует мои элементы, знал, выбран ли элемент, как на рисунке, так и на рисунке.Функция sizeHint.

Ответы [ 2 ]

6 голосов
/ 21 марта 2011

QListView является производным от QAbstractItemView, у которого есть метод для получения модели выбора:

QItemSelectionModel *selectionModel = myView->selectionModel();

Этот метод возвращает указатель на модель выбора, которая является долговременной, т. Е. Вы можете сохранитьуказатель, подключение к его сигналам и т. д.

0 голосов
/ 13 марта 2017

Ответ, данный Дэниелом, верен, но лучше показать его на примере, подходящем для начинающих:

class MyCustomModel : public QAbstractListModel
{
    Q_OBJECT
public:
    ImageCollectionModel(QObject *parent, MyCustomCollection *data);
        : QObject(parent)
        , m_myData(data)
    {
    }

public slots:
    void onSelectedItemsChanged(QItemSelection selected, QItemSelection deselected)
    {
        // Here is where your model receives the notification on what items are currently
        // selected and deselected
        if (!selected.empty())
        {
            int index = selected.first().indexes().first().row();
            emit mySelectedItemChanged(m_myData->at(index));
        }
    }

signals:
    void mySelectedItemChanged(MyCustomItem item);

private:
    MyCustomCollection *m_myData;

    // QAbstractItemModel interface
public:
    int rowCount(const QModelIndex &) const override;
    QVariant data(const QModelIndex &index, int role) const override;
};

Когда вы передаете свою пользовательскую модель в QListView, это отличная возможность подключитьсяэто:

ui->myListView->setModel(m_myModel);
connect(ui->myListView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
        m_myModel, SLOT(onSelectedItemsChanged(QItemSelection, QItemSelection)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...