每当按下按钮时,如何在 Qt tableView 中自动 select 下一行?

How to select next row automatically in Qt tableView whenever a pushbutton is pressed?

我有一个 Qt tableViewSQLite 数据库 加载数据,我已经配置了它在默认视图中,第一行自动 selected 并且我可以 对该行 执行查询,方法是按一个按钮-'Present'。现在,我希望我的程序 自动 select 下一行 在我第一次 按下 'button' 之后 所以当我 第二次按 'Present' 时,查询在第二行执行。所以,基本上,我想 更改 select 行的离子 每当按下按钮时,直到到达行号的末尾。

我已经在很多网站上搜索了解决方案,但找不到解决我问题的网站。

用于查看的代码 table s_info 和 select 默认第一行。

void table::on_view_clicked() 
{
MainWindow conn;
QSqlQueryModel * modal = new QSqlQueryModel();

conn.connOpen();
QSqlQuery* qry= new QSqlQuery(conn.info);

qry->prepare("Select Name,Roll_No from s_info order by Roll_no");
qry->exec();
modal->setQuery(*qry);
ui-> tableView ->setModel(modal);
ui->tableView-> setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView->selectRow(0);
ui->tableView->setFocus();

conn.connClose();
qDebug()<< (modal->rowCount());
}

单击按钮名称 'Present' 时执行查询的代码。 注意我在s_info[=38中根据列Roll_No进行了查询执行=] table 和 第一行卷号的索引是 (0,1)

void table::on_present_clicked()

{
QAbstractItemModel *model = ui->tableView->model();
QModelIndex index = model->index(0,1);
QString roll= (index.data().toString());
MainWindow conn;
conn.connOpen();
QSqlQuery qry;
QSqlTableModel modal;
qry.prepare("Update s_info set Present_Days=Present_Days + 1 where 
Roll_No='"+roll+"'");
qry.exec();

conn.connClose();
}

我希望当我第二次单击 Present 时,行 selection 会移到第二行并在该行上执行查询.我希望这种情况发生,直到我到达行数的末尾。

以下示例说明了您将要实现的目标。 key-point 是您将需要一个 QItemSelectionModel,它管理您 selection。人们常常忘记显式地将 QItemSelectionModel 的模型设置为视图的模型。

现在,如果您要 select 视图中的一行,则下一个按钮将 select 下一行。选择下一行基本上意味着 select 下一行中的所有列。

如果您使用的是 QSqlTableModel 之类的东西,用法应该完全相同。

#include <QApplication>
#include <QTableView>
#include <QPushButton>
#include <QHBoxLayout>
#include <QStandardItemModel>
#include <QItemSelectionModel>

int main(int argc, char** args) {
    QApplication app(argc, args);
    auto frame = new QFrame;
    frame->setLayout(new QHBoxLayout);
    auto tableView = new QTableView;
    tableView->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection);
    tableView->setSelectionBehavior(QAbstractItemView::SelectionBehavior::SelectRows);
    auto model = new QStandardItemModel;
    tableView->setModel(model);
    auto selectionModel = new QItemSelectionModel;
    selectionModel->setModel(model);
    tableView->setSelectionModel(selectionModel);
    frame->layout()->addWidget(tableView);
    auto button = new QPushButton("Next");
    frame->layout()->addWidget(button);
    model->setRowCount(10);
    model->setColumnCount(10);
    frame->show();
    QObject::connect(button, &QPushButton::clicked, [&]()
    {
        auto indices = selectionModel->selectedIndexes();
        if (indices.isEmpty()) return;
        QModelIndexList empty;
        selectionModel->select(QModelIndex(), QItemSelectionModel::SelectionFlag::Clear);
        for (auto index : indices)
        {
            auto newIndex=index.sibling(index.row() + 1, index.column());
            selectionModel->select(newIndex,QItemSelectionModel::SelectionFlag::Select);
        }
    });
    app.exec();
}