Qt利用主/从视图及XML——实例:汽车管理系统

打印 上一主题 下一主题

主题 1683|帖子 1683|积分 5049

1. 主界面布局

先创建一个QMainwindow,不带设计界面

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QGroupBox>
  5. #include <QTableView>
  6. #include <QListWidget>
  7. #include <QLabel>
  8. class MainWindow : public QMainWindow
  9. {
  10.     Q_OBJECT
  11. public:
  12.     //MainWindow(QWidget *parent = 0);
  13.     MainWindow(QWidget *parent = 0);   //构造函数
  14.     ~MainWindow();
  15. private:
  16.     QGroupBox *createCarGroupBox();
  17.     QGroupBox *createFactoryGroupBox();
  18.     QGroupBox *createDetailsGroupBox();
  19.     void createMenuBar();
  20.     QTableView *carView;                                                //(a)
  21.     QTableView *factoryView;                                        //(b)
  22.     QListWidget *attribList;                                        //显示车型的详细信息列表
  23.     /* 声明相关的信息标签 */
  24.     QLabel *profileLabel;
  25.     QLabel *titleLabel;
  26. };
  27. #endif // MAINWINDOW_H
复制代码
然后再在mainwindow.cpp中
  1. #include "mainwindow.h"
  2. #include <QGridLayout>
  3. #include <QAbstractItemView>
  4. #include <QHeaderView>
  5. #include <QAction>
  6. #include <QMenu>
  7. #include <QMenuBar>
  8. MainWindow::MainWindow(QWidget *parent)
  9.     : QMainWindow(parent)
  10. {
  11.     QGroupBox *factory = createFactoryGroupBox();
  12.     QGroupBox *cars = createCarGroupBox();
  13.     QGroupBox *details = createDetailsGroupBox();
  14.     //布局
  15.     QGridLayout *layout = new QGridLayout;
  16.     layout->addWidget(factory, 0, 0);
  17.     layout->addWidget(cars, 1, 0);
  18.     layout->addWidget(details, 0, 1, 2, 1);
  19.     layout->setColumnStretch(1, 1);
  20.     layout->setColumnMinimumWidth(0, 500);
  21.     QWidget *widget = new QWidget;
  22.     widget->setLayout(layout);
  23.     setCentralWidget(widget);
  24.     createMenuBar();
  25.     resize(850, 400);
  26.     setWindowTitle(u8"主从视图");
  27. }
  28. QGroupBox* MainWindow::createFactoryGroupBox()
  29. {
  30.     factoryView = new QTableView;
  31.     factoryView->setEditTriggers(QAbstractItemView::NoEditTriggers);
  32.                                                             //(a)
  33.     factoryView->setSortingEnabled(true);
  34.     factoryView->setSelectionBehavior(QAbstractItemView::SelectRows);
  35.     factoryView->setSelectionMode(QAbstractItemView::SingleSelection);
  36.     factoryView->setShowGrid(false);
  37.     factoryView->setAlternatingRowColors(true);
  38.     QGroupBox *box = new QGroupBox(u8"汽车制造商");
  39.     QGridLayout *layout = new QGridLayout;
  40.     layout->addWidget(factoryView, 0, 0);
  41.     box->setLayout(layout);
  42.     return box;
  43. }
  44. QGroupBox* MainWindow::createCarGroupBox()
  45. {
  46.     QGroupBox *box = new QGroupBox(u8"汽车");
  47.     carView = new QTableView;
  48.     carView->setEditTriggers(QAbstractItemView::NoEditTriggers);
  49.     carView->setSortingEnabled(true);
  50.     carView->setSelectionBehavior(QAbstractItemView::SelectRows);
  51.     carView->setSelectionMode(QAbstractItemView::SingleSelection);
  52.     carView->setShowGrid(false);
  53.     carView->verticalHeader()->hide();
  54.     carView->setAlternatingRowColors(true);
  55.     QVBoxLayout *layout = new QVBoxLayout;
  56.     layout->addWidget(carView, 0, 0);
  57.     box->setLayout(layout);
  58.     return box;
  59. }
  60. QGroupBox* MainWindow::createDetailsGroupBox()
  61. {
  62.     QGroupBox *box = new QGroupBox(u8"详细信息");
  63.     profileLabel = new QLabel;
  64.     profileLabel->setWordWrap(true);
  65.     profileLabel->setAlignment(Qt::AlignBottom);
  66.     titleLabel = new QLabel;
  67.     titleLabel->setWordWrap(true);
  68.     titleLabel->setAlignment(Qt::AlignBottom);
  69.     attribList = new QListWidget;
  70.     QGridLayout *layout = new QGridLayout;
  71.     layout->addWidget(profileLabel, 0, 0, 1, 2);
  72.     layout->addWidget(titleLabel, 1, 0, 1, 2);
  73.     layout->addWidget(attribList, 2, 0, 1, 2);
  74.     layout->setRowStretch(2, 1);
  75.     box->setLayout(layout);
  76.     return box;
  77. }
  78. void MainWindow::createMenuBar()
  79. {
  80.     QAction *addAction = new QAction(u8"添加", this);
  81.     QAction *deleteAction = new QAction(u8"删除", this);
  82.     QAction *quitAction = new QAction(u8"退出", this);
  83.     addAction->setShortcut(tr("Ctrl+A"));
  84.     deleteAction->setShortcut(tr("Ctrl+D"));
  85.     quitAction->setShortcut(tr("Ctrl+Q"));
  86.     QMenu *fileMenu = menuBar()->addMenu(u8"操作菜单");
  87.     fileMenu->addAction(addAction);
  88.     fileMenu->addAction(deleteAction);
  89.     fileMenu->addSeparator();
  90.     fileMenu->addAction(quitAction);
  91. }
  92. MainWindow::~MainWindow()
  93. {
  94. }
