mainwindow.h
/**
* 书本:【Qt5开发及实例】
* 功能:Qt操作主/从视图和XML
* 文件:mainwindow.h
* 时间:2015年2月20日21:20:25
* 作者:cutter_point
*/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QGroupBox>
#include <QTableView>
#include <QListWidget>
#include <QLabel>
#include <QDomDocument>
#include <QDomNode>
#include <QFile>
#include <QSqlRelationalTableModel>
#include <QSqlTableModel>
#include <QDebug>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
//汽车制造商列表名,汽车表名,汽车详细信息对应XML文件指针
MainWindow(const QString &factoryTable,const QString &carTable,QFile *carDetails,QWidget *parent = 0); //构造函数
~MainWindow();
private:
QGroupBox *createCarGroupBox();
QGroupBox *createFactoryGroupBox();
QGroupBox *createDetailsGroupBox();
void createMenuBar(); //菜单
QTableView *carView;
QTableView *factoryView;
QListWidget *attribList;
QLabel *profileLabel;
QLabel *titleLabel;
QDomDocument carData; //对应XML文件的源
QFile *file; //XML文件指针
QSqlRelationalTableModel *carModel; //对应的汽车模型表
QSqlTableModel *factoryModel; //工厂模型表
void readCarData(); //读入XML文件爱你根目录
};
#endif // MAINWINDOW_H
mainwindow.cpp
/**
* 书本:【Qt5开发及实例】
* 功能:Qt操作主/从视图和XML
* 文件:mainwindow.cpp
* 时间:2015年2月20日21:20:25
* 作者:cutter_point
*/
#include "mainwindow.h"
#include <QGridLayout>
#include <QAbstractItemView>
#include <QHeaderView>
#include <QAction>
#include <QMenu>
#include <QMenuBar>
MainWindow::MainWindow(const QString &factoryTable,const QString &carTable,QFile *carDetails,QWidget *parent)
: QMainWindow(parent)
{
file = carDetails; //得到文件指针
readCarData(); //得到XML根元素开始
carModel = new QSqlRelationalTableModel(this); //为汽车表创建一个模型
carModel->setTable(carTable); //为模型设定表
carModel->setRelation(2, QSqlRelation(factoryTable, "id", "manufactory")); //按0, 1, 2,3顺序来的在carTable中第3列是外键连接在factoryTable表中的id,
//用来展示的是manufactory来在car表中代替id号
carModel->select(); //这个是为了直接显示出效果出来,不用等你点他进行响应
factoryModel = new QSqlTableModel(this); //同上
factoryModel->setTable(factoryTable);
factoryModel->select(); //这个是为了直接显示出效果出来,不用等你点他进行响应
QGroupBox *factory = createFactoryGroupBox();
QGroupBox *cars = createCarGroupBox();
QGroupBox *details = createDetailsGroupBox(); //创建三块显示区域
// uniqueCarId = carModel->rowCount();
// uniqueFactoryId = factoryModel->rowCount();
//布局
QGridLayout *layout = new QGridLayout;
layout->addWidget(factory, 0, 0);
layout->addWidget(cars, 1, 0);
layout->addWidget(details, 0, 1, 2, 1);
layout->setColumnStretch(1, 1);
layout->setColumnMinimumWidth(0, 500); //第一列的列宽
QWidget *widget = new QWidget;
widget->setLayout(layout);
setCentralWidget(widget);
createMenuBar();
resize(850, 400);
setWindowTitle(tr("主从视图"));
}
//MainWindow::MainWindow(QWidget *parent)
// : QMainWindow(parent)
//{
// QGroupBox *factory = createFactoryGroupBox();
// QGroupBox *cars = createCarGroupBox();
// QGroupBox *details = createDetailsGroupBox(); //创建三块显示区域
// //布局
// QGridLayout *layout = new QGridLayout;
// layout->addWidget(factory, 0, 0);
// layout->addWidget(cars, 1, 0);
// layout->addWidget(details, 0, 1, 2, 1);
// layout->setColumnStretch(1, 1);
// layout->setColumnMinimumWidth(0, 500); //第一列的列宽
// QWidget *widget = new QWidget;
// widget->setLayout(layout);
// this->setCentralWidget(widget);
// createMenuBar();
// resize(850, 400);
// setWindowTitle(tr("主从视图"));
//}
//QGroupBox *createCarGroupBox();
QGroupBox* MainWindow::createCarGroupBox()
{
//汽车的区域
QGroupBox *box = new QGroupBox(tr("汽车"));
carView = new QTableView;
carView->setEditTriggers(QAbstractItemView::NoEditTriggers); //不准用户编辑视图中的字段
carView->setSortingEnabled(true);
carView->setSelectionBehavior(QAbstractItemView::SelectRows);
carView->setSelectionMode(QAbstractItemView::SingleSelection);
carView->setShowGrid(false); //不显示网格
carView->verticalHeader()->hide(); //隐藏水平头部的计数1,2,3,4,。。。
carView->setAlternatingRowColors(true);
carView->setModel(carModel);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(carView, 0, 0);
box->setLayout(layout);
return box;
}
//QGroupBox *createFactoryGroupBox();
QGroupBox* MainWindow::createFactoryGroupBox()
{
//汽车制造商
factoryView = new QTableView;
factoryView->setEditTriggers(QAbstractItemView::NoEditTriggers); //不准编辑
factoryView->setSortingEnabled(true);
factoryView->setSelectionBehavior(QAbstractItemView::SelectRows);
factoryView->setSelectionMode(QAbstractItemView::SingleSelection);
factoryView->setShowGrid(false); //不显示网格
factoryView->verticalHeader()->hide(); //隐藏水平头部的计数1,2,3,4,。。。
factoryView->setAlternatingRowColors(true);
factoryView->setModel(factoryModel); //设置模型显示出来
QGroupBox *box = new QGroupBox(tr("汽车制造商"));
QGridLayout *layout = new QGridLayout;
layout->addWidget(factoryView, 0, 0);
box->setLayout(layout);
return box;
}
//QGroupBox *createDetailsGroupBox();
QGroupBox* MainWindow::createDetailsGroupBox()
{
QGroupBox *box = new QGroupBox(tr("详细信息"));
profileLabel = new QLabel;
profileLabel->setWordWrap(true);
profileLabel->setAlignment(Qt::AlignBottom);
titleLabel = new QLabel;
titleLabel->setWordWrap(true);
titleLabel->setAlignment(Qt::AlignBottom);
attribList = new QListWidget;
QGridLayout *layout = new QGridLayout;
layout->addWidget(profileLabel, 0, 0, 1, 2);
layout->addWidget(titleLabel, 1, 0, 1, 2);
layout->addWidget(attribList, 2, 0, 1, 2);
layout->setRowStretch(2, 1);
box->setLayout(layout);
return box;
}
//oid createMenuBar(); //菜单
void MainWindow::createMenuBar()
{
QAction *addAction = new QAction(tr("添加"), this);
QAction *deleteAction = new QAction(tr("删除"), this);
QAction *quitAction = new QAction(tr("quit"), this);
addAction->setShortcut(tr("Ctrl+A"));
deleteAction->setShortcut(tr("Ctrl+D"));
quitAction->setShortcut(tr("Ctrl+Q"));
QMenu *fileMenu = menuBar()->addMenu(tr("操作菜单"));
fileMenu->addAction(addAction);
fileMenu->addAction(deleteAction);
fileMenu->addSeparator();
fileMenu->addAction(quitAction);
}
MainWindow::~MainWindow()
{
}
//void readCarData(); //读入XML文件爱你根目录
void MainWindow::readCarData()
{
if(!file->open(QIODevice::ReadOnly))
return;
// else
// {
// qDebug()<<"..ok";
// }
if(!carData.setContent(file)) //设置XML源
{
qDebug()<<"..ok";
file->close();
return;
}
file->close();
}
conndlg.h
#ifndef CONNDLG_H
#define CONNDLG_H
#include <QDialog>
#include <QMessageBox>
namespace Ui
{
class ConnDlg;
}
class QSqlError;
class ConnDlg : public QDialog
{
Q_OBJECT
public:
explicit ConnDlg(QWidget *parent = 0);
~ConnDlg();
QString driverName() const; //驱动名
QString databaseName() const; //数据库
QString userName() const; //用户
QString password() const; //密码
QString hostName() const; //主机
int port() const; //端口
QSqlError addConnection(const QString &driver, const QString &dbName, const QString &host,const QString &user,
const QString &passwd, int port = -1); //打开数据库连接,并判断是否打开
//创建一个连接
void createDB();
void addSqliteConnection();
private slots:
void on_okButton_clicked();
void on_cancelButton_clicked() { reject(); }
void driverChanged(const QString &);
private:
Ui::ConnDlg *ui;
};
#endif // CONNDLG_H
conndlg.cpp
#include "conndlg.h"
#include "ui_conndlg.h"
#include <QSqlDatabase>
#include <QtSql>
ConnDlg::ConnDlg(QWidget *parent) :
QDialog(parent),
ui(new Ui::ConnDlg)
{
ui->setupUi(this);
QStringList drivers = QSqlDatabase::drivers();
ui->comboDriver->addItems(drivers); //显示可以用的所有驱动
connect(ui->comboDriver, SIGNAL(currentIndexChanged(QString)), this, SLOT(driverChanged(QString)));
ui->strtus_label->setText(tr("准备连接数据库!"));
}
//void driverChanged(const QString &);
void ConnDlg::driverChanged(const QString &text)
{
if(text =="QSQLITE")
{
ui->editDatabase->setEnabled(false);
ui->editUsername->setEnabled(false);
ui->editPassword->setEnabled(false);
ui->editHostname->setEnabled(false);
ui->portSpinBox->setEnabled(false);
}
else
{
ui->editDatabase->setEnabled(true);
ui->editUsername->setEnabled(true);
ui->editPassword->setEnabled(true);
ui->editHostname->setEnabled(true);
ui->portSpinBox->setEnabled(true);
}
}
QString ConnDlg::driverName() const
{
return ui->comboDriver->currentText(); //得到当前选择的驱动
}
QString ConnDlg::databaseName() const
{
return ui->editDatabase->text(); //得到数据库名
}
QString ConnDlg::userName() const
{
return ui->editUsername->text(); //用户名
}
QString ConnDlg::password() const
{
return ui->editPassword->text(); //密码
}
QString ConnDlg::hostName() const
{
return ui->editHostname->text(); //主机
}
int ConnDlg::port() const
{
return ui->portSpinBox->value(); //端口号
}
ConnDlg::~ConnDlg()
{
delete ui;
}
void ConnDlg::on_okButton_clicked()
{
if (ui->comboDriver->currentText().isEmpty())
{
ui->strtus_label->setText(tr("请选择一个数据库驱动!"));
ui->comboDriver->setFocus(); //显示选中
}
else if(ui->comboDriver->currentText() =="QSQLITE")
{
addSqliteConnection(); //添加连接
//创建数据库表,如已存在则无须执行
createDB();
accept(); //接受事件,免得返回父类
}
else
{
QSqlError err = addConnection(driverName(), databaseName(), hostName(),userName(), password(), port());
if (err.type() != QSqlError::NoError)
ui->strtus_label->setText(err.text());
else
ui->strtus_label->setText(tr("连接数据库成功!"));
//创建数据库表,如已存在则无须执行
accept();
}
}
//QSqlError addConnection(const QString &driver, const QString &dbName, const QString &host,const QString &user,
// const QString &passwd, int port = -1);
QSqlError ConnDlg::addConnection(const QString &driver, const QString &dbName, const QString &host,const QString &user, const QString &passwd, int port)
{
QSqlError err;
QSqlDatabase db = QSqlDatabase::addDatabase(driver);
db.setDatabaseName(dbName);
db.setHostName(host);
db.setPort(port);
if (!db.open(user, passwd))
{
err = db.lastError();
}
return err;
}
void ConnDlg::addSqliteConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("databasefile");
if (!db.open())
{
ui->strtus_label->setText(db.lastError().text());
return;
}
ui->strtus_label->setText(tr("创建sqlite数据库成功!"));
}
void ConnDlg::createDB()
{
QSqlQuery query;
query.exec("create table factory (id int primary key, manufactory varchar(40), address varchar(40))");
query.exec(QObject::tr("insert into factory values(1, '一汽大众', '长春')"));
query.exec(QObject::tr("insert into factory values(2, '二汽神龙', '武汉')"));
query.exec(QObject::tr("insert into factory values(3, '上海大众', '上海')"));
// query.exec(QObject::tr("insert into factory values(4, '一汽大众', '长春')"));
query.exec("create table cars (carid int primary key, name varchar(50), factoryid int, year int, foreign key(factoryid) references factory)");
query.exec(QObject::tr("insert into cars values(1,'奥迪A6',1,2005)"));
query.exec(QObject::tr("insert into cars values(2, '捷达', 1, 1993)"));
query.exec(QObject::tr("insert into cars values(3, '宝来', 1, 2000)"));
query.exec(QObject::tr("insert into cars values(4, '毕加索',2, 1999)"));
query.exec(QObject::tr("insert into cars values(5, '富康', 2, 2004)"));
query.exec(QObject::tr("insert into cars values(6, '标致307',2, 2001)"));
query.exec(QObject::tr("insert into cars values(7, '桑塔纳',3, 1995)"));
query.exec(QObject::tr("insert into cars values(8, '帕萨特',3, 2000)"));
}
main.cpp
#include "mainwindow.h"
#include "conndlg.h"
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ConnDlg dialog;
if (dialog.exec() != QDialog::Accepted)
return -1;
// dialog.show();
QFile *carDetails = new QFile("attribs.xml");
// if(carDetails->isOpen())
// {
// qDebug()<<"??ok";
// }
MainWindow window("factory", "cars", carDetails);
window.show();
// MainWindow w;
// w.show();
return a.exec();
}
截图: