赞
踩
可以通过File菜单,用编程的方法新增、删除艺术家及专辑(不是通过TableView)
当选择Artist时,Details会显示这个艺术家的名字、专辑数量
当点击专辑时,Details会显示专辑标题及专辑列表
经常有人问,向模型插入数据时,会插入空行,或者插入失败,首先要看是不是数据库的问题,比如:
常数 | 值 | 说明 |
---|---|---|
QSqlTableModel::OnFieldChange | 0 | 对模型的所有更改都将立即应用于数据库 |
QSqlTableModel::OnRowChange | 1 | 当用户选择不同的行时,将应用对行的更改 |
QSqlTableModel::OnManualSubmit | 2 | 在调用submitAll()或revertAll()之前,所有更改都将缓存在模型中 |
类对象层次结构
右击项目名称,【Add New…】,增加一个资源文件,名称:XMLAndDataBase,直到完成
右键点击资源文件,选择【添加现有文件…】
类对象层次结构
为Dialog对话框头文件包含sql、xml、小部件三个模块
#include <QtWidgets>
#include <QtSql>
#include <QtXml>
explicit Dialog(QSqlRelationalTableModel *albums, QDomDocument details,
QFile *output, QWidget *parent = nullptr);
Dialog::Dialog(QSqlRelationalTableModel *albums, QDomDocument details,
QFile *output, QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
int uniqueAlbumId;
int uniqueArtistId;
QT += core gui sql xml
#ifndef DATABASE_H #define DATABASE_H #include <QMessageBox> #include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery> static bool createConnection() { QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(":memory:"); if (!db.open()) { QMessageBox::critical(nullptr, QObject::tr("Cannot open database"), QObject::tr("Unable to establish a database connection.\n" "This example needs SQLite support. Please read " "the Qt SQL driver documentation for information how " "to build it.\n\n" "Click Cancel to exit."), QMessageBox::Cancel); return false; } QSqlQuery query; // 歌手id,艺术家名字,专辑数量 query.exec("create table artists (id int primary key, " "artist varchar(40), " "albumcount int)"); query.exec("insert into artists values(0, '<all>', 0)"); query.exec("insert into artists values(1, 'Ane Brun', 2)"); query.exec("insert into artists values(2, 'Thomas Dybdahl', 3)"); query.exec("insert into artists values(3, 'Kaizers Orchestra', 3)"); // 专辑id,专辑标题,艺术家id,发行年份 query.exec("create table albums (albumid int primary key, " "title varchar(50), " "artistid int, " "year int)"); query.exec("insert into albums values(1, 'Spending Time With Morgan', 1, " "2003)"); query.exec("insert into albums values(2, 'A Temporary Dive', 1, 2005)"); query.exec("insert into albums values(3, '...The Great October Sound', 2, " "2002)"); query.exec("insert into albums values(4, 'Stray Dogs', 2, 2003)"); query.exec("insert into albums values(5, " "'One day you`ll dance for me, New York City', 2, 2004)"); query.exec("insert into albums values(6, 'Ompa Til Du D\xc3\xb8r', 3, 2001)"); query.exec("insert into albums values(7, 'Evig Pint', 3, 2002)"); query.exec("insert into albums values(8, 'Maestro', 3, 2005)"); return true; } #endif // DATABASE_H
QSqlDatabase::addDatabase(“QSQLITE”)是静态方法,原型: QSqlDatabase
QSqlDatabase::addDatabase(const QString &type, const QString
&connectionName = QLatin1String(defaultConnection))
有两个参数,第一个参数表示“类型”,第二个参数是“连接名”,如果连接名省略,默认是使用“默认连接”defaultConnection,当我们要用数据库表填充数据模型对象时,通过构造函数QSqlRelationalTableModel(this)填充模型对象,实际上QSqlRelationalTableModel(this)省略了第二个参数,它的原型是:
QSqlRelationalTableModel(QObject *parent = nullptr, QSqlDatabase db =
QSqlDatabase()) 被省略的第二个默认参数是确定要访问的数据库,通过调用 QSqlDatabase
database(const QString &connectionName =
QLatin1String(defaultConnection), bool open = true) 方法来返回默认数据库。
在mainwindow.h头文件中,包含如下sql模块、小部件模块、QFile文件模块
#include <QtSql>
#include <QtWidgets>
#include <QFile>
#include <QDomDocument>
#include "dialog.h"
QSqlRelationalTableModel *model;
explicit MainWindow(const QString &artistTable, const QString &albumTable,
QFile *albumDetails, QWidget *parent = nullptr);
MainWindow::MainWindow(const QString &artistTable, const QString &albumTable, QFile *albumDetails, QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); //使用默认数据库连接,构造model对象 model = new QSqlRelationalTableModel(this); // 设置专辑albums数据表给model model->setTable(albumTable); // 2-歌手id,artist-歌手名字 /* SELECT al.albumid,al.title,ar.artist,al.year FROM albumTable al INNER JOIN artistTable ar ON al.artistid = ar.id; */ // 下面语句相当于上面的sql语句 model->setEditStrategy(QSqlTableModel::OnFieldChange); model->setRelation(2, QSqlRelation(artistTable, "id", "artist")); /* * 使用指定的筛选和排序条件,用通过setTable()设置的表中的数据填充模型, * 如果成功,则返回true,否则返回false。 * 注意:调用select()将恢复任何未提交的更改并删除任何插入的列。 */ model->select(); }
#include "database.h"
#include <QFile>
#include <QDir>
if (!createConnection())
return EXIT_FAILURE;
<archive> <album id="1" > <track number="01" >Humming one of your songs</track> <track number="02" >Are they saying goodbye</track> <track number="03" >On off</track> <track number="04" >I shot my heart</track> <track number="05" >Drowning in Those Eyes</track> <track number="06" >So you did it again</track> <track number="07" >One more time</track> <track number="08" >Headphone silence</track> <track number="09" >What I want</track> <track number="10" >Sleeping by the Fyris River</track> <track number="11" >Wooden Body</track> <track number="12" >Humming one of your songs (encore)</track> </album> <album id="2" > <track number="01" >To let myself go</track> <track number="02" >Rubber and Soul</track> <track number="03" >Balloon ranger</track> <track number="04" >My lover will go</track> <track number="05" >Temporary dive</track> <track number="06" >Laid in earth</track> <track number="07" >This voice</track> <track number="08" >Where friend rhymes with end</track> <track number="09" >Song No.6 feat Ron Sexsmith</track> <track number="10" >The Fight Song</track> </album> <album id="3" > <track number="01" >From Grace</track> <track number="02" >All's not last</track> <track number="03" >That Great October Sound</track> <track number="04" >Life Here Is Gold</track> <track number="05" >Tomorrow Stays The Same</track> <track number="06" >Postulate</track> <track number="07" >Adelaide</track> <track number="08" >John Wayne</track> <track number="09" >Love's Lost</track> <track number="10" >Dreamweaver</track> <track number="11" >Outro</track> </album> <album id="4" > <track number="01" >Rain down on me</track> <track number="02" >Cecilia</track> <track number="03" >Make a mess of yourself</track> <track number="04" >Pale green eyes</track> <track number="05" >Either way I'm gone</track> <track number="06" >Honey</track> <track number="07" >Rise in shame</track> <track number="08" >Stray dogs</track> <track number="09" >The willow</track> <track number="10" >Stay home</track> <track number="11" >Outro</track> </album> <album id="5" > </album> <album id="6" > <track number="01" >Kontroll på kontinentet</track> <track number="02" >Ompa til du dør</track> <track number="03" >Bøn fra helvete</track> <track number="04" >170</track> <track number="05" >Rullett</track> <track number="06" >Dr. Mowinckel</track> <track number="07" >Fra sjåfør til passasjer</track> <track number="08" >Resistansen</track> <track number="09" >Dekk bord</track> <track number="10" >Bak et halleluja</track> <track number="11" >Bris</track> <track number="12" >Mr. Kaizer, hans Constanze og meg</track> </album> <album id="7" > <track number="01" >Di grind</track> <track number="02" >Hevnervals</track> <track number="03" >Evig pint</track> <track number="04" >De involverte</track> <track number="05" >Djevelens orkester</track> <track number="06" >Container</track> <track number="07" >Naade</track> <track number="08" >Min kvite russer</track> <track number="09" >Veterans klage</track> <track number="10" >Til depotet</track> <track number="11" >Salt og pepper</track> <track number="12" >Drøm Hardt (Requiem Part I)</track> </album> <album id="8" > <track number="01" >KGB</track> <track number="02" >Maestro</track> <track number="03" >Knekker deg til sist</track> <track number="04" >Senor Flamingos Adieu</track> <track number="05" >Blitzregn baby</track> <track number="06" >Dieter Meyers Inst.</track> <track number="07" >Christiania</track> <track number="08" >Delikatessen</track> <track number="09" >Jævel av en tango</track> <track number="10" >Papa har lov</track> <track number="11" >Auksjon (i Dieter Meyers hall)</track> <track number="12" >På ditt skift</track> </album> </archive>
QFile albumDetails(QDir::currentPath() + "/../XmlAndDBWriteRead/albumdetails.xml");
MainWindow w("artists", "albums", &albumDetails);
#include "mainwindow.h"
#include <QApplication>
#include <QLocale>
#include <QTranslator>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if (!createConnection())
return EXIT_FAILURE;
QTranslator translator;
const QStringList uiLanguages = QLocale::system
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。