2023-12-05 Qt学习总结8


点击 <C 语言编程核心突破> 快速C语言入门


Qt学习总结

  • 前言
  • 二十三 QSqlDatabase数据库
  • 二十四 cmake工程管理文件
  • 总结


前言

要解决问题: 学习qt最核心知识, 多一个都不学.


二十三 QSqlDatabase数据库

QSqlDatabase 是 Qt 框架中关于数据库的统一封装,它支持常见的数据库软件如 MySQL、SQLite、PostgreSQL 等。

在 Qt 中,使用 QSqlDatabase 对象与各种数据库建立连接,然后通过 QSqlQuery 对象进行查询和操作。

常用的 QSqlDatabase C++ 函数包括:

  1. QSqlDatabase::addDatabase() 用于添加一个数据库连接。

  2. QSqlDatabase::setDatabaseName() 设置连接的数据库名。

  3. QSqlDatabase::setUserName() 设置连接的用户名。

  4. QSqlDatabase::setPassword() 设置连接的密码。

  5. QSqlDatabase::setHostName() 设置连接的主机名。

  6. QSqlDatabase::setPort() 设置连接的端口号。

  7. QSqlDatabase::open() 打开数据库连接。

  8. QSqlDatabase::isOpen() 检查连接是否已经打开。

  9. QSqlDatabase::close() 关闭数据库连接。

  10. QSqlDatabase::exec() 执行指定的 SQL 语句。

  11. QSqlDatabase::lastError() 获取最后一次发生的错误。

  12. QSqlDatabase::commit() 提交当前数据库事务。

  13. QSqlDatabase::rollback() 回滚当前数据库事务。

  14. QSqlDatabase::transaction() 开启一个新的数据库事务。

  15. QSqlDatabase::tables() 获取当前数据库中所有表的列表。

  16. QSqlDatabase::record() 获取一个表的结构信息。

  17. QSqlDatabase::primaryIndex() 获取一个表的主键信息。

  18. QSqlDatabase::index() 获取一个表的索引信息。

  19. QSqlDatabase::prepare() 预编译一个 SQL 语句。

  20. QSqlDatabase::bindValue() 绑定一个值到预编译的 SQL 语句中。

这些函数都可以帮助我们完成在数据库中进行增删改查等操作。

示例:

使用数据库实现一个输入和查询界面:

第一步, 连接一个数据库, 数据库中是学生信息, 如学号, 姓名, 生日.

CREATE TABLE student(id integer UNSIGNED PRIMARY KEY,name varchar(16) NOT NULL,birth date
);

如果数据库连接成功,
在这里插入图片描述
开启一个界面, 如查询学生信息, 可按学号, 姓名, 生日查询
在这里插入图片描述
通过学号查询
在这里插入图片描述
添加学生信息:

在这里插入图片描述

在这里插入图片描述
查询全部:

在这里插入图片描述
源代码:
Widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui
{
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_addButton_clicked();void on_idButton_clicked();void on_nameButton_clicked();void on_birthdayButton_clicked();private:Ui::Widget *ui;QSqlDatabase qdb;QSqlQuery query;
};
#endif // WIDGET_H

main.cpp

#include "Widget.h"#include <QApplication>
#include <QLocale>
#include <QTranslator>int main(int argc, char *argv[])
{QApplication a(argc, argv);QTranslator translator;const QStringList uiLanguages = QLocale::system().uiLanguages();for (const QString &locale : uiLanguages) {const QString baseName = "Learn_22_" + QLocale(locale).name();if (translator.load(":/i18n/" + baseName)) {a.installTranslator(&translator);break;}}Widget w;w.show();return a.exec();
}

Widget.h

