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

时间:2019-07-13 05:44:57

标签: c++ sql qt qt5 qtableview

我有一个 Qt tableView ,它从 SQLite数据库加载数据,并且我已经对其进行配置,使得在默认视图中, first会自动选择该行,并且我可以通过按按钮-“呈现” 对该行执行查询。现在,我希望程序在第一次时按下<按钮>后自动自动选择下一行,以便当我按下 >第二次,则在第二行执行查询。因此,基本上,我想在每次按下按钮直到到达行号末尾时更改行的选择

我已经搜索了很多站点来寻找解决方案,但是我的问题却无法解决。

用于查看表 s_info 并选择第一行作为默认代码的代码。

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 表中的列 Roll_No 和第一行的 Roll No索引执行了查询执行, 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 时,行选择将移至第二行,并在该行上执行查询。我希望这种情况一直持续到行数结束为止。

1 个答案:

答案 0 :(得分:0)

以下示例说明了您将要实现的目标。关键是您将需要一个QItemSelectionModel来管理您的选择。很多时候,人们忘记将QItemSelectionModel的模型明确设置为视图的模型。

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

如果使用的是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();
}