如何将一个类链接到其对应的QModelIndex以从QTableView删除行

时间:2019-06-17 13:41:35

标签: c++ qt qt5 qtableview qgraphicsview

我有一个小的.ui,由(我只介绍问题涉及的主要部分)组成:

1)N.1 QGraphicsView

2)N.1 QTableView

3)N.1 QPushButton

box1

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(); } 应该被子类化以重新实现
QTableViewbeginRemoveRows。但与此同时,我不确定是否应该这样做。

3)我试图了解是否可行的第三种方式是在endRemoveRows上创建一个函数,如下所示:

class Square

此时实现应类似于以下内容吗?

box2

我已经在这个问题上停留了几天,并且没有其他想法可以继续。 非常感谢您为实现void Square::setModelIndex(const QModelIndex &) { // possible solution? } 函数并解决此问题指明了正确的方向。

0 个答案:

没有答案