复制代码
运行结果如图所示


2.连接数据库





改个名字项目结构更清楚一点

这边需要先添加最底层的GroupBox控件,数据库连接设置,再在上面添加别的


添加完控件之后需要将.ui文件天生.h文件
此处转换方法参考

  1. uic connectdlg.ui -o ui_connectdlg.h
复制代码


头文件connectdlg.h中
  1. #ifndef CONNECTDLG_H
  2. #define CONNECTDLG_H
  3. #include <QDialog>
  4. #include <QMessageBox>
  5. #include "ui_connectdlg.h"
  6. class QSqlError;
  7. class ConnDlg : public QDialog
  8. {
  9.     Q_OBJECT
  10. public:
  11.     ConnDlg(QWidget *parent = 0);
  12.     //~ConnDlg();
  13.     QString driverName() const;
  14.     QString databaseName() const;
  15.     QString userName() const;
  16.     QString password() const;
  17.     QString hostName() const;
  18.     int port() const;
  19.     QSqlError addConnection(const QString &driver, const QString &dbName, const QString &host,const QString &user, const QString &passwd, int port = -1);
  20.     void creatDB();
  21.     void addSqliteConnection();
  22. private slots:
  23.     void on_okButton_clicked();
  24.     void on_cancelButton_clicked() { reject(); }
  25.     void driverChanged(const QString &);
  26. private:
  27.    Ui::QSqlConnectionDialogUi ui;
  28. };
  29. #endif // CONNECTDLG_H
