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

目录

  • 1. 主界面布局
  • 2.连接数据库
  • 3.主/从视图应用

1. 主界面布局

先创建一个QMainwindow,不带设计界面
在这里插入图片描述

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QGroupBox>
#include <QTableView>
#include <QListWidget>
#include <QLabel>class MainWindow : public QMainWindow
{Q_OBJECTpublic://MainWindow(QWidget *parent = 0);MainWindow(QWidget *parent = 0);   //构造函数~MainWindow();
private:QGroupBox *createCarGroupBox();QGroupBox *createFactoryGroupBox();QGroupBox *createDetailsGroupBox();void createMenuBar();QTableView *carView;						//(a)QTableView *factoryView;					//(b)QListWidget *attribList;					//显示车型的详细信息列表/* 声明相关的信息标签 */QLabel *profileLabel;QLabel *titleLabel;};#endif // MAINWINDOW_H

然后再在mainwindow.cpp中

#include "mainwindow.h"
#include <QGridLayout>
#include <QAbstractItemView>
#include <QHeaderView>
#include <QAction>
#include <QMenu>
#include <QMenuBar>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);setCentralWidget(widget);createMenuBar();resize(850, 400);setWindowTitle(u8"主从视图");
}QGroupBox* MainWindow::createFactoryGroupBox()
{factoryView = new QTableView;factoryView->setEditTriggers(QAbstractItemView::NoEditTriggers);//(a)factoryView->setSortingEnabled(true);factoryView->setSelectionBehavior(QAbstractItemView::SelectRows);factoryView->setSelectionMode(QAbstractItemView::SingleSelection);factoryView->setShowGrid(false);factoryView->setAlternatingRowColors(true);QGroupBox *box = new QGroupBox(u8"汽车制造商");QGridLayout *layout = new QGridLayout;layout->addWidget(factoryView, 0, 0);box->setLayout(layout);return box;
}QGroupBox* MainWindow::createCarGroupBox()
{QGroupBox *box = new QGroupBox(u8"汽车");carView = new QTableView;carView->setEditTriggers(QAbstractItemView::NoEditTriggers);carView->setSortingEnabled(true);carView->setSelectionBehavior(QAbstractItemView::SelectRows);carView->setSelectionMode(QAbstractItemView::SingleSelection);carView->setShowGrid(false);carView->verticalHeader()->hide();carView->setAlternatingRowColors(true);QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(carView, 0, 0);box->setLayout(layout);return box;
}QGroupBox* MainWindow::createDetailsGroupBox()
{QGroupBox *box = new QGroupBox(u8"详细信息");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;
}void MainWindow::createMenuBar()
{QAction *addAction = new QAction(u8"添加", this);QAction *deleteAction = new QAction(u8"删除", this);QAction *quitAction = new QAction(u8"退出", this);addAction->setShortcut(tr("Ctrl+A"));deleteAction->setShortcut(tr("Ctrl+D"));quitAction->setShortcut(tr("Ctrl+Q"));QMenu *fileMenu = menuBar()->addMenu(u8"操作菜单");fileMenu->addAction(addAction);fileMenu->addAction(deleteAction);fileMenu->addSeparator();fileMenu->addAction(quitAction);
}MainWindow::~MainWindow()
{}

运行结果如图所示
在这里插入图片描述
在这里插入图片描述

2.连接数据库

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
改个名字项目结构更清晰一点
在这里插入图片描述
这边需要先添加最底层的GroupBox控件,数据库连接设置,再在上面添加别的
在这里插入图片描述

在这里插入图片描述
添加完控件之后需要将.ui文件生成.h文件
此处转换方法参考
在这里插入图片描述

uic connectdlg.ui -o ui_connectdlg.h

在这里插入图片描述
在这里插入图片描述
头文件connectdlg.h中

#ifndef CONNECTDLG_H
#define CONNECTDLG_H#include <QDialog>
#include <QMessageBox>
#include "ui_connectdlg.h"
class QSqlError;class ConnDlg : public QDialog
{Q_OBJECTpublic: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 creatDB();void addSqliteConnection();
private slots:void on_okButton_clicked();void on_cancelButton_clicked() { reject(); }void driverChanged(const QString &);
private:Ui::QSqlConnectionDialogUi ui;
};#endif // CONNECTDLG_H

connectdlg.cpp中

