Qt QSqlTableModel:在哪里可以获取行是否标记为已删除

Qt QSqlTableModel:在哪里可以获取行是否标记为已删除,qt,qtableview,qsqltablemodel,Qt,Qtableview,Qsqltablemodel,如果我对从数据库中读取的记录调用Remorows a!将显示在tableView的第一列中 我想实现的唯一一件事是,该行不会显示在视图中。我用QSortFilterProxyModel试过了,但我不知道在哪里可以得到用于显示的标志!在第一列。有没有办法在QSortFilterProxyModel中设置一个过滤器,使其只包含没有此标志的行 视图从何处获取信息,即删除的行标记为“!”?这些信息可能隐藏在模型中的某个地方,但我无法找到位置 MainWindow::MainWindow(QWidget

如果我对从数据库中读取的记录调用Remorows a!将显示在tableView的第一列中

我想实现的唯一一件事是,该行不会显示在视图中。我用QSortFilterProxyModel试过了,但我不知道在哪里可以得到用于显示的标志!在第一列。有没有办法在QSortFilterProxyModel中设置一个过滤器,使其只包含没有此标志的行

视图从何处获取信息,即删除的行标记为“!”?这些信息可能隐藏在模型中的某个地方,但我无法找到位置

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
    m_ui(new Ui::MainWindow),
    m_model(new QSqlTableModel(this)),
    m_proxyModel(new QSortFilterProxyModel(this))
{
    m_ui->setupUi(this);
    m_model->setTable("test");
    m_model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    m_model->select();

    m_proxyModel->setSourceModel(m_model);

    m_ui->tableView->setModel(m_proxyModel);

    qDebug() << "Select       : Row count:" << m_model->rowCount();

    connect(m_ui->tableView->selectionModel(), &QItemSelectionModel::selectionChanged,
            this, &MainWindow::on_selectionChanged);
}

MainWindow::~MainWindow()
{
    delete m_ui;
}

void MainWindow::on_pushButtonNewRecord_clicked()
{
    qDebug() << "New Record";

    m_record = m_model->record();
    m_record.setValue("firstname", "john");
    m_record.setValue("lastname", "doe");
    m_record.setValue("email", "john.doe@email.com");

    m_model->insertRecord(-1, m_record);

    qDebug() << "New Record   : Row count:" << m_model->rowCount();
}

void MainWindow::on_pushButtonRemoveRow_clicked()
{
    qDebug() << "Remove Row";

    if (m_row >= 0) {
        m_proxyModel->removeRow(m_row);

        qDebug() << "Remove Record: Row count:" << m_model->rowCount();
    }

    for (int i = 0; i < m_model->rowCount(); i++) {
        qDebug() << "\n";
        qDebug() << "Remove Row: index  :" << m_model->index(i, 0);
        qDebug() << "Remove Row: isValid:" << m_model->index(i, 0).isValid();
        qDebug() << "Remove Row: isDirty:" << m_model->isDirty(m_model->index(i, 0));
        qDebug() << "Remove Row: flags  :" << m_model->index(i, 0).flags();
        qDebug() << "Remove Row: data   :" << m_model->index(i, 0).data(Qt::DisplayRole);
        qDebug() << "Remove Row: heaader:" << m_model->headerData(i, Qt::Vertical);
        QVariant verticalHeader = m_model->headerData(i, Qt::Vertical);
        if (verticalHeader == "!") {
            qDebug() << "Deleted";
        }
        //qDebug() << m_model->record(i);
    }
}

void MainWindow::on_pushButtonSubmit_clicked()
{
    qDebug() << "Submit";

    m_model->submitAll();
    m_model->select();
}


void MainWindow::on_selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
    Q_UNUSED(deselected)

    if (!selected.isEmpty()) {
        m_row = selected.indexes().first().row();
    }
}
MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),
m_ui(新ui::主窗口),
m_模型(新QSqlTableModel(this)),
m_proxyModel(新QSortFilterProxyModel(本))
{
m_ui->setupUi(本);
m_模型->可设置(“测试”);
m_模型->setEditStrategy(QSqlTableModel::OnManualSubmit);
m_模型->选择();
m_proxyModel->setSourceModel(m_模型);
m_ui->tableView->setModel(m_proxyModel);
qDebug()tableView->selectionModel(),&QItemSelectionModel::selectionChanged,
此,&main窗口::on_selection已更改);
}
MainWindow::~MainWindow()
{
删除m_ui;
}
void main window::在按下按钮时记录
{
qDebug()记录();
m_record.setValue(“firstname”、“john”);
m_record.setValue(“lastname”、“doe”);
m_record.setValue(“电子邮件”,“约翰”。doe@email.com");
m_模型->插入记录(-1,m_记录);
qDebug()拆卸工具(m_row);
qDebug()行计数();i++){

qDebug()您必须实现一个QSortFilterProxyModel来过滤脏行和垂直标题文本为“!”的行,还必须调用
invalidate()
方法来强制应用过滤器

dirtyfilterproxymodel.h

// ...
class DirtyFilterProxyModel;
// ...
class MainWindow : public QMainWindow
{
    // ...
private:
    Ui::MainWindow *m_ui;
    DirtyFilterProxyModel *m_proxyModel;
    // ...
\ifndef DIRTYFILTERPROXYMODEL\H
#定义DirtyFilterProxy模型
#包括
#包括
类dirtyFilterProxy模型:公共QSortFilterProxy模型
{
公众:
使用QSortFilterProxyModel::QSortFilterProxyModel;
受保护的:
bool filterAcceptsRow(int source_row、const QModelIndex和source_parent)const
{
if(QSqlTableModel*source\u model=qobject\u cast(sourceModel())){
QModelIndex ix=source\u model->index(source\u行,0,source\u父级);
QString row_header_item=source_model->headerData(source_row,Qt::Vertical,Qt::DisplayRole);
return!(source\u model->isDirty(ix)和&row\u header\u item==QLatin1String(“!”);
}
返回QSortFilterProxyModel::filterAcceptsRow(源行、源父行);
}
};
#endif//DIRTYFILTERPROXYMODEL_H
main window.h

// ...
class DirtyFilterProxyModel;
// ...
class MainWindow : public QMainWindow
{
    // ...
private:
    Ui::MainWindow *m_ui;
    DirtyFilterProxyModel *m_proxyModel;
    // ...
/。。。
类DirtyFilterProxyModel;
// ...
类主窗口:公共QMainWindow
{
// ...
私人:
Ui::MainWindow*m_Ui;
DirtyFilterProxyModel*m_proxyModel;
//…
main window.cpp

#include "dirtyfilterproxymodel.h"
// ...
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
    m_ui(new Ui::MainWindow),
    m_model(new QSqlTableModel(this)),
    m_proxyModel(new DirtyFilterProxyModel(this))
{
    // ...
}

void MainWindow::on_pushButtonNewRecord_clicked()
{
    // ...
    m_model->insertRecord(-1, m_record);
    m_proxyModel->invalidate();
}
// ...
void MainWindow::on_pushButtonRemoveRow_clicked()
{    if (m_row >= 0) {
        m_proxyModel->removeRow(m_row);
        m_proxyModel->invalidate();
    }
}
#包括“dirtyfilterproxymodel.h”
// ...
MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),
m_ui(新ui::主窗口),
m_模型(新QSqlTableModel(this)),
m_proxyModel(新的DirtyFilterProxyModel(本))
{
// ...
}
void main window::在按下按钮时记录
{
// ...
m_模型->插入记录(-1,m_记录);
m_proxyModel->invalidate();
}
// ...
void main window::在按下按钮删除行时单击()
{如果(m_行>=0){
m_proxyModel->removeRow(m_行);
m_proxyModel->invalidate();
}

}
您想删除所选行还是只隐藏它?我想隐藏它,并在调用submitAll时删除它。太好了!这正是我想要的。非常感谢您,但还有一件事我想知道。QSqlTableModel从哪里获得触发“!”的信息在垂直标题?@Bumblebee mmm中,我不理解您的问题,但我将解释QSqlTableModel的工作原理:该模型包含反映DB表+用户实施的修改(新行或删除行)的项,因此该模型具有缓存,以便区分,它在标题数据中添加符号(“*”和“!”),您可以在源代码中看到: