每当按下按钮时,如何在 Qt tableView 中自动 select 下一行?
How to select next row automatically in Qt tableView whenever a pushbutton is pressed?
我有一个 Qt tableView 从 SQLite 数据库 加载数据,我已经配置了它在默认视图中,第一行自动 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();
}
我有一个 Qt tableView 从 SQLite 数据库 加载数据,我已经配置了它在默认视图中,第一行自动 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();
}