#include "Widget.h"
#include "./ui_Widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);qdb = QSqlDatabase::addDatabase("QSQLITE");qdb.setDatabaseName("E:\\clangC++\\mydatabase.db");qdb.setHostName("localhost");qdb.setUserName("root");qdb.setPassword("root");if (!qdb.open()){QMessageBox::information(this, "提示", "链接失败");}else{QMessageBox::information(this, "提示", "链接成功");query = QSqlQuery(qdb);}
}Widget::~Widget()
{delete ui;
}void Widget::on_addButton_clicked()
{QString sql = QString("INSERT INTO student VALUES (%1, '%2', '%3');").arg(ui->addIdLineEdit->text()).arg(ui->addNameLineEdit->text()).arg(ui->addBirthdayLineEdit->text());if (query.exec(sql)){QMessageBox::information(this, "提示", "插入成功");}else{QMessageBox::information(this, "提示", "插入失败");}
}void Widget::on_idButton_clicked()
{QString sql = QString("SELECT * FROM student WHERE id LIKE %1;").arg(ui->idLineEdit->text());QString result;if (query.exec(sql)){while (query.next()){result.append(query.value(0).toString());result += "\t|\t";result.append(query.value(1).toString());result += "\t|\t";result.append(query.value(2).toString());result += "\n";}ui->resultTextEdit->setText(result);}else{QMessageBox::information(this, "提示", "查询失败");}
}void Widget::on_nameButton_clicked()
{QString sql = QString("SELECT * FROM student WHERE name LIKE %1;").arg(ui->idLineEdit->text());QString result;if (query.exec(sql)){while (query.next()){result.append(query.value(0).toString());result += "\t|\t";result.append(query.value(1).toString());result += "\t|\t";result.append(query.value(2).toString());result += "\n";}ui->resultTextEdit->setText(result);}else{QMessageBox::information(this, "提示", "查询失败");}
}void Widget::on_birthdayButton_clicked()
{QString sql = QString("SELECT * FROM student WHERE birthday LIKE %1;").arg(ui->idLineEdit->text());QString result;if (query.exec(sql)){while (query.next()){result.append(query.value(0).toString());result += "\t|\t";result.append(query.value(1).toString());result += "\t|\t";result.append(query.value(2).toString());result += "\n";}ui->resultTextEdit->setText(result);}else{QMessageBox::information(this, "提示", "查询失败");}
}

ui_Widget.h

