Как стереть QGraphicsRectItem из QTableView, который также является записью базы данных SQLITE - PullRequest
0 голосов
/ 11 февраля 2019

Я проектирую интерфейс с большим количеством элементов управления.Однако я подготовил небольшое минимальное приложение, которое описывает проблему, которая у меня есть.Приложение состоит из:

1) N.1 QTableView

2) N.1 QGraphicsView

3) Кнопка N.1

4) N.2 ListView

Графический интерфейс пользователя показан ниже:

main GUI

С помощью мыши я могу нарисовать указанный прямоугольник (красный квадрат).Как только я нарисую прямоугольник (и могу щелкнуть, чтобы создать точки, как показано), я создаю первую строку в QTableView с некоторыми параметрами по умолчанию.Как только я рисую второй блок, я создаю еще одну строку в QTableView и т. Д., Пока я не нарисую третий блок.

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

Используя кнопку, я бы хотел стереть полеочки + поле. Само поле также связано с определенной строкой в ​​QTableView.Помните: как только я рисую прямоугольник, в QTableView добавляется строка, и после этого появляется опция рисования точек.

Другими словами, как мне заставить SQLITE понять, что если ястереть конкретный элемент (в данном случае поле) в QTableView, который также должен удалить эту конкретную запись из QTableView?

Возможные решения, которые я пробовал:

1)Просматривая официальную документацию SQLITE, однако ничего особенного не было связано с этой конкретной проблемой

2) Мне удалось написать функцию стирания, относящуюся к кнопке, но она носит общий характер, что означает, что я нажимаюон и все точки + поле пропали, и программное обеспечение разрушается, потому что строки в QTableView все еще там и связаны с полем.

Приведенное ниже частичное решение:

mainwindow.h

public:
    QList<DataRegion*> selections;
    int currentSelection;
private:
    QList<QGraphicsRectItem*> leftMatchPoints;

private slots:
    void clearSceneLeft();
    void on_eraseLPointsBtn_clicked();

mainwindow.cpp

void MainWindow::clearSceneLeft()
{
    if (selections.size() > 0) {
        qDeleteAll(selections);
        selections.clear();
        currentSelection = -1;
    }
    for(int p=0;p<leftMatchPoints.size();p++)
    {
        leftScene->removeItem(leftMatchPoints[p]);
        delete leftMatchPoints[p];
    }
    leftMatchPoints.clear();
}


void MainWindow::on_eraseLPointsBtn_clicked()
{
    clearSceneLeft();
}

Ниже приведен фрагмент кода, связанного с этой проблемой:

На конструкторе я создаю временную папку, в которую загружаются данные базы данных, созданной в QTableView:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    currentSelection = -1;

    // temporary folder
    temporaryFolder = "/path/to/folder/tempDBFolder/tmp.db";
    QFile dbRem(temporaryFolder);
    dbRem.remove();
    mDatabaseLeftCamera->inizializationDatabaseLeftCamera(temporaryFolder);
    mDatabaseLeftCamera->configurationDatabaseLeftCamera();
    mModelLeftCamera = new QSqlTableModel(this, mDatabaseLeftCamera->getDatabase());
    mModelLeftCamera->setTable("leftCamTable");
    mModelLeftCamera->select();
    ui->recordLeftTableView->setModel(mModelLeftCamera);
    ui->recordLeftTableView->setItemDelegate(new ImageDelegate(this));
    ui->recordLeftTableView->showColumn(true);
}

mainwindow.cpp

Вот гдесразу после рисования прямоугольника я создаю строку в QTableView:

void MainWindow::onRubberBandUpdate(const QRect &viewportRect, const QPointF &fromScenePoint, const QPointF &toScenePoint)
{
    if(viewportRect.isNull() && fromScenePoint.isNull() && toScenePoint.isNull() && imageLoaded)
    {
        if(currentSelection >= 0)
            selections[currentSelection]->setActiveState(false);
        QRectF select;
        select.setCoords(start.x(), start.y(), end.x(), end.y());
        DataRegion *region = new DataRegion(select);

        // link the box to the table
        leftCamParameters *boxParam = new leftCamParameters();
        SelectionData tmpdat = boxParam->getData();

        // getting the A-B-C-D Coordinates
        tmpdat.mACoord.setX((int)select.topLeft().x());
        tmpdat.mACoord.setY((int)select.topLeft().y());

        // plus additional parameters

        boxParam->setData(tmpdat);
        mDatabaseLeftCamera->addItem(boxParam);
        mModelLeftCamera->select();
        ui->recordLeftTableView->show();

        currentSelection = selections.size();
        selections.append(region);
        leftScene->addItem(region->getGraphics());
        ui->leftView->show();
    }
    else
    {
        start = fromScenePoint;
        end = toScenePoint;
    }
}

Здесь я снова активирую коробку, дважды щелкнув

void MainWindow::onSceneDoubleClick(QPointF point)
{
    QList<QGraphicsItem*> foundItems = leftScene->items(point);
    if(foundItems.size() > 0 && foundItems[0]->group() != nullptr)
    {
        int i = 0;
        for(i=0;i<selections.size();i++)
        {
            if(selections[i]->getGraphics() == foundItems[0]->group())
            {
                break;
            }
        }
        if(currentSelection >= 0)
            selections[currentSelection]->setActiveState(false);

        currentSelection = i;
        selections[currentSelection]->setActiveState(true);
        QRectF rect = selections[currentSelection]->getBox()->rect();
        start.setX(rect.left());
        start.setY(rect.top());
        end.setX(rect.right());
        end.setY(rect.bottom());
    }
}

Ожидаемый результат: как только я активируюВ поле DoubleClick я нажимаю кнопку и удаляю только это поле и связанную с ним строку в QTableView.

Фактический результат: я могу стереть box + points из QGraphicsView, но конкретная строка, связанная с этим конкретным блоком, все еще существуетв QTableView, вызывающем сбой программного обеспечения.

Спасибо, что указали в правильном направлении или пролили свет на эту проблему.

...