#include "connectdlg.h"
#include "ui_connectdlg.h"
#include <QSqlDatabase>
#include <QtSql>
#pragma execution_character_set("UTF-8")
ConnDlg::ConnDlg(QWidget *parent) :QDialog(parent)
{ui.setupUi(this);QStringList drivers = QSqlDatabase::drivers();		//(a)ui.comboDriver->addItems(drivers);					//(b)connect(ui.comboDriver,SIGNAL(currentIndexChanged(const QString &)),this,SLOT(driverChanged(const QString &)));	//(c)ui.status_label->setText(u8"准备连接数据库!");		//(d)
}
/*
ConnDlg::~ConnDlg()
{delete ui;
}
*/
void ConnDlg::driverChanged(const QString & text)
{if(text =="QSQLITE")								//(a){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();
}
void ConnDlg::on_okButton_clicked()
{if (ui.comboDriver->currentText().isEmpty())		//(a){ui.status_label->setText(u8"请选择一个数据库驱动!");ui.comboDriver->setFocus();}else if(ui.comboDriver->currentText() =="QSQLITE")	//(b){addSqliteConnection();//创建数据库表,如已存在则无须执行creatDB();                                      //(c)accept();}else{QSqlError err = addConnection(driverName(), databaseName(), hostName(),userName(), password(), port());				//(d)if (err.type() != QSqlError::NoError)           //(e)ui.status_label->setText(err.text());else											//(f)ui.status_label->setText(u8"连接数据库成功!");//创建数据库表,如已存在则无须执行accept();}
}
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))                         //(a){err = db.lastError();}return err;                                         //返回这个错误信息
}
void ConnDlg::addSqliteConnection()
{QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("databasefile");if (!db.open()){ui.status_label->setText(db.lastError().text());return;}ui.status_label->setText(u8"创建sqlite数据库成功!");
}
void ConnDlg::creatDB()
{QSqlQuery query;                                    //(a)query.exec("create table factory (id int primary key,manufactory varchar(40), address varchar(40))");				//(b)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("create table cars (carid int primary key, name varchar(50), factoryid int, year int, foreign key(factoryid) references factory(id))");	//(c)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)"));
}

在这里插入图片描述

3.主/从视图应用

完整的mainwindow.h代码
代码太多了,看资源绑定吧
新建一个xml文件
在这里插入图片描述
注意,xml文件路径,和python一样的,向右倒的

#define XML_FILE_PATH "D:/Qt_CH/CH13/CH1302/SQLEx/attribs.xml"

在这里插入图片描述
当我新添加一个时,发现xml文件里面也写进去了
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1555397.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙harmonyos next flutter混合开发之开发plugin(获取操作系统版本号)

创建Plugin为my_plugin flutter create --org com.example --templateplugin --platformsandroid,ios,ohos my_plugin 创建Application为my_application flutter create --org com.example my_application flutter_application引用flutter_plugin&#xff0c;在pubspec.yam…

如何解决 MySQL ERROR 1040 (08004): Too many connections ?

MySQL 是最流行的开源关系数据库管理系统之一&#xff0c;它也是开发人员中非常常用的数据库。即便它高度健壮和可伸缩性极强&#xff0c;像任何软件一样&#xff0c;它也可能出现错误。我们会经常遇到一个错误&#xff0c;特别是在高流量系统中&#xff0c;error 1040 (08004)…

