如何使用QPushButton从QGraphicsView删除QGraphicsItem

时间:2019-06-13 03:02:06

标签: sqlite qt5 qtableview qgraphicsview qgraphicsscene

我正在构建一个主要的用户界面,但是我陷入了一个问题,为了缩小问题,我构建了一个包含问题的小型工作示例。

在用户使用该图标创建新的<input type="number" pattern="[0-9]+"> 文件并将其保存到桌面后,可以在.db中加载图像(目前仅以.png格式)在QGraphicsView上滑动以启用从checkboxRight: Drag,可以在图像上绘制框。在绘制的框内有一个Right:Select时,我们可以打开一个right click,要求命名从框中提取的图像。图像存储在QDialog中,如下面的小示例所示:

sql

问题: 我尝试了几种擦除该框的方法(以及相关框的QTableView上的相关索引),但没有一个成功。 通过使用“擦除方块” QTableView,我试图擦除该框。每个框都可以在感兴趣的框内向左QPushButton处重新激活。参见下面我要实现的目标:

problem

我在double-clicking上绘制框,然后右键单击以从框中捕获图像:

QGraphicsView

根据用户需要绘制多个框:

void MainWindow::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if(event->button() == Qt::RightButton)
      {
        this->setContextMenuPolicy(Qt::CustomContextMenu);
        connect(this, SIGNAL(customContextMenuRequested(const QPoint &)),
                this, SLOT(ShowContextMenu(const QPoint &)));
      }
}

void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    Q_UNUSED(event);
    leftScene->clearSelection();     // Selections would also render to the file
    leftScene->setSceneRect(leftScene->itemsBoundingRect());    // Re-shrink the scene to it's bounding contents
    QImage image(leftScene->sceneRect().size().toSize(), QImage::Format_ARGB32);  // Create the image with the exact size of the shrunk scene
    image.fill(Qt::transparent);     // Start all pixels transparent

    QPainter painter(&image);
    leftScene->render(&painter);
    QImage subimage = image.copy(QRect(start.toPoint(), end.toPoint()));

    clipSceneDialog d(this);
    d.show();
    d.setImage(subimage);
    d.setHeaderImage(currentLeftImagePath);
    d.setBoundingBox(QRect(start.toPoint(), end.toPoint()));

    if(d.exec() == QDialog::Rejected) {
        return;
    } else {
        //
    }
    Param result = d.getData();
    Parameters* param = new Parameters(result);
    mDatabaseLeftCamera->addItem(param);
    mModelLeftCamera->select();
    ui->tableView->show();
}

绘制多个框后,用户决定通过双击框内的一个来重新激活其中一个框:

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());
            square = new Square(select);
            square->setActiveState(true);
            currentSelection = selections.size();
            selections.append(square);
            leftScene->addItem(square->getGraphics());
            ui->graphicsView->show();
    }
    else
    {
        start = fromScenePoint;
        end = toScenePoint;
    }
}

用户决定删除重新激活的方块:

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

但是这不起作用,什么也没发生。另外,由于该框对应于void MainWindow::on_eraseSquare_clicked() { clearSceneLeft(); } void MainWindow::clearSceneLeft() { if (selections.size() > 0) { qDeleteAll(selections); selections.clear(); currentSelection = -1; } for(int p=0;p<shape.size();p++) { leftScene->removeItem(shape[p]); delete shape[p]; } shape.clear(); } 上的SQL引用,因此我不知道在QTableView类中如何连接该引用。

我已经尝试了很多天来解决这个问题,并且想法不多了。感谢您阐明这个问题或指出正确的方向。 如果您想尝试小示例界面,则可以从here

开始

0 个答案:

没有答案