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.rhkb.cn/news/440353.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索Python文本处理的新境界:textwrap库揭秘

文章目录 **探索Python文本处理的新境界&#xff1a;textwrap库揭秘**一、背景介绍二、textwrap库是什么&#xff1f;三、如何安装textwrap库&#xff1f;四、简单函数使用方法4.1 wrap()4.2 fill()4.3 shorten()4.4 dedent()4.5 indent() 五、实际应用场景5.1 格式化日志输出5…

Study-Oracle-11-ORALCE19C-ADG集群搭建

一、ORACLE--ADG VS ORACLE--DG的区别 1、DG是Oracle数据库的一种灾难恢复和数据保护解决方案&#xff0c;它通过在主数据库和一个或多个备用数据库之间实时复制数据&#xff0c;提供了数据的冗余备份和故障切换功能。它的主要作用是灾难恢复&#xff0c;可以在主数据库发生故…

Html批量转word工具2.1

2024年10月7日记录&#xff1a; 有客户反馈&#xff0c;2.0刚运行就提示转换完成 有问题就解决。正好国庆假期这几天有空&#xff0c;2.1版就出炉了。 2.1 更新记录&#xff1a; 修复了1个bug&#xff1a;刚运行就提示转换完成 下载地址&#xff1a;Html 转 word 批量处理工具…

基于SpringBoot vue3 的山西文旅网java网页设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆…

curses函数库简介及使用

curses函数库简介及使用 导语curses简介屏幕输出读取清除移动字符 键盘键盘模式输入 窗口WINDOW常用函数屏幕刷新优化 子窗口keypad彩色显示pad总结参考文献 导语 curses函数库主要用来实现对屏幕和光标的操作&#xff0c;它的功能定位处于简单文本行程序和完全图形化界面之间…

Prompt 模版解析:诗人角色的创意引导与实践

Prompt 模版解析&#xff1a;诗人角色的创意引导与实践 Prompt 模版作为一种结构化工具&#xff0c;旨在为特定角色——本例中的“诗人”——提供明确的指导和框架。这一模版详尽地描绘了诗人的职责、擅长的诗歌形式以及创作规则&#xff0c;使其能在自动化系统中更加精确地执…

[C#]C# winform部署yolov11-pose姿态估计onnx模型

【算法介绍】 在C# WinForms应用中部署YOLOv11-Pose姿态估计ONNX模型是一项具有挑战性的任务。YOLOv11-Pose结合了YOLO&#xff08;You Only Look Once&#xff09;的高效物体检测算法和Pose Estimation&#xff08;姿态估计&#xff09;专注于识别人体关键点的能力&#xff0…

【Nacos架构 原理】内核设计之Nacos寻址机制

文章目录 前提设计内部实现单机寻址文件寻址地址服务器寻址 前提 对于集群模式&#xff0c;集群内的每个Nacos成员都需要相互通信。因此这就带来一个问题&#xff0c;该以何种方式去管理集群内部的Nacos成员节点信息&#xff0c;即Nacos内部的寻址机制。 设计 要能够感知到节…

LeetCode讲解篇之695. 岛屿的最大面积

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历二维矩阵&#xff0c;如果当前格子的元素为1进行深度优先搜索&#xff0c;将搜索过的格子置为0&#xff0c;防止重复访问&#xff0c;然后对继续深度优先搜索上下左右中为1的格子 题解代码 func maxAr…

Redis实现每日签到(大数据量)

PHP语言使用Redis NoSQL服务器二进制数据类型实现大数据情况下签到功能 目录 问题 解决方式 封装签到类 功能调用 总结 问题 实现用户每日签到功能不难&#xff0c;但随着用户量上升之后&#xff0c;不论是存储还是判断对数据量来说都很麻烦&#xff1b;假如每天有100万用…

探索Spring Boot:实现“衣依”服装电商平台

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

通过 LLMs 自动探索量化投资策略

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a; 本文提出了一个利用大型语言模型&#xff08;LLMs&#xff09;和多代理架构的新框架&#xff0c;用于量化股票投资和投资组合管理。该框架通过整合LLMs生成多样化的al…

【Unity】unity安卓打包参数(个人复习向/有不足之处欢迎指出/侵删)

1.Texture Compression 纹理压缩 设置发布后的纹理压缩格式 Use Player Settings:使用在播放器设置中设置的纹理压缩格式 ETC&#xff1a;使用ETC格式&#xff08;兼容&#xff09; ETC2&#xff1a;使用ETC2格式&#xff08;很多设备不支持&#xff09; ASTC&#xff1a;使用…

TypeScript:装饰器

一、简介 随着TypeScript和ES6里引入了类&#xff0c;在一些场景下我们需要额外的特性来支持标注或修改类及其成员。 装饰器&#xff08;Decorators&#xff09;为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式。 Javascript里的装饰器目前处在 建议征集的第二阶…

Hadoop大数据入门——Hive-SQL语法大全

Hive SQL 语法大全 基于语法描述说明 CREATE DATABASE [IF NOT EXISTS] db_name [LOCATION] path; SELECT expr, ... FROM tbl ORDER BY col_name [ASC | DESC] (A | B | C)如上语法&#xff0c;在语法描述中出现&#xff1a; []&#xff0c;表示可选&#xff0c;如上[LOCATI…

大模型项目如何判断用RAG还是微调

大模型项目如何判断用RAG还是微调 在大模型项目中&#xff0c;选择使用检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;还是微调&#xff08;Fine-Tuning&#xff09;取决于多个因素&#xff0c;包括项目的具体需求、数据的可用性、性能要求、成本和…

浅谈汽车智能座舱如何实现多通道音频

一、引言 随着汽车智能座舱的功能迭代发展&#xff0c;传统的 4 通道、6 通道、8 通道等音响系统难以在满足驾驶场景的需求&#xff0c;未来对于智能座舱音频质量和通道数会越来越高。接下来本文将浅析目前智能座舱如何实现音频功放&#xff0c;以及如何实现多路音频功放方案。…

CSS基础-常见属性(二)

6、CSS三大特性 6.1 层叠性 如果样式发生冲突&#xff0c;则按照优先级进行覆盖。 6.2 继承性 元素自动继承其父元素、祖先元素所设置的某些元素&#xff0c;优先继承较近的元素。 6.3 优先级 6.3.1 简单分级 1、内联样式2、ID选择器3、类选择器/属性选择器4、标签名选择器/…

环境对于写作有何影响?

如果你是有灵性、热爱文学创作的人&#xff0c;多半就会喜欢安静的生活环境。因为你会感受到唯有在这样的环境里更才能够沉下心来思考创作的路径。而且此时的你&#xff0c;显得头脑清醒、思维活跃而自由&#xff0c;因之文思泉涌。 网络图&#xff1a;宁静的书房 反之&#x…

【数据结构】什么是平衡二叉搜索树(AVL Tree)?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;AVL树的概念 &#x1f4cc;AVL树的操作 &#x1f38f;AVL树的插入操作 ↩️右单旋 ↩️↪️右左双旋 ↪️↩️左右双旋 ↪️左单旋 &#x1f38f;AVL树的删…