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();
- }