Qt, Hello World

lxf2023-04-12 21:28:01

前言

Qt是一款跨平台的C++应用程序框架,它提供了一组丰富的库和工具,可用于创建各种类型的应用程序,包括桌面应用程序、移动应用程序、嵌入式应用程序等等。Qt 6是目前Qt的最新版本,提供了许多新功能和改进,如支持C++17、模块化设计、改进的QML引擎等等。在本教程中,我们将讨论如何下载安装Qt 6,并编写一个简单的Hello World程序。

下载

首先,我们需要从Qt官网下载Qt 6的安装程序。打开Qt官网 www.qt.io,选择"Download",然后找到并点击"Go open source"按钮。 进入另一个介绍页面,找到"Online Installer",开始下载。下载完成后,双击安装程序,然后按照安装向导中的说明进行操作。

安装完成后,启动Qt Creator IDE,这是一个集成开发环境,可用于编写、构建和调试Qt应用程序。

创建一个新的Qt项目

在Qt Creator中,点击 "Create Project"按钮,又或者选择"File" -> "New Project",然后选择"Application" -> "Qt Widgets Application"。 我们就把项目取名为ByteRabbit,之后选择项目文件存放路径,选择桌面应用。一步一步走下来,就得了一个带有只有一个页面的空项目。

其中有一步是选择编译构建工具,CMake和QMake两个选项,CMake和QMake都是用于构建和管理Qt项目的工具。它们的主要区别在于它们的构建系统不同。

QMake是Qt自带的构建工具,它可以通过.pro文件来构建Qt项目。这些.pro文件包含了项目的源代码、资源、依赖项等信息,以及如何将它们组合在一起来生成可执行文件、库文件等。QMake可以跨平台使用,并且可以自动生成Makefile文件来编译和链接项目。QMake支持非常多的平台,可以轻松地实现跨平台编译。

CMake是一种跨平台的构建系统,可以使用类似于Makefile的文件来构建和管理项目。CMake可以自动生成Makefile、Ninja、Visual Studio等多种编译工具所需的项目文件。CMake具有丰富的功能,例如自动检测系统环境、自动查找库文件、自动生成文档等。CMake支持的平台也非常广泛。相信你在非Qt的应用中,也见到过。

选择使用QMake还是CMake,取决于您的个人喜好和项目需求。QMake比较方便,毕竟Qt家族的一员。如果您需要更高级的构建功能,并且需要支持更多的平台,那么CMake可能更适合您的需求,长远考虑,这里推荐是CMake。

编写Hello World程序

在Qt Creator中,打开mainwindow.cpp文件。您将看到一个名为"MainWindow::MainWindow(QWidget *parent)"的构造函数。在这个函数中,我们将编写Hello World程序。

在构造函数的最后,添加以下代码:

QPushButton *button = new QPushButton("Hello World", this);
connect(button, &QPushButton::clicked, [=](){
    QMessageBox::information(this, "Message", "Hello World!");
});

这个代码会创建一个名为"Hello World"的按钮,并将一个点击事件与一个信息框连接起来。当按钮被单击时,一个带有"Hello World!"文本的消息框将被显示出来。

Qt, Hello World

好了,Hello World到这里就不用往下看了,下面是附加题。

信号和槽的连接

在Qt中,使用connect函数将信号和槽连接起来,实现按钮等控件的交互响应。connect函数有多种重载形式,可以使用以下几种方式来连接按钮的信号和槽:

1、使用函数指针连接:

connect(button, &QPushButton::clicked, this, &MyClass::onButtonClick);

在这个例子中,button是一个QPushButton对象,clicked是QPushButton的clicked信号,this是指向当前对象的指针,onButtonClick是当前类中的一个槽函数。

2、使用Qt5中的新语法连接,上面示例就是使用该方法

connect(button, &QPushButton::clicked, [=](){
    qDebug() << "Button clicked";
});

在这个例子中,button是一个QPushButton对象,clicked是QPushButton的clicked信号,使用lambda表达式作为槽函数。

3、使用信号-槽的字符串名称连接:

connect(button, SIGNAL(clicked()), this, SLOT(onButtonClick()));

在这个例子中,button是一个QPushButton对象,clicked是QPushButton的clicked信号,this是指向当前对象的指针,onButtonClick是当前类中的一个槽函数。这是Qt4的老语法,不推荐使用。

4、使用QObject::connect静态函数连接:

QObject::connect(button, SIGNAL(clicked()), this, SLOT(onButtonClick()));

这是QObject的静态函数connect的形式,与第三种形式等价。

总体来说,建议使用第一种或第二种方法来连接信号和槽,因为这些方法在Qt5以后被广泛使用,并且是更为安全和高效的连接方式。

Lambda表达式

它就是数学中我们常见的λ[ˈlæmdə],希腊字母的第十一个。在编程中,Lambda表达式是一种匿名函数,它可以在C++中以一种简洁和直观的方式编写小型函数。当然在现代诸多简洁的语言中早就有了它的身影,比如JavaScript的箭头函数、Objective-C的Block、Swift中的Closures等等,它的语法结构大多都是参数+箭头+返回值+函数体,如下:

[capture-list] (parameters) -> return-type { function-body }

其中:

capture-list:捕获列表,指定lambda表达式所捕获的外部变量,可以是值传递或引用传递。
parameters:参数列表,指定lambda表达式的参数。
return-type:返回类型,指定lambda表达式的返回值类型,可以省略。
function-body:函数体,指定lambda表达式的实现。

下面是一个简单的lambda表达式示例,用于计算两个数的和:

auto sum = [](int a, int b) -> int {
    return a + b;
};

int result = sum(1, 2); // result = 3

在这个示例中,[]表示没有捕获任何外部变量,(int a, int b)是参数列表,-> int表示返回类型是int,{ return a + b; }是函数体。

Lambda表达式的优点在于它们可以被视为一个函数对象,可以像普通函数一样传递和使用。它们可以作为函数参数传递,也可以作为返回值返回。此外,lambda表达式还可以方便地实现一些需要内部函数的算法和数据结构,如排序算法等。

Lambda表达式在Qt5以后得到了广泛的应用,因为它们可以方便地用于Qt信号和槽的实现。在Qt中,使用lambda表达式可以将信号和槽的连接代码简化为一行代码,使代码更加清晰和易于维护。