51c视觉~CV~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/11668984 一、 CV确定对象的方向 介绍如何使用OpenCV确定对象的方向(即旋转角度&#xff0c;以度为单位)。 先决条件 安装Python3.7或者更高版本。可以参考下文链接&#xff1a; https://automaticaddison.com/how-to-s…

阳台山足球营地的停车位探寻

阳台山足球营地的环境是真好哈。停车场名称&#xff1a;阳台山森林公园配套停车场。应该很多爬山的人车子也停在这里。而且我没想到的&#xff0c;阳台山的山泉水还有不少居民每天提着空桶去山上装。看来环境是真的很好哈 停车场有地面和地下停车场&#xff0c;停车位个数查不…

java 数据存储方式

1. 变量存储 这是最基本的数据存储方式&#xff0c;通过声明变量来存储数据。变量可以是基本数据类型&#xff08;如int、float、char等&#xff09;&#xff0c;也可以是引用数据类型&#xff08;如对象、数组等&#xff09;。变量存储的数据通常存储在内存中&#xff0c;随着…

【记录】Excel|Excel 打印成 PDF 页数太多怎么办

【记录】Excel&#xff5c;解决 Excel 打印成 PDF 页数过多的问题 文章目录 【记录】Excel&#xff5c;解决 Excel 打印成 PDF 页数过多的问题方法一&#xff1a;调整页边距WPS OfficeMicrosoft Excel 方法二&#xff1a;优化页面布局调整列宽和行高使用“页面布局”视图合并单…

python全栈开发是什么?

全栈指掌握多种技能&#xff0c;并能利用多种技能独立完成产品。通俗的说就是与这项技能有关的都会&#xff0c;都能独立完成。 python&#xff0c;因为目前很火&#xff0c;能开发的项目很多。例如&#xff1a;web前端后端&#xff0c;自动化运维&#xff0c;软件、小型游戏开…

八大排序--01冒泡排序

假设有一组数据 arr[]{2&#xff0c;0&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;7} 方法&#xff1a;开辟两个指针&#xff0c;指向如图&#xff0c;前后两两进行比较&#xff0c;大数据向后冒泡传递&#xff0c;小数据换到前面。 一次冒泡后&#xff0c;数组中最大…

【网络篇】计算机网络——应用层详述(笔记)

目录 一、应用层协议原理 1. 进入应用层 2. 网络应用程序体系结构 &#xff08;1&#xff09;客户-服务器体系结构&#xff08;client-server architecture&#xff09; &#xff08;2&#xff09; P2P 体系结构&#xff08;P2P architecture&#xff09; 3. 进程间通讯 …

【GC日志和OOM日志分析】JVM GC日志和OOM Dump文件分析

1 缘起 充电、充电、充电。 增加一些必备的知识&#xff0c;帮助后续使用。 2 配置JVM参数 为分析GC日志以及OOM相关信息&#xff0c;配置JVM参数&#xff0c;分为三个部分&#xff1a; &#xff08;1&#xff09;堆内存&#xff0c;包括年轻代、最大堆内存&#xff1b; &a…

PELT算法

PELT算法的范畴 PELT算法&#xff08;Pruned Exact Linear Time&#xff09;属于时间序列分析和变点检测&#xff08;Change Point Detection&#xff09;范畴的算法。 从更广泛的角度来看&#xff0c;PELT算法还可以归类为以下几类算法的子集&#xff1a; 1. 时间序列分析&…

初识Linux · 文件(1)

目录 前言&#xff1a; 回顾语言层面的文件 理解文件的预备知识 文件和磁盘 使用和认识系统调用函数 前言&#xff1a; 本文以及下篇文章&#xff0c;揭露的都是Linux中文件的奥秘&#xff0c;对于文件来说&#xff0c;初学Linux第一节课接触的就是文件&#xff0c;对于C…

COMP 9517 Computer Vision week3

目录 特征表示图像特征概念(image feature)图像特征应该具备的属性 图像特征种类颜色特征颜色直方图(Color Histogram)颜色矩(Colour moments) 纹理特征(texture features)Haralick特征局部二值模式(Local Binary Patterns, LBP)尺度不变特征变换SIFT(Scale-invariant feature …

Error while loading conda entry point: conda-libmamba-solver

问题 解决方法 conda install --solverclassic conda-forge::conda-libmamba-solver conda-forge::libmamba conda-forge::libmambapy conda-forge::libarchive

如何实现事件流操作

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了通道相关的内容,本章回中将介绍StreamProvider组件.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 在Flutter中Stream是经常使用的组件,对该组件的监听可void main() {///让状态栏和程序的appBar融为一体…

zotero WebDAV同步忘记密码

https://www.jianguoyun.com/#/safety 找到应用密码

thinkphp 学习记录

1、PHP配置 &#xff08;点开链接后&#xff0c;往下拉&#xff0c;找到PHP8.2.2版本&#xff0c;下载的是ZIP格式&#xff0c;解压即用&#xff09; PHP For Windows: Binaries and sources Releases &#xff08;这里是下载地址&#xff09; 我解压的地址是&#xff1a;D:\…

Gitlab flow工作流

Gitlab flow Gitlab flow 是 Git flow 与 Github flow 的综合。它吸取了两者的优点&#xff0c;既有适应不同开发环境的弹性&#xff0c;又有单一主分支的简单和便利。它是 Gitlab.com 推荐的做法。 1 上游优先 Gitlab flow 的最大原则叫做"上游优先"&#xff08;…

【408计算机考研课程】数据结构-数据结构在学什么?

前言 数据结构在学什么&#xff1f; 如何用程序代码把现实世界的问题信息化如何用计算机高效地处理这些信息从而创造价值 第一章&#xff1a;数据结构在学什么&#xff1f; 总览 什么是数据&#xff1f; 简介&#xff1a;数据是信息的载体&#xff0c;是描述客观事物属性的数、…

el-pagination组件封装

组件使用 源代码&#xff1a; <script setup> import Pagination from /components/pagination/index.vue import {ref} from "vue";const pageNum ref(1) const pageSize ref(10) const total ref(120)function loadData() {// 加载数据 } </script>…