Qt 基础知识概述

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示例:

  1. 打开Qt Designer并创建一个新的.ui文件
  2. 在工具箱中选择一个QPushButton并将其拖动到界面中
  3. 右键单击按钮并选择"Change text",将按钮的文本设置为"Click me!"
  4. 保存.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倍之和。

猜你喜欢

转载自blog.csdn.net/qq_33867131/article/details/129118098