Данные из модели не вставлены в QTableView - PullRequest
0 голосов
/ 04 августа 2011

Я пытаюсь вставить некоторые данные в TableView из модели, но я делаю что-то не так, потому что данные не вставлены.Таблица обновляется столбцами и строками.

Так что у меня есть GraphicsView, где я рисую некоторые пользовательские GraphicsItems.Каждый раз, когда новый элемент добавляется на сцену, модель должна обновляться и посылать сигнал моему TableView, чтобы также вставить в него данные.

Здесь я обновляю модель, когда новый элементДобавлено:


    Clothoid *temp = new Clothoid();
        temp->setStartPoint(p1);
        temp->setEndPoint(p2);

        clothoids.append(temp);

        scene->addItem(temp);

        model.setColumnCount(3);
        model.setRowCount(clothoids.size());

        QModelIndex index = model.index(clothoids.size(), 1, QModelIndex());
        model.setData(index, clothoids.last()->startCurvature);
        index = model.index(clothoids.size(), 2, QModelIndex());
        model.setData(index, clothoids.last()->endCurvature);
        index = model.index(clothoids.size(), 3, QModelIndex());
        model.setData(index, clothoids.last()->clothoidLength);

        emit clothoidAdded(&model);


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


QList &lt Clothoid *> clothoids;

Сигнал подключен к слоту в моем главном окне:


    ui->setupUi(this);    
        SpinBoxDelegate delegate;
        ui->clothoidTable->setItemDelegate(&delegate);

        connect(ui->graphicsView, SIGNAL(clothoidAdded(QStandardItemModel*)), ui->clothoidTable, SLOT(onClothoidAdded(QStandardItemModel*)));


где слот:


    void TableViewList::onClothoidAdded(QStandardItemModel *model)
        {
            setModel(model);
        }

Что я делаю не так?

1 Ответ

1 голос
/ 04 августа 2011

Вы не хотите вызывать setData () напрямую. Вот несколько ключевых шагов, которые вам нужно предпринять:

  • Ваша модель должна содержать контейнер (возможно, QList) из Clothoid указателей (независимо от того, отвечает ли он за освобождение ресурсов или нет). Индекс в контейнере должен отображаться непосредственно на то, какую строку он занимает в представлении.

  • Ваши data() и setData() должны быть правильно реализованы , чтобы модель знала, какие данные Clothoid поступают в каждую ячейку для данной строки. Они должны иметь switch() операторов для enum , представляющих номер столбца , например:


// in data() after the usual error checking, etc
if(role == Qt::DisplayRole)
    {
    Clothoid* cloth = myListOfClothoids.at(index.row());
    switch(index.column())
        {
        // This enum is defined in the header for the Clothoid class 
        //  and represents the COLUMN NUMBER in which to show the data
        case Clothoid::START: 
            return cloth->startCurvature; // these probably shouldn't be public members btw
        case Clothoid::END:
            return cloth->endCurvature;
        case Clothoid::LENGTH:
            return cloth->clothoidLength;
        }
    }

// in setData()
if(role == Qt::DisplayRole)
    {
    Clothoid* cloth = myListOfClothoids.at(index.row());
    switch(index.column())
        {
        case Clothoid::START: 
            cloth->startCurvature = variant.toWhatever(); 
            break;
        case Clothoid::END:
            cloth->endCurvature = variant.toWhateverElse(); 
            break;
        case Clothoid::LENGTH:
            cloth->clothoidLength = variant.toYetSomethingElse();
            break;
        default:
            return false;
        }
    emit dataChanged(index,index);
    return true;
    }
  1. Ваша модель должна иметь функцию addClothoid(). В этой функции вы хотите сделать что-то вроде:

int rowIndexFirst = 0; // insert into first row
int rowIndexLast = rowIndexFirst; // only inserting one row/Clothoid
beginInsertRows(QModelIndex(), rowIndexFirst, rowIndexLast);
myListOfClothoids.prepend(newClothoidPtr); // insert clothoid into first index, as well
endInsertRows(); // begin and end take care of signalling the view for you!

Я действительно предлагаю сделать это. Да, много работы по рефакторингу до такой степени, но оно того стоит, поверьте мне.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...