Qt 需要掌握的知识点:
1、Qt是一个用C++编写的、跨平台的GUI工具包,它不仅提供了图形界面库,还提供了容器、输入输出、数据库、多线程、网络等功能模块;
2、学习Qt的基本架构和核心类,比如QObject、QWidget、QApplication等。你需要掌握Qt中信号与槽(signal and slot)机制,它是一种对象间通信方式,可以让不同对象之间相互发送消息;
3、学习使用Qt Designer来设计图形界面,它是一个可视化的界面编辑器,可以让你拖放控件来创建界面布局,你也需要学习如何使用.ui文件来保存界面设计,并在代码中加载和显示;
4、学习使用各种常用的控件(widget)和布局(layout),比如按钮(QPushButton)、标签(QLabel)、文本框(QLineEdit)、列表框(QListWidget)、表格视图(QTableView)等。你需要了解每个控件的属性、方法和信号,并学会如何设置样式表(stylesheet)来美化界面;
5、学习使用各种高级功能模块,比如数据库模块(QSqlDatabase)、网络模块(QTcpSocket)、多线程模块(QThread)、3D场景模块(Qt Quick 3D)等。这些模块可以让你开发更复杂和强大的应用程序;
1、Qt 概述:
Qt是一个用C++编写的、跨平台的GUI工具包
(1)windoes 平台 Qt 的下载与安装:
Qt 5.15之前的版本可以离线安装,直接下载离线安装包即可:
下载地址:https://download.qt.io/archive/qt/
Qt从5.15开始,不再支持离线安装,那我们就需要下载 Qt 在线安装器,安装Qt:
Qt 在线安装器下载地址:https://download.qt.io/official_releases/online_installers/
2、基本语法
Qt的基本语法和C++非常相似,包括变量、函数、类、结构体等等。在Qt类库中的每个类都是从QObject派生出来的,因此每个Qt应用程序都必须包含一个QObject子类。
下面是一个基本的Qt程序示例:
#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel label("Hello, Qt!");
label.show();
return app.exec();
}
这个程序创建了一个QApplication对象,用于管理应用程序的事件循环,然后创建一个QLabel对象,并将其显示在屏幕上。最后,调用QApplication的exec()函数启动事件循环,等待用户的输入事件。
3、信号和槽
Qt的信号和槽是其最重要的特性之一,它使得Qt可以轻松地实现事件驱动的应用程序。信号是一种特殊的函数,用于在对象之间传递信息,而槽是一种特殊的函数,用于接收信号并执行相应的操作。
下面是一个简单的信号和槽示例:
#include <QObject>
#include <QPushButton>
class MyButton : public QPushButton
{
Q_OBJECT
public:
MyButton(QWidget *parent = nullptr) : QPushButton(parent)
{
connect(this, &MyButton::clicked, this, &MyButton::onClicked);
}
private slots:
void onClicked()
{
setText("Clicked!");
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyButton button;
button.setText("Click me!");
button.show();
return app.exec();
}
这个程序创建了一个自定义的QPushButton子类MyButton,并在构造函数中连接了clicked()信号和onClicked()槽。当用户单击按钮时,clicked()信号被触发,然后onClicked()槽被调用,将按钮的文本设置为"Clicked!"。
4、图形界面设计
Qt提供了一种称为Qt Designer的可视化工具,用于设计Qt应用程序的图形界面。可以使用Qt Designer创建一个.ui文件,其中包含应用程序的界面元素,例如按钮、文本框、标签等等。然后,可以使用Qt的uic工具将.ui文件转换为C++代码,用于在应用程序中创建这些界面元素。
下面是一个简单的Qt Designer示例:
- 打开Qt Designer并创建一个新的.ui文件
- 在工具箱中选择一个QPushButton并将其拖动到界面中
- 右键单击按钮并选择"Change text",将按钮的文本设置为"Click me!"
- 保存.ui文件并退出Qt Designer
接下来,可以使用uic工具将.ui文件转换为C++代码。可以在终端中运行以下命令:
uic -o mainwindow.h mainwindow.ui
这将生成一个名为mainwindow.h的文件,其中包含创建界面元素的C++代码。可以在应用程序中包含mainwindow.h文件,并将其中的QMainWindow对象添加到应用程序中。
5、数据库访问
Qt提供了一组用于访问数据库的类,称为Qt SQL模块。可以使用这些类来连接和操作各种类型的数据库,如MySQL、SQLite、Oracle等等。
下面是一个简单的MySQL数据库访问示例:
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
int main(int argc, char *argv[])
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("test");
db.setUserName("root");
db.setPassword("");
if (!db.open()) {
qDebug() << "Failed to connect to database.";
return -1;
}
QSqlQuery query;
query.exec("SELECT * FROM users");
while (query.next()) {
int id = query.value(0).toInt();
QString name = query.value(1).toString();
qDebug() << "ID:" << id << "Name:" << name;
}
db.close();
return 0;
}
这个程序连接到一个名为"test"的MySQL数据库,然后执行一个SELECT语句从"users"表中检索数据。使用QSqlQuery对象执行SQL查询,并使用QSqlRecord对象检索每个结果行的列值。最后,在终端中输出每个用户的ID和名称。
6、文件操作
Qt提供了一组用于文件和目录操作的类,称为Qt Core模块。可以使用这些类来读取和写入文件、操作目录和文件路径等等。
下面是一个简单的文件读取和写入示例:
#include <QFile>
#include <QTextStream>
#include <QDebug>
int main(int argc, char *argv[])
{
QFile file("test.txt");
if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) {
qDebug() << "Failed to open file.";
return -1;
}
QTextStream in(&file);
QString line = in.readLine();
qDebug() << "First line:" << line;
QTextStream out(&file);
out << "New line added.";
file.close();
return 0;
}
这个程序打开一个名为"test.txt"的文件,并使用QTextStream对象读取第一行。然后,使用相同的QTextStream对象将一行新文本写入文件。最后,关闭文件。
7、网络通信
Qt提供了一组用于网络通信的类,称为Qt Network模块。可以使用这些类来创建和管理网络连接、发送和接收数据等等。
下面是一个简单的TCP客户端示例:
#include <QTcpSocket>
#include <QDebug>
int main(int argc, char *argv[])
{
QTcpSocket socket;
socket.connectToHost("localhost", 1234);
if (!socket.waitForConnected()) {
qDebug() << "Failed to connect to server.";
return -1;
}
socket.write("Hello, server!");
socket.waitForBytesWritten();
socket.waitForReadyRead();
qDebug() << "Server replied:" << socket.readAll();
socket.close();
return 0;
}
这个程序通过创建一个QTcpSocket对象来创建一个TCP客户端。然后,使用connectToHost()函数连接到名为"localhost"的服务器的1234端口。如果连接失败,则在终端中输出错误消息并退出。
一旦连接成功,使用write()函数向服务器发送一条消息,并使用waitForBytesWritten()函数等待该消息写入套接字。接下来,使用waitForReadyRead()函数等待服务器的响应,并使用readAll()函数读取所有数据。最后,关闭套接字并退出程序。
8、多线程编程
Qt提供了一组用于多线程编程的类,称为Qt Concurrent模块。可以使用这些类来并行执行计算密集型任务,并在主线程中更新用户界面。
下面是一个简单的并行计算示例:
#include <QtConcurrent>
#include <QVector>
#include <QDebug>
int main(int argc, char *argv[])
{
QVector<int> nums(1000000);
for (int i = 0; i < nums.size(); i++) {
nums[i] = i + 1;
}
int sum = QtConcurrent::blockingMappedReduced(nums, [](int num) {
returnnum * 2;
}, [](int acc, int val) {
return acc + val;
});
qDebug() << "Sum of all numbers multiplied by 2:" << sum;
return 0;
}
```
这个程序创建一个包含1000000个整数的向量,并使用QtConcurrent::blockingMappedReduced()函数并行计算向量中所有元素的2倍之和。使用lambda表达式将每个元素乘以2,并使用另一个lambda表达式将所有结果加起来。
最后,在终端中输出所有数字的2倍之和。