点击 <C 语言编程核心突破> 快速C语言入门
前言
要解决问题: 学习qt最核心知识, 多一个都不学.
二十三 QSqlDatabase数据库
QSqlDatabase
是 Qt 框架中关于数据库的统一封装,它支持常见的数据库软件如 MySQL、SQLite、PostgreSQL
等。
在 Qt 中,使用 QSqlDatabase
对象与各种数据库建立连接,然后通过 QSqlQuery
对象进行查询和操作。
常用的 QSqlDatabase
C++ 函数包括:
-
QSqlDatabase::addDatabase()
用于添加一个数据库连接。 -
QSqlDatabase::setDatabaseName()
设置连接的数据库名。 -
QSqlDatabase::setUserName()
设置连接的用户名。 -
QSqlDatabase::setPassword()
设置连接的密码。 -
QSqlDatabase::setHostName()
设置连接的主机名。 -
QSqlDatabase::setPort()
设置连接的端口号。 -
QSqlDatabase::open()
打开数据库连接。 -
QSqlDatabase::isOpen()
检查连接是否已经打开。 -
QSqlDatabase::close()
关闭数据库连接。 -
QSqlDatabase::exec()
执行指定的 SQL 语句。 -
QSqlDatabase::lastError()
获取最后一次发生的错误。 -
QSqlDatabase::commit()
提交当前数据库事务。 -
QSqlDatabase::rollback()
回滚当前数据库事务。 -
QSqlDatabase::transaction()
开启一个新的数据库事务。 -
QSqlDatabase::tables()
获取当前数据库中所有表的列表。 -
QSqlDatabase::record()
获取一个表的结构信息。 -
QSqlDatabase::primaryIndex()
获取一个表的主键信息。 -
QSqlDatabase::index()
获取一个表的索引信息。 -
QSqlDatabase::prepare()
预编译一个 SQL 语句。 -
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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class 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);
} // setupUi
void 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 Ui
QT_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
是一个开源的跨平台的编译系统,它可以自动生成Makefile
或Visual Studio
等IDE
所需要的工程文件。
在Qt中使用CMake
文件可以简化项目的构建过程,让开发者只需要关注自己的代码,而不需要关注具体的构建过程。
Qt的CMake
文件通常包含以下部分:
-
配置Qt模块:
CMake
文件中需要配置Qt需要使用的模块,例如QtCore
、QtGui
等。 -
定义目标:
CMake
文件中需要定义编译后的目标,例如可执行文件或库。 -
指定源文件:
CMake
文件中需要指定源文件的位置,以便CMake
可以将它们编译成目标文件。 -
配置编译选项:
CMake
文件中需要配置编译选项,例如编译标志、链接选项等。 -
安装目标:
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_SOURCES
main.cpp
Widget.cpp
Widget.h
Widget.ui
${TS_FILES}
)
# Qt6和Qt5的构建方式有所不同,需要分别处理
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
# 使用qt_add_executable创建可执行文件
qt_add_executable(Learn_22
MANUAL_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 PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
# 安装可执行文件
install(TARGETS Learn_22
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
# 完成Qt6可执行文件的构建和安装
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(Learn_22)
endif()
总结
二十三 QSqlDatabase数据库
二十四 cmake工程管理文件
点击 <C 语言编程核心突破> 快速C语言入门