复制代码
connectdlg.cpp中
  1. #include "connectdlg.h"
  2. #include "ui_connectdlg.h"
  3. #include <QSqlDatabase>
  4. #include <QtSql>
  5. #pragma execution_character_set("UTF-8")
  6. ConnDlg::ConnDlg(QWidget *parent) :
  7.     QDialog(parent)
  8. {
  9.     ui.setupUi(this);
  10.     QStringList drivers = QSqlDatabase::drivers();                //(a)
  11.     ui.comboDriver->addItems(drivers);                                        //(b)
  12.     connect(ui.comboDriver,SIGNAL(currentIndexChanged(const QString &)),this,SLOT(driverChanged(const QString &)));        //(c)
  13.     ui.status_label->setText(u8"准备连接数据库!");                //(d)
  14. }
  15. /*
  16. ConnDlg::~ConnDlg()
  17. {
  18.     delete ui;
  19. }
  20. */
  21. void ConnDlg::driverChanged(const QString & text)
  22. {
  23.     if(text =="QSQLITE")                                                                //(a)
  24.     {
  25.         ui.editDatabase->setEnabled(false);
  26.         ui.editUsername->setEnabled(false);
  27.         ui.editPassword->setEnabled(false);
  28.         ui.editHostname->setEnabled(false);
  29.         ui.portSpinBox->setEnabled(false);
  30.     }
  31.     else
  32.     {
  33.         ui.editDatabase->setEnabled(true);
  34.         ui.editUsername->setEnabled(true);
  35.         ui.editPassword->setEnabled(true);
  36.         ui.editHostname->setEnabled(true);
  37.         ui.portSpinBox->setEnabled(true);
  38.     }
  39. }
  40. QString ConnDlg::driverName() const
  41. {
  42.       return ui.comboDriver->currentText();
  43. }
  44. QString ConnDlg::databaseName() const
  45. {
  46.      return ui.editDatabase->text();
  47. }
  48. QString ConnDlg::userName() const
  49. {
  50.      return ui.editUsername->text();
  51. }
  52. QString ConnDlg::password() const
  53. {
  54.     return ui.editPassword->text();
  55. }
  56. QString ConnDlg::hostName() const
  57. {
  58.     return ui.editHostname->text();
  59. }
  60. int ConnDlg::port() const
  61. {
  62.     return ui.portSpinBox->value();
  63. }
  64. void ConnDlg::on_okButton_clicked()
  65. {
  66.     if (ui.comboDriver->currentText().isEmpty())                //(a)
  67.     {
  68.         ui.status_label->setText(u8"请选择一个数据库驱动!");
  69.         ui.comboDriver->setFocus();
  70.     }
  71.     else if(ui.comboDriver->currentText() =="QSQLITE")        //(b)
  72.     {
  73.         addSqliteConnection();
  74.         //创建数据库表,如已存在则无须执行
  75.         creatDB();                                      //(c)
  76.         accept();
  77.         }
  78.     else
  79.     {
  80.         QSqlError err = addConnection(driverName(), databaseName(), hostName(),userName(), password(), port());                                //(d)
  81.         if (err.type() != QSqlError::NoError)           //(e)
  82.             ui.status_label->setText(err.text());
  83.         else                                                                                        //(f)
  84.             ui.status_label->setText(u8"连接数据库成功!");
  85.         //创建数据库表,如已存在则无须执行
  86.         accept();
  87.     }
  88. }
  89. QSqlError ConnDlg::addConnection(const QString &driver, const QString &dbName, const QString &host,const QString &user, const QString &passwd, int port)
  90. {
  91.     QSqlError err;
  92.     QSqlDatabase db = QSqlDatabase::addDatabase(driver);
  93.     db.setDatabaseName(dbName);
  94.     db.setHostName(host);
  95.     db.setPort(port);
  96.     if (!db.open(user, passwd))                         //(a)
  97.     {
  98.         err = db.lastError();
  99.     }
  100.     return err;                                         //返回这个错误信息
  101. }
  102. void ConnDlg::addSqliteConnection()
  103. {
  104.     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  105.     db.setDatabaseName("databasefile");
  106.     if (!db.open())
  107.     {
  108.         ui.status_label->setText(db.lastError().text());
  109.         return;
  110.     }
  111.     ui.status_label->setText(u8"创建sqlite数据库成功!");
  112. }
  113. void ConnDlg::creatDB()
  114. {
  115.     QSqlQuery query;                                    //(a)
  116.     query.exec("create table factory (id int primary key,manufactory varchar(40), address varchar(40))");                                //(b)
  117.     query.exec(QObject::tr("insert into factory values(1, '一汽大众', '长春')"));
  118.     query.exec(QObject::tr("insert into factory values(2, '二汽神龙', '武汉')"));
  119.     query.exec(QObject::tr("insert into factory values(3, '上海大众', '上海')"));
  120.     query.exec("create table cars (carid int primary key, name varchar(50), factoryid int, year int, foreign key(factoryid) references factory(id))");        //(c)
  121.     query.exec(QObject::tr("insert into cars values(1,'奥迪A6',1,2005)"));
  122.     query.exec(QObject::tr("insert into cars values(2, '捷达', 1, 1993)"));
  123.     query.exec(QObject::tr("insert into cars values(3, '宝来', 1, 2000)"));
  124.     query.exec(QObject::tr("insert into cars values(4, '毕加索',2, 1999)"));
  125.     query.exec(QObject::tr("insert into cars values(5, '富康', 2, 2004)"));
  126.     query.exec(QObject::tr("insert into cars values(6, '标致307',2, 2001)"));
  127.     query.exec(QObject::tr("insert into cars values(7, '桑塔纳',3, 1995)"));
  128.     query.exec(QObject::tr("insert into cars values(8, '帕萨特',3, 2000)"));
  129. }
复制代码

3.主/从视图应用

完整的mainwindow.h代码
代码太多了,看资源绑定吧
新建一个xml文件

留意,xml文件路径,和python一样的,向右倒的
  1. #define XML_FILE_PATH "D:/Qt_CH/CH13/CH1302/SQLEx/attribs.xml"
复制代码

当我新添加一个时,发现xml文件里面也写进去了



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表