持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情
📒博客首页:何名取 的个人主页 - 文章 - 掘金 (juejin.cn)
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
❤️期待一起交流!
🙏作者水平很有限,如果发现错误,求告知,多谢!
🌺有问题可私信交流!!!
QSqlTableModel实例探究
前言
今天先不搞PDF学习宝了,因为遇到了瓶颈。本来想的是使用Qt的模型视图设计模式的,然而遇见一个很尴尬的问题。从数据库中直接获取数据源的模型类是QSqlTableModel,仔细看这个类,它是带着Table的。而我在设计书库页时,想要实现的效果需要用到的是QListView视图类。下面是模型与视图的对应关系:
| 模型 | 视图 |
|---|---|
| QListModel | QListView |
| QTreeModel | QTreeView |
| QTableModel | QTableView |
Model类:
View类:
在平常的使用中,一般都是对应的两个来使用的,按照常用的为视图设置数据模型方式即可。像今天这种模型是QTableModel类,视图是QListView类的情况也是第一次遇见。因此我单独写了一个Demo来进行测试,到底QSqlTableModel模型与QListView视图能不能关联使用?
Demo
创建一个新的工程后,打开ui文件放入QListView和QTableView。左边是QListView,右边是QTableView。
下面我直接贴出代码,这是mainWindow.h头文件的代码:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtSql>
#include <QFileDialog>
#include <QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
QSqlDatabase DB; //数据库连接
QSqlRelationalTableModel *tabModel;//数据模型
QItemSelectionModel *theSelection;//选择模型
};
#endif // MAINWINDOW_H
这里是mainwindow.cpp源文件的代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString aFile=QFileDialog::getOpenFileName(this,"选择数据库文件","",
"SQL Lite数据库(*.db *.db3)");
if (aFile.isEmpty())
return;
//打开数据库
DB=QSqlDatabase::addDatabase("QSQLITE"); //添加 SQL LITE数据库驱动
DB.setDatabaseName(aFile); //设置数据库名称
// DB.setHostName();
// DB.setUserName();
// DB.setPassword();
if (!DB.open()) //打开数据库
{
QMessageBox::warning(this, "错误", "打开数据库失败",
QMessageBox::Ok,QMessageBox::NoButton);
return;
}
tabModel=new QSqlRelationalTableModel(this,DB);
tabModel->setTable("studInfo"); //设置数据表
tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit); //OnManualSubmit , OnRowChange
tabModel->setSort(0,Qt::AscendingOrder);
theSelection=new QItemSelectionModel(tabModel);
ui->listView->setModel(tabModel);
// ui->listView->setModelColumn(1);
ui->listView->setSelectionModel(theSelection);
ui->tableView->setModel(tabModel);
ui->tableView->setSelectionModel(theSelection);
tabModel->select(); //打开数据表
}
运行程序可以看到图下效果:
这里我发现QSqlTableModel模型与QListView视图是可以关联使用的,而且对比观察发现QListView视图中的数据只展现了QTableView视图中第一列的数据。修改代码:
ui->listView->setModelColumn(1);
可以发现QListView视图中展示的数据变成了第二列。
到此为止,已经可以确定QSqlTableModel模型与QListView视图可以关联使用。PDF学习宝后面的书库页的展示问题也得到解决。