如何从QTableView删除QGraphicsRectItem,QTableView也是SQLITE数据库的记录

时间:2019-02-11 05:04:54

标签: c++11 sqlite qt5 qtableview

我正在设计带有很多控件的界面。但是,我准备了一个很小的最小应用程序来描述我所遇到的问题。 该应用程序包括:

1)N.1 QTableView

2)N.1 QGraphicsView

3)N.1按钮

4)N.2 ListView

GUI如下所示:

main GUI

用鼠标我可以画一个方框(红色正方形)。绘制框后(也可以单击以创建点,如图所示),我使用一些默认参数在QTableView中创建第一行。 绘制第二个框后,立即在QTableView中创建另一行,依此类推,直到绘制第三个框。

绘制第三个框后,用户可以通过双击先前绘制的第一个框并与其他框相同来决定重新获得第一个框。

使用按钮,我想删除points +框,该框本身也与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上的相关行。

实际结果:我可以从QGraphicsView中删除box + points,但是与该特定框相关的特定行仍存​​在于QTableView上,导致软件崩溃。

感谢您指出正确的方向或阐明了这个问题。

0 个答案:

没有答案