目录
一.Qt QTabWidget控件使用
1. 新建Tab页
新建tab页添加到QTabWidget控件中,分别修改currenttabText为
数据库表列表,表字段详细,表数据分别显示sqllite数据库中的所有表列表,选中表的表字段,以及表中的详细数据,如下图示:
2. 加载SqLite数据库
添加菜单栏,选中db数据库,加载数据!
//选择数据库文件
QString xlsFile = QFileDialog::getOpenFileName(this,QString(),QString(),"sqlite数据库(*.db)");
if(xlsFile.isEmpty())
return;
//根据文件所在路径加载数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","sqlite_master");
db.setDatabaseName(xlsFile);
//判断数据库是否能够打开
if(db.open())
{}
else
QMessageBox::information(NULL, "提示","未能打开db数据库!",
QMessageBox::Ok , QMessageBox::Ok);
db.close();
二.Qt 读取sqlite数据库中的数据
1. 加载sqlite数据库中的所有表与视图列表数据
在选中数据库时,就直接加载数据库中的所有表的详细信息,并将QSqlQueryModel添加到tab页对应的QTableView控件上:
//选择数据库文件
QString xlsFile = QFileDialog::getOpenFileName(this,QString(),QString(),"sqlite数据库(*.db)");
if(xlsFile.isEmpty())
return;
//根据文件所在路径加载数据库
db = QSqlDatabase::addDatabase("QSQLITE","sqlite_master");
db.setDatabaseName(xlsFile);
//判断数据库是否能够打开
if(db.open())
{
model = new QSqlQueryModel;
model->setQuery("select * from sqlite_master", db);
ui->tableView->setModel(model);
}
else
QMessageBox::information(NULL, "提示","未能打开db数据库!",
QMessageBox::Ok , QMessageBox::Ok);
db.close();
得到包含sqlite数据库中表与视图的详细信息如下图结果:
2. 查询sqlite数据库表的字段信息,以及数据
通过对上面表的显示结果绑定双击事件加载对应表的详细信息,以及数据
void MainWindow::on_tableView_doubleClicked(const QModelIndex &index)
{
QVariant data= model->data(index.parent());
model->query().seek(index.row());
if(db.open())
{
//查询表字所有字段
QSqlQueryModel* modesl=new QSqlQueryModel;
ui->tab2->setToolTip(model->query().value("name").toString());
modesl->setQuery("PRAGMA table_info("+model->query().value("name").toString()+")", db);
ui->tableinfoView->setModel(modesl);
//查询表中所有数据
QSqlQueryModel* modesm=new QSqlQueryModel;
ui->tab3->setToolTip(model->query().value("name").toString());
modesm->setQuery("select * from "+model->query().value("name").toString(), db);
ui->tableViewall->setModel(modesm);
}
db.close();
}
结果如下图示:
表结构:
表数据:
3. QT 查询sqlite数据库表的所有信息(包括循环表列表数据等)
Qt查询数据库中数据:
QSqlQuery SQls(db);
SQls.prepare("select * from sqlite_master");
QList<QString> Tablist;
if(SQls.exec())
{
int row=1;
//得到表的列名
QSqlRecord sqlRecord(SQls.record());
for(int i = 0; i < sqlRecord.count(); i++){
qDebug() << sqlRecord.fieldName(i);
};
//获取表行数据 --循环每一行
while (SQls.next()) {
Tablist.append(SQls.value("name").toString());
for(int c=1;c<=SQls.record().count();c++) {
qDebug() << QString::fromUtf8(SQls.value(c-1).toByteArray());
}}
}
三.Qt 使用QXlsx导出数据到Execl
1.将QXlsx库添加到项目中
下载QXlsx源码.
将QXlsx库文件添加到项目文件下并在项目下添加
INCLUDEPATH += $$PWD xlsx
include(xlsx/qtxlsx.pri)
具体如下图图示:
2.QXlsx导出sqLite数据库中的所有数据
QXlsx导出sqLite数据库中的表名称,表列表,表数据等,
修改字体样式,合并单元格等导出(可以参考源码中examples文件下的案例)
//数据库是否合法
if(db.isValid())
{
//数据库是否能够打开
if(db.open())
{
QXlsx::Document xlsx;
QXlsx::Format format1;/*设置标题单元的样式*/
QXlsx::Format format2;/*设置标题单元的样式*/
format1.setFontSize(10);/*设置字体大小*/
format1.setHorizontalAlignment(QXlsx::Format::AlignHCenter);/*横向居中*/
format1.setBorderStyle(QXlsx::Format::BorderThin);/*边框样式*/
format1.setFontBold(true);/*设置加粗*/
format2.setFontSize(9);/*设置字体大小*/
format2.setHorizontalAlignment(QXlsx::Format::AlignHCenter);/*横向居中*/
format2.setBorderStyle(QXlsx::Format::BorderThin);/*边框样式*/
if(!xlsx.selectSheet("sqlite_master")){/*在当前打开的xlsx文件中,找一个名字为ziv的sheet*/
xlsx.addSheet("sqlite_master");//找不到的话就添加一个名为ziv的sheet
}
QSqlQuery SQls(db);
SQls.prepare("select * from sqlite_master");
QList<QString> Tablist;
if(SQls.exec())
{
int row=1;
QSqlRecord sqlRecord(SQls.record());
for(int i = 0; i < sqlRecord.count(); i++){
// qDebug() << sqlRecord.fieldName(i);
xlsx.write(row, i+1,sqlRecord.fieldName(i),format1);
}
row=2;
while (SQls.next()) {
Tablist.append(SQls.value("name").toString());
for(int c=1;c<=SQls.record().count();c++)
{
xlsx.write(row, c,QString::fromUtf8(SQls.value(c-1).toByteArray()),format2);
}
row++;
}
for (int tab = 0; tab < Tablist.size(); ++tab) {
xlsx.addSheet(Tablist[tab]);//找不到的话就添加一个名为ziv的sheet
if(xlsx.selectSheet(Tablist[tab]))
{
SQls.prepare("PRAGMA table_info("+Tablist[tab]+")");
int row=1;
if(SQls.exec())
{
xlsx.write(row, 1,QString::fromUtf8("表字段"),format1);
row++;
QSqlRecord sqlRecord(SQls.record());
for(int i = 0; i < sqlRecord.count(); i++){
// qDebug() << sqlRecord.fieldName(i);
xlsx.write(row, i+1,sqlRecord.fieldName(i),format1);
}
row++;
while (SQls.next()) {
for(int c=1;c<=SQls.record().count();c++)
{
xlsx.write(row, c,QString::fromUtf8(SQls.value(c-1).toByteArray()),format2);
}
row++;
}
}
SQls.prepare("select * from "+Tablist[tab]);
if(SQls.exec())
{
xlsx.write(row, 1,QString::fromUtf8("表数据"),format1);
row++;
QSqlRecord sqlRecord(SQls.record());
for(int i = 0; i < sqlRecord.count(); i++){
// qDebug() << sqlRecord.fieldName(i);
xlsx.write(row, i+1,sqlRecord.fieldName(i),format1);
}
row++;
while (SQls.next()) {
for(int c=1;c<=SQls.record().count();c++)
{
xlsx.write(row, c,QString::fromUtf8(SQls.value(c-1).toByteArray()),format2);
}
row++;
}
}
}
}
}
QFileDialog fileDialog;
QString fileName = fileDialog.getSaveFileName(this,tr("Open File"),"/home",tr("Text File(*.xlsx)"));
if(fileName.isEmpty())
return;
xlsx.saveAs(fileName);
QMessageBox::information(NULL, "提示","操作完毕",QMessageBox::Ok , QMessageBox::Ok);
}
db.close();
}
else
{
QMessageBox::information(NULL, "提示","database is no open", QMessageBox::Ok , QMessageBox::Ok);
}
最后得到execl如下图示结果: