思路:将数据库需要的表格遍历一遍,把数据的每一行按位置来存入内层容器in_list(一次只能存一行),把数据再一行一行(每一行都是一个in_list)追加进外面的容器out_list。返回一个嵌套容器。
(注意:自带数据库sqlite,需要先连接具体的数据库,有的表格才能查出东西。连接数据库和建表放在文章最后了)
//显示监控区域配置的所有信息
QList<QList<QString> > Database::showRegion()
{
QList<QString> in_list; //内里容器,存放每一行
QList<QList<QString> > out_list; //外面容器存放所有的行
QSqlQuery query; //执行查询语句
QString cmd = QString("select * from MonitoringArea;");
query.exec(cmd);
while(query.next())
{ //区域名称 在总图上的坐标 平面图
in_list.push_back(query.value(0).toString());
in_list.push_back(query.value(1).toString());
in_list.push_back(query.value(2).toString());
out_list.append(in_list); //数据按行添加
in_list.clear(); //清空,方便下一行数据填充
}
return out_list; //返回嵌套容器
}
思路:设置数据库的对象
Database *data; //建议设置为全局变量
data = new Database
,让调用data->showRegion(),用容器接着。然后遍历容器,(*r_it)相当于in_list一行的数据,用at(n)按位置索引,每一行的数据传入设置item的函数,表格将一行一行填充。(注意:先设置表头,才能往表格写入东西)
//从数据库调数据,放入表格
void SystemConfigurationDialog::createTabview()
{
//设置表头
settingRegionHeader(); //设置区域表格,表头行数颜色等
//设置表里的内容
QList<QList<QString>> r_lst = data->showRegion(); //数据库获得嵌套容器
int i = 0;
//将数据库的信息一行一行读取出来
for(QList<QList<QString>>::iterator r_it = r_lst.begin(); r_it != r_lst.end(); r_it++)
{
//插入数据到区域表格
setRegionItemRow(i, (*r_it).at(0), (*r_it).at(1), (*r_it).at(2));
i++; //总行数
}
}
//设置区域表格,表头行数颜色等
void SystemConfigurationDialog::settingRegionHeader()
{
QStringList region_header;
region_header << "区域名称" << "在总图上的坐标" << "平面图";
// 准备数据模型
modelRegion = new QStandardItemModel(this);
modelRegion->setHorizontalHeaderLabels(region_header); //添加表头
modelRegion->setColumnCount(region_header.count()); //设置表格列数
//区域位置的表格
ui->tableView_region->setModel(modelRegion); // 利用 setModel() 方法将数据模型与 QTableView 绑定
//设置表头样式,可有可无
ui->tableView_region->verticalHeader()->setVisible(false); // 是否显示垂直表头
ui->tableView_region->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 均分填充表头采用
ui->tableView_region->horizontalHeader()->setStyleSheet("QHeaderView::section"
"{background-color: rgb(152, 211, 255);}"); //设置表头颜色
ui->tableView_region->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); //表头内容居左
}
//插入数据到区域表格
void SystemConfigurationDialog::setRegionItemRow(int r_row, QString r_name, QString r_coordinate, QString r_plan)
{
//为一行的单元格创建 Items
QStandardItem *item;
//区域名称
item = new QStandardItem(r_name);
item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); // 文本对齐格式,居左
modelRegion->setItem(r_row, 0, item);
//在总图上的坐标
item = new QStandardItem(r_coordinate);
item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); // 文本对齐格式,居左
modelRegion->setItem(r_row, 1, item);
//平面图
item = new QStandardItem(r_plan);
item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); // 文本对齐格式,居左
modelRegion->setItem(r_row, 2, item);
}
按钮点击添加一行,和删除最后一次点击单元格所在行
//增加一个区域, 最后一行
void SystemConfigurationDialog::on_pushButton_region_add_clicked()
{
setRegionItemRow(r_rowCount, "", "", ""); //增加的值全为空
ui->tableView_region->scrollToBottom(); // 滚动到底部
r_rowCount += 1;
}
//减少一个区域,所选单元格所在行
void SystemConfigurationDialog::on_pushButton_region_sub_clicked()
{
auto index = ui->tableView_region->currentIndex(); //获取当前行号
modelRegion->removeRow(index.row()); //删除行
r_rowCount -= 1;
}
连接sqlite数据库和建表语法如下:
//在构造函数里面调用create_database()
#include <QDebug>
#include <QSettings>
#include <QSqlError>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QBuffer>
//创建数据库,连接数据库
void Database::create_database()
{
QSqlDatabase db;
//避免重复连接数据库
if(QSqlDatabase::contains("qt_sql_default_connection"))
{
db = QSqlDatabase::database("qt_sql_default_connection");
}
else
{
db = QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("127.0.0"); //主机号
db.setDatabaseName("FireSystem.db"); //设置数据库名称
db.setUserName("user");
db.setPassword("pwssword");
}
//判断数据库能否打开
if(!db.open()){
qDebug() << "database open error:" << db.lastError();;
}
else{
qDebug() << "database ok!";
}
//创建表格UserInformation和MonitoringArea
// 用户账号管理UserInformation
QSqlQuery query(db);
if(db.tables().contains("UserInformation"))
{
//qDebug() << "table UserInformation already exists!";
}
else
{
//表格不存在,则创建表格
//创建表格UserInformation,用户名userName,密码password ,权限/角色root
QString cmd = "create table UserInformation(userName varchar(50) primary key, password varchar(50), root varchar(30));";
if(!query.exec(cmd)){
qDebug() << "create UserInformation table error!";
}
}
//监控区域配置MonitoringArea
if(db.tables().contains("MonitoringArea"))
{
//qDebug() << "table MonitoringArea already exists!";
}
else
{
//表格不存在,则创建表格MonitoringArea 区域名称areaName 在总图上的坐标areCoordinate 平面图plan
if(!query.exec("create table MonitoringArea(areaName varchar(50) primary key, areCoordinate varchar(50), plan varchar(30))"))
{
qDebug() << "create MonitoringArea table error!";
}
}
}