Не удается получить элемент из QTreeView от QModelIndex - PullRequest
0 голосов
/ 12 апреля 2019

Я создаю QTreeView в окне и хочу получить текст выбранных элементов при двойном щелчке по ним. Я пытаюсь использовать сигнал "doubleClicked (const QModelIndex &)", чтобы получить индекс выбранного элемента.

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

Я обнаружил, что переданный индекс выглядит примерно так:

корень

| ... item1 (0, 0)

| ... | ... subItem1 (0, 0)

| ... | ... подраздел 2 (1, 0)

| ... item2 (1, 0)

Есть два (0, 0) и (1, 0) элемента ??? РЕДАКТИРОВАТЬ: я получил этот результат

qDebug(QString::number(index.row()).toLatin1().data()); // row
qDebug(QString::number(index.column()).toLatin1().data()); // column

Вот мой код, создайте QTreeView и QStandardItemModel:

mTree = new QTreeView(this);  // mTree is a class member
treeModel = new QStandardItemModel(); // also a class member

proxymodel = new MySortFilterProxyModel(); // for sorting
proxymodel->setSourceModel(treeModel);
mTree->setModel(proxymodel);

и специальный слот для приема сигнала:

private slots:
    void getSelectedIP(const QModelIndex &);

подключить сигнал и слот:

connect(mTree, SIGNAL(doubleClicked(const QModelIndex &)),
    this, SLOT(getSelectedIP(const QModelIndex &)));

реализация слота, и программа вылетела в этом коде:

void HostTreeFrame::getSelectedIP(const QModelIndex &index)
{
    QStandardItem *selectedItem = treeModel->itemFromIndex(index);
    qDebug(QString::number(index.row()).toLatin1().data());
    qDebug(QString::number(index.column()).toLatin1().data());
    qDebug("1");
    QString selectedIPString = selectedItem->text(); // program crashed here, selectedItem == nullptr
    qDebug("2");
}

EDIT: selectedItem - это nullptr, поэтому программа аварийно завершилась, но почему это nullptr?

1 Ответ

0 голосов
/ 12 апреля 2019

Рассмотрим код ...

void HostTreeFrame::getSelectedIP(const QModelIndex &index)
{
    QStandardItem *selectedItem = treeModel->itemFromIndex(index);

Проблема в том, что index связан с моделью, используемой представлением, но это модель прокси, а не QStandardItemModel.

Вам необходимо сопоставить индекс индекса модели с правильной моделью. Так что-то вроде ...

void HostTreeFrame::getSelectedIP(const QModelIndex &index)
{
    auto standard_item_model_index = proxymodel->mapToSource(index);
    QStandardItem *selectedItem = treeModel->itemFromIndex(standard_item_model_index);

    /*
     * Check selectedItem before dereferencing.
     */
    if (selectedItem) {
        ...

В приведенном выше коде предполагается, что proxymodel является членом (или непосредственно виден) HostTreeFrame.

...