Как вставить данные в QTableWidget?

У меня есть это приложение, в котором пользователь может рисовать некоторые пользовательские элементы QGraphicsItem в QGraphicsView, и я хотел бы, чтобы некоторые данные об этих элементах также отображались в QTableWidget.

Код для настраиваемого файла заголовка QGraphicsItem::


    class Clothoid : public QGraphicsItem
    {
    public:
        Clothoid(QPoint startPoint, QPoint endPoint);
        virtual ~Clothoid();

        QPoint sPoint;
        QPoint ePoint;
        CFloat startCurvature;
        CFloat endCurvature;
        CFloat clothoidLength;
        CFloat tangentAngle;
    ...
    }

cpp файл:


    Clothoid::Clothoid(QPoint startPoint, QPoint endPoint)
    {
        sPoint = startPoint;
        ePoint = endPoint;
        startCurvature = 0.0;
        endCurvature = 0.0;
        clothoidLength = sqrt(pow(endPoint.x() - startPoint.x(),2) +
                              pow(endPoint.y() - startPoint.y(),2));
    }

Код для графического представления:


    renderArea::renderArea(QWidget *parent):
            QGraphicsView(parent)
    {
        scene = new QGraphicsScene(this);
        scene->setItemIndexMethod(QGraphicsScene::NoIndex);
        scene->setSceneRect(0, 0, 850, 480);
        setScene(scene);
        setCacheMode(CacheBackground);
        setViewportUpdateMode(BoundingRectViewportUpdate);
        setRenderHint(QPainter::Antialiasing);
        setTransformationAnchor(AnchorUnderMouse);
        scale(qreal(1.0), qreal(1.0));
        setMinimumSize(400, 400);
    }

    void renderArea::mousePressEvent(QMouseEvent *event)
    {
        QPoint p = event->pos();

        updateList(p);
    }

    void renderArea::updateList(const QPoint &p)
    {
        Point point;
        point.point = p;
        point.isSelected = false;
        list.append(point);
        if (list.size() > 1)
            updateClothoid(list[list.size()-2].point, list[list.size()-1].point);
    }

    void renderArea::updateClothoid(const QPoint &p1, const QPoint &p2)
    {
        Clothoid *temp = new Clothoid(p1, p2);

        clothoids.append(temp);

        scene->addItem(temp);

        emit clothoidAdded(&clothoids);
    }

где клотоиды определяются как:


QList clothoids;

Я связываю сигнал со слотом в другом классе, специально для виджета таблицы:


    void TableViewList::onClothoidAdded(QList *clothoids)
    {
        setRowCount(clothoids->size());

        for (int i = 0; i size(); i++){
            setItem(i+1, 0, new QTableWidgetItem(clothoids->at(i)->startCurvature));
            setItem(i+1, 1, new QTableWidgetItem(clothoids->at(i)->endCurvature));
            setItem(i+1, 2, new QTableWidgetItem(clothoids->at(i)->clothoidLength));
            setItem(i+1, 3, new QTableWidgetItem(clothoids->at(i)->sPoint.x() + ", " +
                                               clothoids->at(i)->sPoint.y()));
            setItem(i+1, 4, new QTableWidgetItem(clothoids->at(i)->ePoint.x() + ", " +
                                               clothoids->at(i)->ePoint.y()));
        }

    }

Проблема в том, что данные не вставлены в таблицу. Я проверил отладку и увидел, что массив содержит нужные данные. Как я мог получить к нему правильный доступ? Любые идеи?

При попытке использовать QTableView и QStandardItemModel я сталкиваюсь с этой проблемой: данные модели не вставляются в таблицу:


    renderingWidget::renderingWidget(QWidget *parent) :
            QWidget(parent),
            ui(new Ui::renderingWidget)
    {
        ui->setupUi(this);

        model.setColumnCount(3);
        ui->clothoidTable->setModel(&model);

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


        connect (ui->saveButton, SIGNAL(clicked()), this, SLOT(createClothoid()));
    }


    void renderingWidget::createClothoid()
    {
        model.setRowCount(model.rowCount()+1);

        QModelIndex index = model.index(model.rowCount(), 1, QModelIndex());
        model.setData(index, QVariant(ui->lengthSpinBox->value()));
        index = model.index(model.rowCount(), 2, QModelIndex());
        model.setData(index, QVariant(ui->sCurvSpinBox->value()));
        index = model.index(model.rowCount(), 3, QModelIndex());
        model.setData(index, QVariant(ui->eCurvSpinBox->value()));

        ui->clothoidTable->setModel(&model);
    }

Я хочу иметь возможность вставлять данные в некоторые текстовые поля / счетчики, а затем при нажатии кнопки данные должны быть добавлены в таблицу. Но обновляется только количество строк, а не данные внутри. Я что-то не так делаю при установке данных для модели?


person schmimona    schedule 02.08.2011    source источник


Ответы (1)


Это будет трудно услышать, но я бы отказался от класса удобства QTableWidget.

Чтобы узнать, как Qt действительно предназначен для обработки сложных таблиц, подобных вашей.

Мои два цента на Модель / Представления таковы:

  1. Используйте QTableView вместо QTableWidget.
  2. Подкласс QAbstractItemModel и реализуйте data() (для чтения), а также все другие функции, которые вам нужны из документации. Это самая сложная часть, но обратитесь к приведенной выше ссылке, чтобы узнать, как это сделать.
  3. setModel() из QTableView в модель вашего подкласса.

Если у вас есть еще вопросы, я с радостью на них отвечу.

person kevlar1818    schedule 02.08.2011
comment
Я пробовал qtableview, но у меня проблема, потому что данные, которые я добавляю в модель, не вставляются в таблицу. я обновил свой вопрос для этого - person schmimona; 04.08.2011