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

ops/2024/10/19 1:49:41/
xmlns="http://www.w3.org/2000/svg" style="display: none;">

目录

  • 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.ppmy.cn/ops/122087.html

相关文章

使用Java调用OpenAI API并解析响应:详细教程

使用Java调用OpenAI API并解析响应&#xff1a;详细教程 在现代应用程序中&#xff0c;API调用是一个非常常见的任务。本文将通过一个完整的示例&#xff0c;讲解如何使用Java调用OpenAI的ChatGPT API&#xff0c;并通过ObjectMapper处理JSON响应。本文的示例不仅适用于OpenAI…

中间件介绍

可以把中间件想象成是在应用和系统之间搭建的一座桥梁&#xff0c;或者说是一个“翻译官”和“中转站”。它处在操作系统、网络和数据库之上&#xff0c;应用软件的下层&#xff0c;负责实现应用软件之间的互联互通&#xff0c;使得应用软件能够更方便、高效地进行数据交换和通…

php语法学习

MySQL问题 如果外部mysql与内部mysql冲突&#xff0c;php连接如果已经打开mysql说明他启动的是外部的mysql8&#xff0c;单独点击服务器启动apache就不会冲突。 打开navicat 打开浏览器测试 1.单行和多行注释 2.中文乱码问题 <?php //echo "Hello World 你好&#…

RxSwift系列(二)操作符

一、变换操作符&#xff1a;buffer、map、compactMap等 1.buffer buffer方法作用是缓冲组合&#xff0c;第一个参数是缓冲时间&#xff0c;第二个参数是缓冲个数&#xff0c;第三个参数是线程。缓存 Observable 中发出的新元素&#xff0c;当元素达到某个数量&#xff0c;或者…

Linux中环境变量

基本概念 环境变量Environmental variables一般是指在操作系统中用来指定操作系统运行环境一些参数。 我们在编写C、C代码时候&#xff0c;在链接的时候从来不知道我们所链接的动态、静态库在哪里。但是还是照样可以链接成功。生成可执行程序。原因就是相关环境变量帮助编译器…

linux性能分析常用工具和方法

查看程序信息 ulimit -c unlimited #记录 core top -Hp pid #查询进程pid每个线程的CPU占比ps p [pid] -L -o pcpu,pid,tid,time,tname,stat,psr |sort -n -k1 -r #查看进程内线程CPU占用率&#xff0c;包含tid pstack [pid] #查看进程内线程调用栈&#xff0c;可用上一步查到…

单目三d重建学习笔记2024

从单目视频生成动态多物体场景 已经开源&#xff1a; https://github.com/dreamscene4d/dreamscene4d 2021年&#xff1a; 浙大团队研发NeuralRecon&#xff0c;首个基于学习的实时单目三维重建系统 https://github.com/zju3dv/NeuralRecon https://github.com/zju3dv/Neura…

鸿蒙HarmonyOS之选择相册文件(照片/视频)方法

一、新建文件工具类FileUtil.ets 包含&#xff1a;选择照片方法、获取文件类型方法、去除后缀、获取后缀方法 import { BusinessError, request } from kit.BasicServicesKit; import photoAccessHelper from ohos.file.photoAccessHelper; import bundleManager from ohos.b…