Qt 许可、安装与 C++ 入门指南
1. Qt 许可说明
Qt 有开源和商业两种版本。开源版可免费获取,而商业版则需付费购买。CD 中的软件适用于个人教育和自用应用程序的开发。
如果使用 Qt 开源版创建应用程序并进行分发,必须遵守所使用软件许可证规定的特定条款和条件。对于开源版,这些条款和条件要求使用 GNU 通用公共许可证(GPL)。像 GPL 这样的开源许可证赋予应用程序用户某些权利,包括查看和修改源代码以及分发应用程序的权利(遵循相同条款)。若想不公开源代码分发应用程序(保护代码隐私),或对应用程序应用自己的商业许可条件,则必须购买用于创建应用程序的软件的商业版。商业版软件允许按自己的条款销售和分发应用程序。
CD 包含适用于 Windows、Mac OS X 和 X11 的 GPL 版本的 Qt。许可证的完整法律文本以及获取商业版本的信息都包含在 CD 上的软件包中。
2. Qt 安装指南
2.1 Windows 系统安装 Qt
- 自动启动安装程序 :将 CD 插入 Windows 机器后,安装程序通常会自动启动。若未自动启动,可使用文件资源管理器导航到 CD 的根文件夹,然后双击 install.exe(根据系统配置,该程序可能显示为 install)。
- MinGW 编译器设置 :若已安装 MinGW C++ 编译器,需指定其所在目录;若未安装,可勾选相应复选框,让安装程序为你安装 MinGW。CD 提供的 Qt GPL 版本无法与 Visual C++ 配合使用,因此若未安装 MinGW,则需要安装。
- 安装示例和文档 :安装程序还提供安装随书示例的选项。Qt 的标准示例和文档会自动安装。
- 安装后操作 :安装完成后,开始菜单中将出现一个名为“Qt by Trolltech v4.1.1 (opensource)”的新文件夹。该文件夹包含 Qt Assistant 和 Qt Designer 的快捷方式,还有一个名为“Qt 4.1.1 Command Prompt”的快捷方式,用于启动控制台窗口。启动此窗口时,它将设置使用 MinGW 编译 Qt 程序所需的环境变量。在该窗口中,可运行 qmake 和 make 来构建 Qt 应用程序。
2.2 Mac 系统安装 Qt
- 前提条件 :在 Mac OS X 上安装 Qt 之前,必须先安装 Apple 的 Xcode Tools。包含这些工具的 CD(或 DVD)通常随 Mac OS X 提供,也可从 Apple Developer Connection(http://developer.apple.com)下载。
-
不同系统版本的安装方式
:
- 若使用 Mac OS X 10.4(Tiger)和 Xcode Tools 2.x(带有 GCC 4.0.x),可使用以下描述的安装程序。
- 若使用较早版本的 Mac OS X 或较旧版本的 GCC,则需要手动安装源包。该包名为 qt - mac - opensource - 4.1.1.tar.gz,位于 CD 的 mac 文件夹中。若安装此包,请遵循下一节中在 X11 上安装 Qt 的说明。
- 使用安装程序安装 :插入 CD 并双击名为 Qt.mpkg 的软件包,将启动安装程序 Installer.app,Qt 将与标准示例、文档和随书示例一起安装。Qt 将安装在 /Developer 目录下,随书示例将安装在 /Developer/Examples/Qt4Book 目录下。
- 运行命令 :若要运行 qmake 和 make 等命令,需要使用终端窗口,例如 /Applications/Utilities 中的 Terminal.app。也可使用 qmake 生成 Xcode 项目。例如,要为 hello 示例生成 Xcode 项目,可启动 Terminal.app 等控制台,将目录更改为 /Developer/Examples/Qt4Book/chap01/hello,然后输入以下命令:
qmake -spec macx - xcode hello.pro
2.3 X11 系统安装 Qt
- 权限要求 :要将 Qt 安装到 X11 的默认位置,需要具有 root 权限。若没有 root 访问权限,可使用 configure 的 - prefix 参数指定具有写入权限的目录。
-
安装步骤
:
- 切换到临时目录 :
cd /tmp
2. **解压 CD 中的存档文件**:
cp /cdrom/x11/qt - x11 - opensource - src - 4.1.1.tgz .
gunzip qt - x11 - opensource - src - 4.1.1.tgz
tar xvf qt - x11 - opensource - src - 4.1.1.tar
假设 CD - ROM 挂载在 /cdrom 目录下,上述操作将创建 /tmp/qt - x11 - opensource - src - 4.1.1 目录。Qt 需要 GNU tar,在某些系统中它被称为 gtar。
3. **执行 configure 工具**:
cd /tmp/qt - x11 - opensource - src - 4.1.1
./configure
可运行 ./configure - help 获取配置选项列表。
4. **构建 Qt**:
make
这将创建库并编译所有演示、示例和工具。在某些系统中,make 被称为 gmake。
5. **安装 Qt**:
su - c "make install"
输入 root 密码后,Qt 将安装到 /usr/local/Troll - tech/Qt - 4.1.1 目录。可使用 configure 的 - prefix 选项更改安装目标目录,若对目标目录具有写入权限,可直接运行:
make install
6. **设置环境变量**:
- 若使用 bash、ksh、zsh 或 sh shell,可在 .profile 文件中添加以下行:
PATH=/usr/local/Trolltech/Qt - 4.1.1/bin:$PATH
export PATH
- 若使用 csh 或 tcsh shell,可在 .login 文件中添加以下行:
setenv PATH /usr/local/Trolltech/Qt - 4.1.1/bin:$PATH
若在 configure 中使用了 - prefix 参数,请使用指定的路径代替上述默认路径。若使用不支持 rpath 的编译器,还需扩展 LD_LIBRARY_PATH 环境变量,使其包含 /usr/local/Trolltech/Qt - 4.1.1/lib。在使用 GCC 的 Linux 系统中,此步骤并非必需。
- 查看演示和文档 :Qt 附带一个名为 qtdemo 的演示应用程序,展示了许多库的功能,是了解 Qt 功能的良好起点。若要查看 Qt 的文档,可访问 http://doc.trolltech.com,或在控制台窗口中输入 assistant 运行 Qt Assistant(Qt 的帮助应用程序)。
3. C++ 入门指南
3.1 C++ 程序基础
C++ 程序由一个或多个编译单元组成。每个编译单元是一个单独的源代码文件,通常扩展名为 .cpp(其他常见扩展名有 .cc 和 .cxx),编译器会一次性处理这些文件。对于每个编译单元,编译器会生成一个目标文件,在 Windows 系统上扩展名为 .obj,在 Unix 和 Mac OS X 系统上扩展名为 .o。目标文件是包含程序运行所需机器代码的二进制文件。
所有 .cpp 文件编译完成后,可使用名为链接器的特殊程序将目标文件组合成可执行文件。链接器会连接目标文件,并解析编译单元中引用的函数和其他符号的内存地址。
构建程序时,必须有一个编译单元包含 main() 函数,该函数作为程序的入口点。main() 函数不属于任何类,是一个全局函数。与 Java 不同,Java 每个源文件必须包含一个类,而 C++ 可以根据需要组织编译单元。可以在同一个 .cpp 文件中实现多个类,也可将一个类的实现分散到多个 .cpp 文件中,并且可以为源文件任意命名。当修改某个 .cpp 文件时,只需重新编译该文件,然后重新链接应用程序即可创建新的可执行文件。
3.2 示例程序分析
以下是一个简单的 C++ 程序,用于计算整数的平方,该程序由两个编译单元组成:main.cpp 和 square.cpp。
square.cpp 文件内容 :
double square(double n)
{
return n * n;
}
该文件包含一个名为 square() 的全局函数,用于返回其参数的平方。
main.cpp 文件内容 :
#include <cstdlib>
#include <iostream>
using namespace std;
double square(double);
int main(int argc, char *argv[])
{
if (argc != 2) {
cerr << "Usage: square <number>" << endl;
return 1;
}
double n = strtod(argv[1], 0);
cout << "The square of " << argv[1] << " is " << square(n) << endl;
return 0;
}
main.cpp 源文件包含 main() 函数的定义。在 C++ 中,main() 函数接受一个 int 类型和一个 char * 数组(字符串数组)作为参数。程序名可通过 argv[0] 获取,命令行参数可通过 argv[1]、argv[2] 等获取。参数名 argc(“参数计数”)和 argv(“参数值”)是约定俗成的。若程序不访问命令行参数,可定义无参数的 main() 函数。
main() 函数使用了 Standard C++ 库中的 strtod()(“字符串转双精度浮点数”)、cout(C++ 的标准输出流)和 cerr(C++ 的标准错误流),将命令行参数转换为双精度浮点数并将文本输出到控制台。字符串、数字和换行符(endl)使用 << 运算符输出,该运算符也用于位运算。为了使用这些标准功能,需要第 1 行和第 2 行的 #include 指令。
第 3 行的 using namespace 指令告诉编译器将 std 命名空间中声明的所有标识符导入全局命名空间,这样就可以直接使用 strtod()、cout、cerr 和 endl,而无需使用完全限定名 std::strtod()、std::cout、std::cerr 和 std::endl。在 C++ 中,:: 运算符用于分隔复杂名称的各个部分。
第 4 行的声明是一个函数原型,它告诉编译器存在一个具有给定参数和返回值的函数。实际的函数可以位于同一个编译单元或其他编译单元中。若没有函数原型,编译器将不允许在第 12 行调用该函数。函数原型中的参数名是可选的。
3.3 编译程序
不同平台的编译程序步骤不同。例如,在 Solaris 系统上使用 Sun C++ 编译器编译上述程序,可输入以下命令:
CC -c main.cpp
CC -c square.cpp
ld main.o square.o -o square
前两行命令调用编译器为 .cpp 文件生成 .o 文件,第三行命令调用链接器生成名为 square 的可执行文件。可通过以下命令运行该程序:
./square 64
程序将在控制台输出以下消息:
The square of 64 is 4096
若要编译程序,可向当地的 C++ 专家寻求帮助。若无法获得帮助,也可在不编译的情况下阅读本指南的其余部分,并按照相关说明编译第一个 C++/Qt 应用程序。Qt 提供了在所有平台上轻松构建应用程序的工具。
3.4 头文件的使用
在实际应用中,通常会将 square() 函数的原型放在一个单独的文件中,并在需要调用该函数的所有编译单元中包含该文件。这样的文件称为头文件,通常扩展名为 .h(.hh、.hpp 和 .hxx 也很常见)。
以下是 square.h 文件的内容:
#ifndef SQUARE_H
#define SQUARE_H
double square(double);
#endif
头文件由三个预处理指令(#ifndef、#define 和 #endif)括起来,这些指令确保头文件只被处理一次,即使在同一个编译单元中多次包含该头文件(当头文件包含其他头文件时可能会出现这种情况)。按照惯例,用于实现此目的的预处理器符号是从文件名派生而来的(在本例中为 SQUARE_H)。
使用头文件后的 main.cpp 文件内容如下:
#include <cstdlib>
#include <iostream>
#include "square.h"
using namespace std;
int main(int argc, char *argv[])
{
if (argc != 2) {
cerr << "Usage: square <number>" << endl;
return 1;
}
double n = strtod(argv[1], 0);
cout << "The square of " << argv[1] << " is " << square(n) << endl;
return 0;
}
第 3 行的 #include 指令会展开为 square.h 文件的内容。以 # 开头的指令会在正式编译之前被 C++ 预处理器处理。过去,预处理器是一个单独的程序,程序员在运行编译器之前需要手动调用它。现代编译器会隐式处理预处理器步骤。
第 1 行和第 2 行的 #include 指令会展开为 cstdlib 和 iostream 头文件的内容,这些头文件是 Standard C++ 库的一部分。标准头文件没有 .h 后缀。文件名周围的尖括号表示头文件位于系统的标准位置,而双引号则告诉编译器在当前目录中查找。通常会将 #include 指令集中放在 .cpp 文件的顶部。
与 .cpp 文件不同,头文件本身不是编译单元,不会生成任何目标文件。头文件只能包含声明,用于使不同的编译单元能够相互通信。因此,将 square() 函数的实现放在头文件中是不合适的。在本例中,若只包含一次 square.h 文件,不会出现问题,但若从多个 .cpp 文件中包含 square.h 文件,会导致 square() 函数有多个实现(每个包含该头文件的 .cpp 文件都会有一个实现),链接器会抱怨 square() 函数有多个(相同的)定义,并拒绝生成可执行文件。相反,若声明了一个函数但从未实现它,链接器会抱怨“未解析的符号”。
3.5 库的使用
到目前为止,我们假设可执行文件只由目标文件组成。实际上,可执行文件通常还会链接实现现成功能的库。主要有两种类型的库:
-
静态库
:直接包含在可执行文件中,就像目标文件一样。这样可以确保库不会丢失,但会增加可执行文件的大小。
-
动态库
:(也称为共享库或 DLL)位于用户机器的标准位置,并在应用程序启动时自动加载。
对于 square 程序,我们链接了 Standard C++ 库,该库在大多数平台上实现为动态库。Qt 本身是一组库,可以构建为静态库或动态库(默认是动态库)。
综上所述,本文详细介绍了 Qt 的许可情况、不同操作系统下的安装步骤,以及 C++ 程序的基本概念、编译过程、头文件的使用和库的链接等内容,希望能帮助开发者更好地使用 Qt 和 C++ 进行应用程序开发。
4. C++ 与 Java、C# 的主要语言差异
4.1 类的定义
在 Java 中,每个源文件必须包含一个类,并且文件名要与类名一致。而 C++ 则更加灵活,我们可以在同一个 .cpp 文件中实现多个类,也能把一个类的实现分散到多个 .cpp 文件里,源文件的命名也不受限制。例如,在一个复杂的项目中,我们可以将相关的类都放在一个文件里,方便管理和维护。
4.2 指针和引用的使用
Java 没有显式的指针概念,而是使用引用。C++ 则既有指针又有引用。指针是一个变量,它存储的是另一个变量的内存地址;引用则是变量的别名。以下是一个简单的示例:
#include <iostream>
using namespace std;
int main() {
int num = 10;
int* ptr = # // 指针
int& ref = num; // 引用
cout << "Value of num: " << num << endl;
cout << "Value via pointer: " << *ptr << endl;
cout << "Value via reference: " << ref << endl;
return 0;
}
在这个示例中,我们定义了一个整数变量
num
,然后分别使用指针
ptr
和引用
ref
来访问它的值。
4.3 运算符重载
C++ 允许对运算符进行重载,这样可以让自定义类型的对象像内置类型一样使用运算符。例如,我们可以为自定义的复数类重载
+
运算符:
#include <iostream>
using namespace std;
class Complex {
private:
double real;
double imag;
public:
Complex(double r = 0, double i = 0) : real(r), imag(i) {}
Complex operator+(const Complex& other) const {
return Complex(real + other.real, imag + other.imag);
}
void display() const {
cout << real << " + " << imag << "i" << endl;
}
};
int main() {
Complex c1(1, 2);
Complex c2(3, 4);
Complex c3 = c1 + c2;
c3.display();
return 0;
}
在这个示例中,我们为
Complex
类重载了
+
运算符,使得两个
Complex
对象可以直接相加。
4.4 预处理器的使用
C++ 中的预处理器可以在编译前对代码进行一些处理,如包含头文件、定义宏等。常见的预处理器指令有
#include
、
#define
、
#ifndef
等。例如,在前面的示例中,我们使用
#ifndef
和
#define
来防止头文件被重复包含。
5. 标准 C++ 库介绍
5.1 标准 C++ 库概述
标准 C++ 库是经过 30 多年发展而来的,它提供了现成的功能,可以在任何 C++ 程序中使用。该库支持多种编程风格,包括过程式、面向对象和函数式编程,同时使用了宏和模板。不过,与 Java 和 C# 提供的库相比,标准 C++ 库的功能范围较窄,例如它不支持 GUI 编程、多线程、数据库、国际化、网络、XML 或 Unicode 等。
5.2 标准 C++ 库的主要组成部分
| 组成部分 | 功能描述 |
|---|---|
| 输入输出流库 |
提供了用于输入输出操作的类和对象,如
iostream
、
fstream
等。
|
| 容器库 |
包含了各种容器类,如
vector
、
list
、
map
等,用于存储和管理数据。
|
| 算法库 | 提供了一系列通用的算法,如排序、查找、遍历等。 |
| 字符串库 |
支持字符串的处理和操作,如
string
类。
|
| 时间和日期库 | 用于处理时间和日期相关的操作。 |
以下是一个使用标准 C++ 库中
vector
容器的示例:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> numbers;
// 向 vector 中添加元素
numbers.push_back(10);
numbers.push_back(20);
numbers.push_back(30);
// 遍历 vector 并输出元素
for (int i = 0; i < numbers.size(); i++) {
cout << numbers[i] << " ";
}
cout << endl;
return 0;
}
在这个示例中,我们使用
vector
容器存储整数,并向其中添加元素,然后遍历并输出这些元素。
6. Qt 对 C++ 的扩展
6.1 信号和槽机制
Qt 引入了创新的“信号和槽”机制,用于实现对象之间的通信。当一个对象的状态发生变化时,它会发出一个信号,其他对象可以连接到这个信号,并通过槽函数来响应。例如,当一个按钮被点击时,它会发出一个
clicked()
信号,我们可以将这个信号连接到一个槽函数,当按钮被点击时,槽函数就会被调用。以下是一个简单的示例:
#include <QApplication>
#include <QPushButton>
#include <QWidget>
class MyWidget : public QWidget {
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
QPushButton *button = new QPushButton("Click me", this);
connect(button, &QPushButton::clicked, this, &MyWidget::onButtonClicked);
}
private slots:
void onButtonClicked() {
qDebug() << "Button clicked!";
}
};
#include "main.moc"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
}
在这个示例中,我们创建了一个按钮,并将它的
clicked()
信号连接到
MyWidget
类的
onButtonClicked()
槽函数。当按钮被点击时,会在控制台输出“Button clicked!”。
6.2 Unicode 支持
Qt 提供了对 Unicode 的支持,使得我们可以方便地处理各种语言的文本。在 Qt 中,字符串类型
QString
就是基于 Unicode 的,可以存储和处理任意字符。
6.3 foreach 关键字
Qt 引入了
foreach
关键字,用于方便地遍历容器。例如,我们可以使用
foreach
来遍历
QList
容器:
#include <QList>
#include <QDebug>
int main() {
QList<int> numbers;
numbers << 1 << 2 << 3 << 4 << 5;
foreach (int num, numbers) {
qDebug() << num;
}
return 0;
}
在这个示例中,我们使用
foreach
关键字遍历
QList
容器,并输出其中的元素。
7. 总结
本文全面介绍了 Qt 的许可、安装,C++ 程序的基础知识,以及 C++ 与 Java、C# 的语言差异和标准 C++ 库的使用。同时,还阐述了 Qt 对 C++ 的扩展,如信号和槽机制、Unicode 支持和
foreach
关键字等。通过这些内容,开发者可以更好地理解和运用 Qt 和 C++ 进行跨平台、高性能的 GUI 应用程序开发。在实际开发中,我们可以根据项目的需求选择合适的工具和技术,充分发挥 Qt 和 C++ 的优势。
以下是整个开发流程的 mermaid 流程图:
graph LR
A[开始] --> B[了解 Qt 许可]
B --> C{选择版本}
C -- 开源版 --> D[遵循 GPL 许可开发]
C -- 商业版 --> E[购买并使用]
D --> F{选择操作系统}
E --> F
F -- Windows --> G[安装 Qt/Windows]
F -- Mac --> H[安装 Qt/Mac]
F -- X11 --> I[安装 Qt/X11]
G --> J[学习 C++ 基础]
H --> J
I --> J
J --> K[掌握 C++ 与 Java、C# 差异]
K --> L[了解标准 C++ 库]
L --> M[利用 Qt 扩展开发应用]
M --> N[完成应用开发]
N --> O[结束]
希望本文能为开发者在使用 Qt 和 C++ 进行开发时提供有价值的参考,帮助大家顺利地开展项目。
超级会员免费看
6899

被折叠的 条评论
为什么被折叠?