/********************************************************************************
** Form generated from reading UI file 'Widget.ui'
**
** Created by: Qt User Interface Compiler version 6.5.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/#ifndef UI_WIDGET_H
#define UI_WIDGET_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_Widget
{
public:QLabel *label;QTextEdit *resultTextEdit;QLabel *label_2;QPushButton *addButton;QWidget *widget;QHBoxLayout *horizontalLayout;QPushButton *idButton;QLineEdit *idLineEdit;QPushButton *nameButton;QLineEdit *nameLineEdit;QPushButton *birthdayButton;QLineEdit *birthdayLineEdit;QWidget *widget1;QHBoxLayout *horizontalLayout_2;QLabel *label_3;QLineEdit *addIdLineEdit;QLabel *label_4;QLineEdit *addNameLineEdit;QLabel *label_5;QLineEdit *addBirthdayLineEdit;void setupUi(QWidget *Widget){if (Widget->objectName().isEmpty())Widget->setObjectName("Widget");Widget->resize(741, 407);label = new QLabel(Widget);label->setObjectName("label");label->setGeometry(QRect(280, 10, 151, 31));label->setStyleSheet(QString::fromUtf8("font: 700 18pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));resultTextEdit = new QTextEdit(Widget);resultTextEdit->setObjectName("resultTextEdit");resultTextEdit->setGeometry(QRect(10, 110, 721, 111));resultTextEdit->setStyleSheet(QString::fromUtf8("font: 700 14pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));label_2 = new QLabel(Widget);label_2->setObjectName("label_2");label_2->setGeometry(QRect(290, 240, 151, 31));label_2->setStyleSheet(QString::fromUtf8("font: 700 18pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));addButton = new QPushButton(Widget);addButton->setObjectName("addButton");addButton->setGeometry(QRect(320, 360, 75, 37));addButton->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));widget = new QWidget(Widget);widget->setObjectName("widget");widget->setGeometry(QRect(10, 50, 721, 39));horizontalLayout = new QHBoxLayout(widget);horizontalLayout->setObjectName("horizontalLayout");horizontalLayout->setContentsMargins(0, 0, 0, 0);idButton = new QPushButton(widget);idButton->setObjectName("idButton");idButton->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout->addWidget(idButton);idLineEdit = new QLineEdit(widget);idLineEdit->setObjectName("idLineEdit");idLineEdit->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout->addWidget(idLineEdit);nameButton = new QPushButton(widget);nameButton->setObjectName("nameButton");nameButton->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout->addWidget(nameButton);nameLineEdit = new QLineEdit(widget);nameLineEdit->setObjectName("nameLineEdit");nameLineEdit->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout->addWidget(nameLineEdit);birthdayButton = new QPushButton(widget);birthdayButton->setObjectName("birthdayButton");birthdayButton->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout->addWidget(birthdayButton);birthdayLineEdit = new QLineEdit(widget);birthdayLineEdit->setObjectName("birthdayLineEdit");birthdayLineEdit->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout->addWidget(birthdayLineEdit);widget1 = new QWidget(Widget);widget1->setObjectName("widget1");widget1->setGeometry(QRect(10, 290, 721, 37));horizontalLayout_2 = new QHBoxLayout(widget1);horizontalLayout_2->setObjectName("horizontalLayout_2");horizontalLayout_2->setContentsMargins(0, 0, 0, 0);label_3 = new QLabel(widget1);label_3->setObjectName("label_3");label_3->setStyleSheet(QString::fromUtf8("font: 700 18pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout_2->addWidget(label_3);addIdLineEdit = new QLineEdit(widget1);addIdLineEdit->setObjectName("addIdLineEdit");addIdLineEdit->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout_2->addWidget(addIdLineEdit);label_4 = new QLabel(widget1);label_4->setObjectName("label_4");label_4->setStyleSheet(QString::fromUtf8("font: 700 18pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout_2->addWidget(label_4);addNameLineEdit = new QLineEdit(widget1);addNameLineEdit->setObjectName("addNameLineEdit");addNameLineEdit->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout_2->addWidget(addNameLineEdit);label_5 = new QLabel(widget1);label_5->setObjectName("label_5");label_5->setStyleSheet(QString::fromUtf8("font: 700 18pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout_2->addWidget(label_5);addBirthdayLineEdit = new QLineEdit(widget1);addBirthdayLineEdit->setObjectName("addBirthdayLineEdit");addBirthdayLineEdit->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout_2->addWidget(addBirthdayLineEdit);retranslateUi(Widget);QMetaObject::connectSlotsByName(Widget);} // setupUivoid retranslateUi(QWidget *Widget){Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));label->setText(QCoreApplication::translate("Widget", "\346\237\245\350\257\242\345\255\246\347\224\237\344\277\241\346\201\257", nullptr));label_2->setText(QCoreApplication::translate("Widget", "\346\267\273\345\212\240\345\255\246\347\224\237\344\277\241\346\201\257", nullptr));addButton->setText(QCoreApplication::translate("Widget", "\346\267\273\345\212\240", nullptr));idButton->setText(QCoreApplication::translate("Widget", "\346\214\211\345\255\246\345\217\267", nullptr));nameButton->setText(QCoreApplication::translate("Widget", "\346\214\211\345\247\223\345\220\215", nullptr));birthdayButton->setText(QCoreApplication::translate("Widget", "\346\214\211\347\224\237\346\227\245", nullptr));label_3->setText(QCoreApplication::translate("Widget", "\345\255\246\345\217\267", nullptr));label_4->setText(QCoreApplication::translate("Widget", "\345\247\223\345\220\215", nullptr));label_5->setText(QCoreApplication::translate("Widget", "\347\224\237\346\227\245", nullptr));} // retranslateUi};namespace Ui {class Widget: public Ui_Widget {};
} // namespace UiQT_END_NAMESPACE#endif // UI_WIDGET_H

注意, 默认的Cmake工程文件没有sql相关的资源, 需要自己添加:

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Sql)
target_link_libraries(Learn_22 PRIVATE Qt${QT_VERSION_MAJOR}::Sql)

二十四 cmake工程管理文件

CMake是一个开源的跨平台的编译系统,它可以自动生成MakefileVisual StudioIDE所需要的工程文件。

在Qt中使用CMake文件可以简化项目的构建过程,让开发者只需要关注自己的代码,而不需要关注具体的构建过程。

Qt的CMake文件通常包含以下部分:

  1. 配置Qt模块:CMake文件中需要配置Qt需要使用的模块,例如QtCoreQtGui等。

  2. 定义目标:CMake文件中需要定义编译后的目标,例如可执行文件或库。

  3. 指定源文件:CMake文件中需要指定源文件的位置,以便CMake可以将它们编译成目标文件。

  4. 配置编译选项:CMake文件中需要配置编译选项,例如编译标志、链接选项等。

  5. 安装目标:CMake文件中需要指定安装目标,例如可执行文件、库文件等。这样可以让开发者将编译好的程序方便地部署到其他机器上。

总的来说,Qt中的CMake文件与其他应用程序的CMake文件相似,但需要特别配置Qt的模块和库。

通过使用CMake文件,开发者可以简化Qt项目的构建过程,从而更加专注于代码编写。

默认的cmake工程文件:

# 设置cmake最小版本
cmake_minimum_required(VERSION 3.5)# 设置项目名称和版本号
project(Learn_22 VERSION 0.1 LANGUAGES CXX)# 开启Qt自动化
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 查找Qt库
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets LinguistTools)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets LinguistTools)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Sql)# 设置翻译文件
set(TS_FILES Learn_22.ts)# 设置项目源文件
set(PROJECT_SOURCESmain.cppWidget.cppWidget.hWidget.ui${TS_FILES}
)# Qt6和Qt5的构建方式有所不同,需要分别处理
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)# 使用qt_add_executable创建可执行文件qt_add_executable(Learn_22MANUAL_FINALIZATION${PROJECT_SOURCES})# 使用qt_create_translation创建翻译文件qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
else()# 使用add_executable创建可执行文件if(ANDROID)add_library(Learn_22 SHARED${PROJECT_SOURCES})else()add_executable(Learn_22${PROJECT_SOURCES})endif()# 使用qt5_create_translation创建翻译文件qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
endif()# 链接Qt库
target_link_libraries(Learn_22 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
target_link_libraries(Learn_22 PRIVATE Qt${QT_VERSION_MAJOR}::Sql)# 设置可执行文件的属性
set_target_properties(Learn_22 PROPERTIESMACOSX_BUNDLE_GUI_IDENTIFIER my.example.comMACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}MACOSX_BUNDLE TRUEWIN32_EXECUTABLE TRUE
)# 安装可执行文件
install(TARGETS Learn_22BUNDLE DESTINATION .LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})# 完成Qt6可执行文件的构建和安装
if(QT_VERSION_MAJOR EQUAL 6)qt_finalize_executable(Learn_22)
endif()

总结

二十三 QSqlDatabase数据库
二十四 cmake工程管理文件


点击 <C 语言编程核心突破> 快速C语言入门


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

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

相关文章

Kubernetes(K8s 1.27.x) 快速上手+实践,无废话纯享版(视频笔记)

视频源&#xff1a;1.03-k8s是什么&#xff1f;_哔哩哔哩_bilibili 1 基础知识 1.1 K8s 有用么&#xff1f; K8s有没有用 K8s要不要学&#xff1f; 参考资料: https://www.infoq.com/articles/devops-and-cloud-trends-2022/?itm_sourcearticles_about_InfoQ-trends-report…

PyQt下使用OpenCV实现人脸检测与识别

背景&#xff1a; 一 数字图像处理与识别警务应用模型 基于前期所学知识&#xff0c;与公安实践相结合&#xff0c;综合设计数字图像处理与识别警务应用模型,从下列4个研究课题中选择2个进行实验实现&#xff1a;图像增强与复原、人脸检测与识别、虹膜内外圆检测与分割、车牌…

Javascript-面向对象与原型

1. 编程思想 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个调用面向对象是把食物分解成一个一个对象&#xff0c;然后由对象之间分工合作 面向对象编程 1.1 面向对象与面向过程对比 2. 构造函数 3. …

想学编程,但不知道从哪里学起,应该怎么办?

怎样学习任何一种编程语言 我将教你怎样学习任何一种你将来可能要学习的编程语言。本书的章节是基于我和很多程序员学习编程的经历组织的&#xff0c;下面是我通常遵循的流程。 1&#xff0e;找到关于这种编程语言的书或介绍性读物。 2&#xff0e;通读这本书&#xff0c;把…

基于以太坊的智能合约开发Solidity(事件日志篇)

//声明版本号&#xff08;程序中的版本号要和编译器版本号一致&#xff09; pragma solidity ^0.5.17; //合约 contract EventTest {//状态变量uint public Variable;//构造函数constructor() public{Variable 100;}event ValueChanged(uint newValue); //事件声明event Log(…

java--Date、SimpleDateFormat时间类,JDK8之前的

1.Date 代表的是日期和时间 2.SimpleDateFormat 代表简单日期格式化&#xff0c;可以用来把日期对象、时间毫秒值格式化成我们想要的形式。 3.时间格式常见符号 4.SimpleDateFormat解析字符串时间成为日期对象

Matlab数学建模算法之小波神经网络详解

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

NR Channel raster和Sync raster

NR中&#xff0c;由于信道带宽可能非常大&#xff0c;如果UE按照channel Raster进行同步信号搜索&#xff0c;需要的时间很长&#xff0c;且非常耗电&#xff1b;因而NR引入了Synchronization raster的概念&#xff0c;同步信号按照Sync Raster放置。 ARFCN 频点号对应Channel…

打造Github首页的动态飞线效果

一、导语 Github首页的地球动态飞线&#xff0c;大家都比较熟悉吧 二、分析 由大量随机的3点构造出贝塞尔曲线&#xff0c;然后开始从起点到终点的飞行后&#xff0c;然后再从起点到终点的消失&#xff0c;就此完成整个过程 三、基础代码 createCurve(startPoint, endPoint…

Java 8 新特性深度解析:探索 Lambda 表达式、Stream API 和函数式编程的革新之路

Java8 新特性 Java 8 的革新之路 自 1995 年首次发布以来&#xff0c;Java 已经成为世界上最广泛使用的编程语言之一。随着时间的推移&#xff0c;Java 经历了多次版本更新&#xff0c;其中最具里程碑意义的便是 Java 8 的发布。这个版本引入了许多重大变革&#xff0c;包括 …

LabelImg的使用及注意事项

LabelImg是一款开源的图像标注工具&#xff0c;它主要用于标注目标检测、语义分割和图像分类等深度学习中需要的数据集。通过使用LabelImg&#xff0c;用户可以快速、准确地为图片中的目标添加标注信息&#xff0c;从而建立数据集。 使用步骤&#xff1a; 下载LabelImg&#x…

GPIO的使用--USART串口通信--传感器控制数据

目录 一、串口通信 1、概念 2、原理图 3、使用步骤 &#xff08;1&#xff09;寻找串口位置 &#xff08;2&#xff09;确定引脚编号 &#xff08;3&#xff09;编写代码 4、实验结果 实验代码 main.c usart.c usart.h 一、串口通信 1、概念 串行接口是一种可以将…