我有一个小的.ui
,由(我只介绍问题涉及的主要部分)组成:
1)N.1 QGraphicsView
2)N.1 QTableView
3)N.1 QPushButton
在QGraphicsView
上上传图像后,用户可以通过使用鼠标围绕感兴趣的特征绘制框来捕获部分图像。框操作在class Square
中完成。
每次用户要保存提取的框时,右键单击都会打开一个小对话框,要求命名提取的图像。在对话框中单击“接受”后,此功能(或框)将存储为QTableView
的行。现在,如果用户要擦除一个框,只需双击该框并使用QPushButton
,它应擦除所选框和QTableView
的索引,但这不会发生。非常recently,我能够成功实现一个SQL
语句,该语句负责擦除行索引(仅擦除SQL
),而不是由于我自己而QModelIndex
的实现本身Qt5
提供的有关此工具的知识不足。尽管我在official documentation上已经读了很多,并发现了有用的sources
到目前为止,我尝试了一些方法来实现此目的:
1)我使用SQL
创建了QSQLITE
的支架,该支架处理所有的SQL
操作,最近我添加了一个额外的操作来擦除参数如下所示。我只删除与QTableView
相关的索引,因为这也将删除所有其余字段。请参阅下面的SQL
语句:
dataleftcamera.h
class dataLeftCamera : public QObject
{
Q_OBJECT
public:
explicit dataLeftCamera(QObject *parent = nullptr);
QString getError() const { return mError; }
bool addItem(Parameters* mParameters);
bool updateItem(int itemId, Parameters* mParameters);
bool removeItem(int itemId);
QSqlDatabase getDatabase();
private:
QString mError;
QSqlDatabase mDatabaseLeft;
};
dataleftcamera.cpp
bool dataLeftCamera::removeItem(int itemId)
{
QSqlQuery qry;
qry.prepare("DELETE FROM leftCamTable WHERE id = ?");
qry.addBindValue(itemId);
bool ok = qry.exec();
if(!ok) {
mError = qry.lastError().text();
qDebug() << mError;
}
}
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
// Set up Constructor
connect(ui->eraseSquare, SIGNAL(clicked()), this, SLOT(on_eraseSquare_clicked(QModelIndex)));
}
用户可以绘制任意数量的框。请注意,这里是上述class Square
的{{1}}发挥作用的地方:
square = new Square(select);
双击以重新激活该框:
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::on_eraseSquare_clicked(const QModelIndex &index)
{
int row = index.row();
Param currentData;
int ItemId = index.sibling(row, 0).data().toInt();
mDatabaseLeftCamera->removeItem(ItemId);
mModelLeftCamera->select();
ui->tableView->show();
}
square.cpp
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);
}
}
square.h
Square::Square(QRectF newarea)
{
colorActive = Qt::red;
colorInactive = Qt::darkRed;
mItemSquare = new QGraphicsRectItem(newarea);
mItemSquare->setPen(QPen(colorActive));
gfx = new QGraphicsItemGroup();
gfx->addToGroup(mItemSquare);
index = -1;
}
Square::~Square() {}
QRectF Square::boundingRect() const { return QRectF(0,0,50,50); }
QGraphicsItemGroup *Square::getGraphics() { return gfx; }
bool Square::removeRows(int position, int rows, const QModelIndex &index)
{
beginRemoveRows(QModelIndex(), position, position+rows-1);
for (int row = 0; row < rows; ++row) {
stringList.removeAt(position);
}
endRemoveRows();
return true;
}
void Square::setModelIndex(const QModelIndex &)
{
// Needed?
}
void Square::beginRemoveRows(const QModelIndex &parent, int first, int last)
{
// Needed?
}
void Square::endRemoveRows()
{
// Needed?
}
2)我正在阅读许多资源,例如this one和其他source。似乎class Square : public QObject
{
Q_OBJECT
public:
explicit Square(QRectF newarea);
~Square();
QGraphicsRectItem *mItemSquare;
bool pressed;
bool drawStarted;
int selectedTool, index;
QPixmap mPix;
QGraphicsItemGroup* getGraphics();
bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex());
void setModelIndex(const QModelIndex&);
void setPen(QPen newpen);
void updateColor(QColor active, QColor inactive);
public slots:
void setActiveState(bool newactive);
void setVisible(bool newstate);
protected:
void beginRemoveRows(const QModelIndex &parent, int first, int last);
void endRemoveRows();
}
应该被子类化以重新实现
QTableView
和beginRemoveRows
。但与此同时,我不确定是否应该这样做。
3)我试图了解是否可行的第三种方式是在endRemoveRows
上创建一个函数,如下所示:
class Square
此时实现应类似于以下内容吗?
我已经在这个问题上停留了几天,并且没有其他想法可以继续。
非常感谢您为实现void Square::setModelIndex(const QModelIndex &)
{
// possible solution?
}
函数并解决此问题指明了正确的方向。