Я проектирую интерфейс с большим количеством элементов управления.Однако я подготовил небольшое минимальное приложение, которое описывает проблему, которая у меня есть.Приложение состоит из:
1) N.1 QTableView
2) N.1 QGraphicsView
3) Кнопка N.1
4) N.2 ListView
Графический интерфейс пользователя показан ниже:
С помощью мыши я могу нарисовать указанный прямоугольник (красный квадрат).Как только я нарисую прямоугольник (и могу щелкнуть, чтобы создать точки, как показано), я создаю первую строку в 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, вызывающем сбой программного обеспечения.
Спасибо, что указали в правильном направлении или пролили свет на эту проблему.