我正在构建一个主要的用户界面,但是我陷入了一个问题,为了缩小问题,我构建了一个包含问题的小型工作示例。
在用户使用该图标创建新的<input type="number" pattern="[0-9]+">
文件并将其保存到桌面后,可以在.db
中加载图像(目前仅以.png
格式)在QGraphicsView
上滑动以启用从checkbox
到Right: Drag
,可以在图像上绘制框。在绘制的框内有一个Right:Select
时,我们可以打开一个right click
,要求命名从框中提取的图像。图像存储在QDialog
中,如下面的小示例所示:
问题:
我尝试了几种擦除该框的方法(以及相关框的QTableView
上的相关索引),但没有一个成功。
通过使用“擦除方块” QTableView
,我试图擦除该框。每个框都可以在感兴趣的框内向左QPushButton
处重新激活。参见下面我要实现的目标:
我在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
开始