【自制软件】PDF学习宝-番外篇-QSqlTableModel实例探究

326 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情


📒博客首页:何名取 的个人主页 - 文章 - 掘金 (juejin.cn)
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
❤️期待一起交流!
🙏作者水平很有限,如果发现错误,求告知,多谢!
🌺有问题可私信交流!!!


QSqlTableModel实例探究

前言

今天先不搞PDF学习宝了,因为遇到了瓶颈。本来想的是使用Qt的模型视图设计模式的,然而遇见一个很尴尬的问题。从数据库中直接获取数据源的模型类是QSqlTableModel,仔细看这个类,它是带着Table的。而我在设计书库页时,想要实现的效果需要用到的是QListView视图类。下面是模型与视图的对应关系:

模型视图
QListModelQListView
QTreeModelQTreeView
QTableModelQTableView

Model类: image.png View类:

image.png 在平常的使用中,一般都是对应的两个来使用的,按照常用的为视图设置数据模型方式即可。像今天这种模型是QTableModel类,视图是QListView类的情况也是第一次遇见。因此我单独写了一个Demo来进行测试,到底QSqlTableModel模型与QListView视图能不能关联使用?

Demo

创建一个新的工程后,打开ui文件放入QListView和QTableView。左边是QListView,右边是QTableView。 image.png

下面我直接贴出代码,这是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(); //打开数据表
}

运行程序可以看到图下效果:

image.png 这里我发现QSqlTableModel模型与QListView视图是可以关联使用的,而且对比观察发现QListView视图中的数据只展现了QTableView视图中第一列的数据。修改代码:

ui->listView->setModelColumn(1);

image.png 可以发现QListView视图中展示的数据变成了第二列。

到此为止,已经可以确定QSqlTableModel模型与QListView视图可以关联使用。PDF学习宝后面的书库页的展示问题也得到解决。