当前位置: 首页 > news >正文

QT6编程入门(一)

1、QT6介绍

1.1、QT6概述

Qt 是一个跨平台的 C++ 应用程序框架,它被广泛用于开发图形用户界面(GUI)应用程序,同时也可以用于开发非GUI程序,如控制台工具和服务器。Qt 被设计成能够在多种操作系统上运行,包括但不限于 Windows、Mac OS X、Linux、iOS 和 Android。截至2023,Qt 6 是 Qt 框架的最新版本,它带来了许多新特性和改进,以提升开发者的效率和应用程序的性能。Qt 6 的主要特点包括:

1)全新的Qt Quick Compiler

Qt 6 引入了 Qt Quick Compiler,它是一个革命性的组件,可以显著提高应用程序的启动速度和性能。Qt Quick Compiler 通过编译 QML 文件到本地代码,减少了运行时对解释器的依赖,从而提高了应用程序的运行效率。

2)模块化架构

Qt 6 对框架的模块化架构进行了进一步的优化,使得开发者可以根据需要选择所需的模块,从而减少应用程序的体积和提高运行效率。模块化的架构也使得 Qt 6 更加易于维护和扩展。

3)支持最新的C++标准

Qt 6 支持 C++20,这意味着开发者可以利用最新的 C++ 语言特性来编写 Qt 应用程序,提高代码的质量和效率。

4)增强的图形和动画能力

Qt 6 提供了更加先进的图形和动画能力,包括对 Vulkan 图形api的支持,以及对 Qt Quick 动画的增强。这些改进使得 Qt 6 更适合开发需要高级图形和动画效果的应用程序。

5)跨平台的一致性

Qt 6 进一步加强了跨平台的一致性,无论是在桌面应用程序、移动应用程序还是嵌入式系统开发中,开发者都可以享受到一致的开发体验和性能表现。

6)丰富的生态系统

Qt 6 拥有一个丰富的生态系统,包括大量的第三方库和工具,以及一个活跃的社区。这为开发者提供了大量的资源和帮助,以便他们能够更好地开发和维护 Qt 应用程序。
本文将探讨 Qt 6 的各个方面,包括安装和配置、Qt Quick 编程、事件处理、网络编程、数据库操作等。

1.2、环境搭建与安装

在开始学习QT6编程之前,首先需要搭建一个合适的环境。本章将介绍如何安装QT6以及相关的开发工具,主要包括以下内容:

1.2.1、安装QT6

QT6是Qt Company发布的最新版本,它提供了许多新的特性和改进。要安装QT6,可以从Qt官方网站下载QT6的安装包。

1.访问Qt官方网站(https:www.qt.io.download)并下载QT6的安装包。根据你的操作系统,选择相应的安装包。
2. 双击下载的安装包并启动安装程序。在安装过程中,根据提示进行操作。你可以选择安装所有的QT模块,或者只选择你需要的模块。
3. 安装完成后,QT6会被安装在指定的目录中,例如C:\Qt\6.x.x\msvc2019_64(Windows系统)或/opt/Qt6.x.x(Linux系统)。

1.2.2、安装MinGW或其他C++编译器

QT6需要一个C++编译器来编译和运行应用程序。在Windows系统上,我们通常使用MinGW作为C++编译器。
1. 下载MinGW安装包,可以从MinGW官方网站(http:www.mingw.org)下载。
2. 双击下载的安装包并启动安装程序。在安装过程中,根据提示进行操作。确保安装了GCC、G++、Makefile等工具。
3. 安装完成后,MinGW会被安装在指定的目录中,例如C:\MinGW。

1.2.3、安装配置IDE

为了提高开发效率,我们可以选择一个合适的IDE来帮助我们进行QT6编程。这里以Visual Studio为例,介绍如何在Visual Studio中配置QT6。
1. 下载并安装Visual Studio。你可以选择免费的Visual Studio Community版。
2. 打开Visual Studio,点击文件菜单,选择新建->项目。
3. 在项目创建向导中,选择QT作为项目类型。
4. 在项目模板中,选择一个合适的模板,例如QT应用(Qt App)。
5. 填写项目名称和位置,然后点击创建按钮。
6. Visual Studio会自动配置QT6项目,并添加必要的源文件和目录。

1.2.4、安装必要的软件库和工具

为了使QT6应用程序正常运行,可能需要安装一些必要的软件库和工具,例如OpenGL、Fontconfig、SQLite等。你可以从官方网站或者第三方源下载相应的软件库和工具,并根据需要安装。
安装完成后,你就可以开始QT6编程的学习之旅了。下一章将介绍QT6的基本概念和常用模块,带你领略QT的魅力。

1.3、第一个QT6程序

在本章中,我们将带你领略QT6编程的世界,首先从编写一个简单的QT6程序开始。通过这个例子,我们将了解QT6的基本结构和编程思维。

1.3.1、创建一个QT6项目

首先,我们需要安装QT6开发环境。安装完成后,我们可以使用QT Creator来创建一个新的QT6项目。
1. 打开QT Creator。
2. 点击新建项目(或按Ctrl+N)。
3. 在弹出的对话框中,选择应用程序下的QT Widgets应用程序。
4. 点击继续(或按Enter)。
5. 在下一个对话框中,为项目命名,例如FirstProgram,并选择项目的位置。
6. 选择一个QT版本,这里我们选择QT 6.x。
7. 选择用于编译程序的编译器,例如GCC。
8. 完成以上步骤后,点击创建项目。
现在,我们已经创建了一个名为FirstProgram的QT6项目。接下来,我们将编辑这个项目的代码。

1.3.2、编辑代码

双击FirstProgram文件夹,然后打开其中的main.cpp文件。在这个文件中,你会看到一个简单的QT6程序的框架。

cpp
include <QApplication>
include <QPushButton>
int main(int argc, char *argv[])
{QApplication app(argc, argv);QPushButton button(“点我”);button.show();return app.exec();
}

这段代码定义了一个简单的QT应用程序,它创建了一个按钮并显示在屏幕上。现在,我们来逐行解释这段代码。
1. include <QApplication>,这行代码包含了QT应用程序的入口类QApplication。QApplication类是QT应用程序的主控类,负责应用程序的控制和消息循环。
2. include <QPushButton>,这行代码包含了用于创建按钮的类QPushButton。QPushButton是一个按钮小部件,可以用来触发事件。
3. int main(int argc, char *argv[]),这是C++程序的入口函数。main函数是每个C++程序执行的开始点。argc和argv参数分别代表命令行参数的个数和参数数组。
4. QApplication app(argc, argv),这行代码创建了一个QApplication实例。app对象将管理应用程序的控制流和主要设置。
5. QPushButton button(点我),这行代码创建了一个QPushButton对象,并将其命名为button。按钮显示的文字是点我。
6. button.show(),这行代码调用了button对象的show()方法,将按钮显示在屏幕上。
7. return app.exec();这行代码开始了QT的事件循环。事件循环是QT应用程序的核心,负责处理所有的事件,如按键、鼠标点击等。
现在,我们已经编写好了第一个QT6程序。接下来,我们可以编译并运行这个程序。

1.3.3、编译和运行

在QT Creator中,点击工具栏上的构建(或按Ctrl+B)按钮来编译项目。如果编译成功,你将在构建输出窗口看到成功的消息。
现在,我们可以运行这个程序。点击工具栏上的运行(或按Ctrl+R)按钮,或按F5键,或者右键点击FirstProgram并选择运行。调试时按下F7键开始执行程序,并暂停在第一个断点处。
运行时,应该会在屏幕上看到一个显示点我文字的按钮。点击这个按钮,没有任何反应,这是因为我们还没有为按钮添加点击事件处理函数。

1.3.4、添加事件处理

为了响应按钮点击事件,我们需要为按钮添加一个事件处理函数。在main.cpp文件中,我们添加以下代码:

//cpp
include <QApplication>
include <QPushButton>
include <QMessageBox>
int main(int argc, char *argv[])
{QApplication app(argc, argv);QPushButton button(点我, &app);button.show();// 连接按钮的点击信号到一个lambda函数QObject::connect(&button, &QPushButton::clicked, [&]() {QMessageBox::information(nullptr, 点击按钮, 你点击了按钮!);});return app.exec();
}

在这段代码中,我们做了以下几件事,
1. 引入了QMessageBox头文件,用于创建一个消息框。
2. 使用QObject::connect()函数,将按钮的clicked信号连接到一个Lambda函数。当按钮被点击时,这个Lambda函数将被调用。
3. 在Lambda函数中,我们使用QMessageBox::information()方法显示一个消息框,其中包含你点击了按钮!的信息。

现在,我们可以重新编译并运行程序。点击按钮后,一个消息框将弹出,显示你点击了按钮!。
至此,你已经学会了如何编写和运行一个QT6程序。在接下来的章节中,我们将进一步学习QT6编程的各种知识点,帮助你掌握QT编程的技巧和方法。

1.4、QT6项目结构

在Qt 6中,项目结构得到了进一步的优化和更新,以适应新的技术和开发需求。本章将详细介绍Qt 6的项目结构,帮助你更好地理解和使用Qt 6进行应用程序开发。

1.4.1、基本项目结构

一个典型的Qt 6项目包含以下几个基本目录和文件:

MyApp
├── include
│   └── MyApp
│       └── MyApp.h
├── src
│   └── MyApp
│       └── MyApp.cpp
├── CMakeLists.txt
├── mesh
│   ├── CMakeLists.txt
│   └── mesh.qrc
└── MyApp.pro

- include,存放项目头文件。
- src,存放项目源文件。
- CMakeLists.txt,CMake构建文件,用于配置项目的构建选项和依赖关系。
- mesh,存放与项目相关的资源文件,例如图片、字体等。
- MyApp.pro,Qt Creator项目文件,用于配置项目的属性、构建选项和依赖关系。

1.4.2、模块和插件

Qt 6采用了模块化的设计,将功能分为多个模块,便于开发者和用户根据需求进行选择和使用。在Qt 6项目中,模块和插件的目录结构如下:

MyApp
├── include
│   └── MyApp
│       └── MyApp.h
├── src
│   └── MyApp
│       └── MyApp.cpp
├── CMakeLists.txt
├── mesh
│   ├── CMakeLists.txt
│   └── mesh.qrc
└── MyApp.pro

- Qt6Core,Qt核心模块,提供了基础的API和功能。
- Qt6Gui,Qt图形界面模块,提供了窗口系统、事件处理、2D图形等。
- Qt6Widgets,Qt Widgets模块,提供了常用的窗口小部件和控件。
- Qt6Multimedia,Qt多媒体模块,提供了音频、视频、摄像头等支持。
- Qt6Network,Qt网络模块,提供了网络编程和数据传输功能。
- Qt6SQL,Qt SQL模块,提供了数据库支持。
- Qt6QmlModels,Qt QML模型模块,提供了模型-视图编程的实现。
- Qt6Quick,Qt Quick模块,提供了快速开发动态UI的框架。
- Qt6Positioning,Qt定位模块,提供了地理坐标和地图功能。
- Qt6PrintSupport,Qt打印支持模块,提供了打印和打印预览功能。
- Qt6Svg,Qt SVG模块,提供了SVG图像的支持。
- Qt6WebEngine,Qt Web Engine模块,提供了基于Chromium的Web浏览器功能。
开发者可以根据项目需求,选择合适的模块进行集成和使用。同时,Qt 6还提供了丰富的插件,可以扩展Qt的功能,例如图像处理、数据可视化等。

1.4.3、项目和工程文件

Qt Creator是Qt官方提供的集成开发环境,用于创建和管理Qt项目。在Qt Creator中,每个项目都对应一个.pro文件,用于配置项目的属性、构建选项和依赖关系。
MyApp.pro文件示例:

TARGET = MyApp
QT += core gui widgets network
SOURCES += \src_MyApp_MyApp.cpp
HEADERS += \include_MyApp_MyApp.h

在这个示例中,我们定义了项目的名称MyApp,并添加了需要的Qt模块core、gui和network。同时,我们指定了项目的源文件src_MyApp_MyApp.cpp和头文件include_MyApp_MyApp.h。
除了.pro文件,Qt Creator还生成了一些其他工程文件,例如,
- CMakeLists.txt,CMake构建文件,用于配置项目的构建选项和依赖关系。
- Makefile,Makefile构建文件,用于构建项目。
- .qmake.stash,qmake缓存文件,用于存储qmake的配置信息。
这些文件共同构成了Qt项目的工程文件,用于指导编译器和链接器进行项目构建。

1.4.4、总结

Qt 6项目结构采用了模块化和组件化的设计,使得功能更加清晰、易于管理和扩展。了解和熟悉Qt 6的项目结构,对于高效地进行Qt开发具有重要意义。

2、QT6界面设计

2.1、窗口与控件

Qt 是一款跨平台的 C++图形用户界面应用程序框架,广泛用于开发GUI应用程序,也可以用于开发非GUI程序,如控制台工具和服务器。Qt 6 是其最新的版本,提供了许多新的特性和改进。
在 Qt 中,窗口是所有用户界面元素的顶层容器。窗口可以是子窗口或顶级窗口,子窗口通常嵌入在顶级窗口中。控件则是窗口中的交互元素,如按钮、文本框、标签等。

2.1.1、窗口

在 Qt 中,最基本的窗口类是 QWidget。它是一个抽象类,提供了窗口的基本功能。QMainWindow 和 QDialog 是继承自 QWidget 的其他常用窗口类。
- QMainWindow,主要用于主应用程序窗口,通常包含菜单栏、工具栏、状态栏和其他用于组织应用程序界面的元素。
- QDialog,用于创建对话框窗口,通常用于与用户进行交互。
创建窗口的基本步骤如下:

cpp
include <QMainWindow>
int main(int argc, char *argv[]) {QApplication app(argc, argv);QMainWindow window;window.setWindowTitle(Qt 6 窗口示例);window.show();return app.exec();
}

2.1.2、控件

Qt 提供了丰富的控件,用于创建用户界面。一些常用的控件包括,
- QPushButton,按钮控件,用于触发操作。
- QLabel,用于显示文本或图像的控件。
- QLineEdit,单行文本输入框。
- QComboBox,下拉列表控件。
- QCheckBox,复选框,用于让用户从多个选项中选择多个值。
- QRadioButton,单选按钮,用于让用户从多个选项中选择一个值。
添加控件到窗口的基本步骤如下:

//cpp
include <QPushButton>
include <QLabel>
include <QLineEdit>
int main(int argc, char *argv[]) {QApplication app(argc, argv);QMainWindow window;window.setWindowTitle(Qt 6 控件示例);QLabel label(欢迎使用 Qt 6);QPushButton button(点击我);QLineEdit lineEdit;window.setCentralWidget(&label);// ... 添加更多控件和布局代码 ...window.show();return app.exec();
}

2.1.3、布局

在 Qt 中,布局用于管理控件的放置和大小调整。Qt 提供了多种布局管理器,如 QHBoxLayout、QVBoxLayout、QGridLayout 等。
以下是一个简单的布局示例:

//cpp
include <QVBoxLayout>
include <QPushButton>
include <QLabel>
int main(int argc, char *argv[]) {QApplication app(argc, argv);QMainWindow window;window.setWindowTitle(Qt 6 布局示例);QWidget centralWidget;QVBoxLayout *layout = new QVBoxLayout;QLabel *label = new QLabel(欢迎使用 Qt 6);QPushButton *button = new QPushButton(点击我);layout->addWidget(label);layout->addWidget(button);centralWidget.setLayout(layout);window.setCentralWidget(&centralWidget);window.show();return app.exec();
}

2.2、布局管理

在软件开发过程中,合理地管理界面布局对于提升用户体验和程序性能至关重要。Qt作为一个功能强大的跨平台C++图形用户界面库,提供了多种布局管理方案来帮助开发者轻松地处理界面元素的布局问题。

2.2.1、布局管理器概述

在Qt中,布局管理器负责控制容器内控件的位置和大小。Qt提供了几种布局管理器,包括QHBoxLayout、QVBoxLayout、QGridLayout、QFormLayout和QBoxLayout等。每种布局管理器都有其特定的用途,适用于不同的布局场景。

2.2.2、常用布局管理器

1)水平布局(QHBoxLayout)

QHBoxLayout是将容器中的控件按照水平方向进行排列的布局管理器。例如,如果你想要创建一个水平工具栏,可以使用QHBoxLayout来管理其中的按钮等控件。

//cpp
QHBoxLayout *horizontalLayout = new QHBoxLayout();
QPushButton *btn1 = new QPushButton(按钮1);
QPushButton *btn2 = new QPushButton(按钮2);
horizontalLayout->addWidget(btn1);
horizontalLayout->addWidget(btn2);

2)垂直布局(QVBoxLayout)

QVBoxLayout是将容器中的控件按照垂直方向进行排列的布局管理器。类似于水平布局,垂直布局常用于创建菜单栏或者列表控件。

//cpp
QVBoxLayout *verticalLayout = new QVBoxLayout();
QPushButton *btn1 = new QPushButton(按钮1);
QPushButton *btn2 = new QPushButton(按钮2);
verticalLayout->addWidget(btn1);
verticalLayout->addWidget(btn2);

3) 网格布局(QGridLayout)

QGridLayout允许将容器中的控件按照网格进行排列,可以指定控件所在的位置和大小。这种布局方式非常灵活,适用于需要对控件进行精细排列的情况。

//cpp
QGridLayout *gridLayout = new QGridLayout();
QPushButton *btn1 = new QPushButton(按钮1);
QPushButton *btn2 = new QPushButton(按钮2);
QPushButton *btn3 = new QPushButton(按钮3);
gridLayout->addWidget(btn1, 0, 0);
gridLayout->addWidget(btn2, 0, 1);
gridLayout->addWidget(btn3, 1, 0);

4)表单布局(QFormLayout)

QFormLayout是一种特殊的布局管理器,通常用于创建表单界面,它会在控件之间添加标签,非常适合用于数据输入的场景。

//cpp
QFormLayout *formLayout = new QFormLayout();
QLabel *label = new QLabel(标签:);
QLineEdit *lineEdit = new QLineEdit();
formLayout->addRow(label, lineEdit);

5)箱式布局(QBoxLayout)
QBoxLayout是抽象基类,提供了两种布局方式,QHBoxLayout和QVBoxLayout。它通常被继承用来创建更加复杂的布局结构。

//cpp
QBoxLayout *boxLayout = new QBoxLayout(QBoxLayout::TopToBottom);
QPushButton *btn1 = new QPushButton(按钮1);
QPushButton *btn2 = new QPushButton(按钮2);
boxLayout->addWidget(btn1);
boxLayout->addWidget(btn2);

2.2.3、自定义布局

除了使用Qt提供的布局管理器之外,开发者还可以通过继承QAbstractLayout来创建自定义的布局管理器,满足特定的布局需求。

2.2.4、布局约束

在Qt中,布局管理器不仅仅负责控件的位置和大小,还可以通过布局约束来控制控件的生长和收缩。例如,在水平布局中,可以通过设置QHBoxLayout::AlignLeft或QHBoxLayout::AlignRight来对齐控件,还可以使用setSpacing()和setMargin()来设置控件之间的间距和边框。

2.2.5、布局与控件的关系

在Qt中,布局与控件之间的关系是动态的,控件可以添加到布局中,也可以从布局中移除。此外,布局管理器会自动处理控件的添加、删除和移动,开发者无需手动调整控件位置。

2.3、样式与样式表

在Qt中,样式与样式表是决定界面外观的两个重要概念。本章将介绍如何使用样式和样式表来美化我们的Qt应用程序。

2.3.1、样式

样式是决定控件外观的一种机制。Qt提供了丰富的样式,可以通过QSS(Qt Style Sheets)来定制。在Qt6中,样式系统得到了进一步的优化和改进。

2.3.1.1、内置样式

Qt6提供了多种内置样式,如,
- Windows,模仿Windows操作系统的默认样式。
- WindowsVista,模仿Windows Vista的默认样式。
- Windows7,模仿Windows 7的默认样式。
- Macintosh,模仿Mac OS的默认样式。
- Fusion,Qt自行设计的样式。

2.3.1.2、自定义样式

除了使用内置样式,我们还可以通过继承QStyle类来自定义样式。自定义样式可以让我们更加灵活地控制控件的外观。

2.3.2、样式表

样式表是一种CSS风格的语法,可以用来设置控件的属性,如颜色、字体、边距等。通过样式表,我们可以轻松地实现界面的一致性和可维护性。

2.3.2.1、基本语法

样式表的基本语法如下,
控件名称 {
    属性1: 值1;
    属性2: 值2;
    ...
}
例如,设置一个按钮的背景颜色和字体:

QPushButton {background-color: blue;font-size: 14px;
}
2.3.2.2、伪对象

Qt支持通过伪对象选择器来设置控件的特定部分,如边框、背景等。常用的伪对象有,
- :enabled,选择 enabled 状态的控件。
- :disabled,选择 disabled 状态的控件。
- :hover,选择鼠标悬停在控件上的状态。
- :pressed,选择被按下的控件。
例如,设置按钮按下时的背景颜色:

QPushButton:pressed {background-color: red;
}
2.3.2.3、优先级

样式表中的属性具有不同的优先级。如果一个控件有多个样式表,那么优先级较高的样式表将覆盖优先级较低的样式表。优先级从高到低依次为:

1)内联样式(直接在控件中设置的样式)。

2)动态样式(通过QStyle类动态生成的样式)。

3)样式表。

4)内置样式。

2.3.3、实践案例

下面我们通过一个简单的例子来实践样式和样式表的应用。

1)创建应用程序

首先,创建一个Qt Widgets Application。在项目文件夹中,打开mainwindow.ui文件。

2)添加控件

在mainwindow.ui中,添加一个按钮(QPushButton)和一个标签(QLabel)。

3)设置样式表

在mainwindow.ui的属性编辑器中,为按钮和标签设置样式表。
按钮样式表:

QPushButton {background-color: blue;color: white;border: 1px solid white;padding: 5px;
}
QPushButton:hover {background-color: darkblue;
}
QPushButton:pressed {background-color: red;
}

标签样式表:

QLabel {font-size: 14px;color: green;
}
4)运行应用程序

运行应用程序,查看样式和样式表的效果。
通过这个例子,我们可以看到样式表的强大功能。通过简单的语法,我们就可以实现控件的个性化设置。在实际开发中,样式表可以帮助我们快速地统一界面风格,提高开发效率。

2.4、动画与过渡效果

在软件开发中,动画与过渡效果是提升用户体验的重要手段。Qt6提供了丰富的动画与过渡效果支持,使得创建生动、流畅的动画变得简单而直观。本章将介绍如何在Qt6中使用动画与过渡效果。

2.4.1、动画概述

动画在用户界面设计中扮演着重要角色,它可以让界面更加生动有趣。Qt6提供了多种动画效果,如平滑过渡、淡入淡出、滑动等。使用Qt的动画系统,可以轻松地为应用程序中的对象创建自定义动画。

2.4.2、基本动画

Qt6中最基本的动画类是QPropertyAnimation,它可以通过动画更改对象的属性值。例如,可以通过动画改变一个按钮的大小、颜色或位置。
以下是一个简单的动画示例:

//cpp
QPropertyAnimation *animation = new QPropertyAnimation(button, size);
animation->setDuration(1000); // 设置动画持续时间
animation->setStartValue(QSize(50, 50)); // 设置动画起始值
animation->setEndValue(QSize(100, 100)); // 设置动画结束值
animation->start(); // 启动动画


在这个示例中,我们创建了一个QPropertyAnimation对象,它将改变按钮的大小。我们设置了动画的持续时间为1000毫秒,起始大小为50x50,结束大小为100x100。然后调用start()方法启动动画。

2.4.3、过渡效果

过渡效果是指在界面元素状态变化时所表现出的视觉效果,如按钮的按下、复选框的勾选等。Qt6提供了QStateMachine和QTransition等类来实现过渡效果。
以下是一个简单的过渡效果示例:

//cpp
QStateMachine *machine = new QStateMachine(this);
QState *state1 = new QState();
QState *state2 = new QState();
// 连接状态
state1->addTransition(button, SIGNAL(clicked()), state2);
state2->addTransition(button, SIGNAL(clicked()), state1);
// 设置初始状态
machine->setInitialState(state1);
// 启动状态机
machine->start();

在这个示例中,我们创建了一个QStateMachine对象,它管理两个状态state1和state2。我们通过addTransition()方法连接了这两个状态,当按钮被点击时,状态将在state1和state2之间切换。最后调用start()方法启动状态机。

2.4.4、自定义动画与过渡效果

Qt6允许我们自定义动画与过渡效果,以实现更丰富、更复杂的视觉效果。可以通过继承QAbstractAnimation或QState等类来实现自定义动画与过渡效果。

以下是一个自定义过渡效果的示例:

//cpp
class CustomTransition : public QState {
public:CustomTransition(QState *sourceState, QObject *targetState): QState(sourceState), m_targetState(targetState) {}
protected:void entry(QEvent *e) override {QState::entry(e);// 执行自定义过渡效果QMetaObject::invokeMethod(m_targetState, animationFinished, Qt::DirectConnection);}
private:QObject *m_targetState;
};

在这个示例中,我们创建了一个CustomTransition类,它继承自QState。我们通过重写entry()方法来实现自定义过渡效果。当状态进入时,将调用animationFinished方法,以便在过渡效果完成后执行特定操作。

2.4.5、实践案例

在本节的实践案例中,我们将创建一个简单的应用程序,展示如何使用Qt6的动画与过渡效果。我们将为按钮创建一个淡入淡出的动画,并在动画完成后改变按钮的文本。

//cpp
include <QApplication>
include <QPushButton>
include <QPropertyAnimation>
include <QStateMachine>
include <QTransition>
int main(int argc, char *argv[]) {QApplication app(argc, argv);QPushButton button(点击我);button.setGeometry(100, 100, 100, 50);// 创建动画QPropertyAnimation *animation = new QPropertyAnimation(&button, opacity);animation->setDuration(1000);animation->setStartValue(0.0);animation->setEndValue(1.0);// 创建状态机QStateMachine *machine = new QStateMachine(button.parentWidget());QState *state1 = new QState();QState *state2 = new QState();// 连接状态state1->addTransition(button, SIGNAL(clicked()), state2);state2->addTransition(button, SIGNAL(clicked()), state1);// 设置初始状态machine->setInitialState(state1);// 连接动画与状态机QTransition *transition = new QTransition(state1, state2);transition->addAnimation(animation);// 启动状态机machine->start();button.show();return app.exec();
}

在这个实践案例中,我们创建了一个按钮,并为其添加了一个淡入淡出的动画。我们还创建了一个状态机,它管理两个状态。当按钮被点击时,状态将在state1和state2之间切换,同时动画也会相应地启动和结束。在动画结束后,按钮的文本将发生变化,从而展示动画与过渡效果的使用。

2.4.6、变量动画

变量动画(QVariantAnimation)可以通过改变界面元素的属性值来实现动画效果,且支持更复杂的动画路径。下面是一个变量动画的示例:

//cpp
QVariantAnimation *animation = new QVariantAnimation();
animation->setTargetObject(progressBar);
animation->setPropertyName(value);
animation->setDuration(2000);
animation->setKeyValueAt(0, 0);
animation->setKeyValueAt(0.5, 50);
animation->setKeyValueAt(1, 100);
animation->start();

2.5、图形与绘图

2.5.1、图形与绘图概述

在软件开发中,图形与绘图技术是至关重要的。它们可以用于创建美观的用户界面、绘制数据图表、设计图形化元素等。QT6是一个功能强大的跨平台C++图形用户界面库,它提供了丰富的图形与绘图功能,使得开发人员可以轻松实现各种图形绘制需求。
本章将介绍QT6中的图形与绘图技术,包括基本图形绘制、图形视图框架、绘图属性和坐标系统等。通过学习本章,读者将掌握QT6中图形与绘图的基本知识和技能,为后续开发工作打下基础。

2.5.2、基本图形绘制

QT6提供了多种基本图形绘制功能,包括点、线、矩形、椭圆、多边形等。这些基本图形可以通过QPainter类进行绘制。以下是一个简单示例,展示如何使用QPainter绘制一个矩形:

//cpp
QPainter painter(this); // 假设是在一个QWidget上绘制
painter.drawRect(10, 10, 100, 100); // 绘制一个左上角为(10,10),宽高为100的矩形

除了绘制基本图形,QT6还提供了绘制文本、图片和自定义图形对象的功能。通过组合这些基本图形和高级绘图功能,可以创建出复杂且美观的用户界面。

2.5.3、图形视图框架

QT6的图形视图框架(Graphics View Framework)提供了一种用于显示和操作图形对象的高级机制。它包括视图(View)、场景(Scene)和图形对象(Graphics Item)三个主要部分。
- 视图,负责显示场景中的图形对象,并提供用户交互操作。
- 场景,负责管理图形对象,类似于画布,用于存放和布局图形对象。
- 图形对象,表示场景中的单个图形元素,可以是任何自定义的绘制对象。
以下是一个简单的图形视图框架示例,

//cpp
// 创建一个QGraphicsView和一个QGraphicsScene
QGraphicsView *view = new QGraphicsView(this);
QGraphicsScene *scene = new QGraphicsScene(this);
// 在场景中添加一个矩形图形对象
QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 100, 100);
scene->addItem(rectItem);
// 设置视图的场景
view->setScene(scene);

通过使用图形视图框架,可以轻松实现复杂的图形界面布局和用户交互,提高开发效率。

2.5.4、绘图属性

QT6提供了丰富的绘图属性,可以调整图形的外观,如颜色、线型、填充样式等。这些属性可以通过QPen、QBrush和QColor等类来设置。
以下是一个设置绘图属性的示例,

//cpp
QPen pen; // 创建一个QPen对象
pen.setColor(Qt::red); // 设置笔的颜色为红色
pen.setWidth(2); // 设置笔的宽度为2像素
QBrush brush; // 创建一个QBrush对象
brush.setColor(Qt::blue); // 设置刷子的颜色为蓝色
brush.setStyle(Qt::SolidPattern); // 设置刷子的样式为实心
// 使用设置好的绘图属性绘制图形
QPainter painter(this);
painter.setPen(pen);
painter.setBrush(brush);
painter.drawRect(10, 10, 100, 100); // 绘制一个左上角为(10,10),宽高为100的矩形,颜色为红色,线宽为2像素,蓝色实心填充

通过调整绘图属性,可以创建出各种不同风格和样式的图形。

2.5.5、坐标系统

QT6中坐标系统用于确定图形的位置和大小。QT6使用的是逻辑坐标系(Logical Coordinate System),也称为设备独立坐标系(Device Independent Coordinates,DIP)。它不依赖于具体的显示设备,可以在不同的设备上保持一致性。
QT6提供了两种主要的坐标系统,全局坐标系(Global Coordinates)和局部坐标系(Local Coordinates)。全局坐标系以屏幕左上角为原点(0,0),局部坐标系以当前视图的中心点为原点(0,0)。
在绘制图形时,需要根据实际情况选择合适的坐标系。例如,在绘制一个窗口内的图形时,通常使用全局坐标系;而在绘制一个图形视图中的图形时,则使用局部坐标系。
以下是一个坐标系统转换的示例:

//cpp
// 假设有一个QGraphicsView和一个QGraphicsScene
QGraphicsView *view = new QGraphicsView(this);
QGraphicsScene *scene = new QGraphicsScene(this);
// 在场景中添加一个矩形图形对象,使用局部坐标系
QGraphicsRectItem *rectItem = new QGraphicsRectItem(50, 50, 100, 100);
scene->addItem(rectItem);
// 设置视图的场景
view->setScene(scene);
// 获取视图的变换矩阵
QTransform transform = view->transform();
// 使用变换矩阵将局部坐标系转换为全局坐标系
QPointF globalPos = transform.map(rectItem->pos());

通过理解和运用坐标系统,可以更好地控制图形的位置和大小,实现复杂的绘图需求。

2.5.6、小结

本章介绍了QT6中的图形与绘图技术,包括基本图形绘制、图形视图框架、绘图属性和坐标系统等。通过学习本章,读者应掌握QT6中图形与绘图的基本知识和技能,为后续开发工作打下基础。在实际开发中,灵活运用所学知识,可以创建出美观且功能丰富的图形界面。

相关文章:

QT6编程入门(一)

1、QT6介绍 1.1、QT6概述 Qt 是一个跨平台的 C 应用程序框架&#xff0c;它被广泛用于开发图形用户界面&#xff08;GUI&#xff09;应用程序&#xff0c;同时也可以用于开发非GUI程序&#xff0c;如控制台工具和服务器。Qt 被设计成能够在多种操作系统上运行&#xff0c;包括…...

串口通信控制LED、马达、蜂鸣器、风扇

1.STM32U575RITx 设置引脚 编写main.c //对fputc重写&#xff0c;方便调用printf函数 int fputc(int ch, FILE* F){HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 10);return ch; } //main函数的主要循环while (1){char whole_buf[128];memset(whole_buf, 0, siz…...

每日一题:BM2 链表内指定区间反转

文章目录 链表区间反转教学内容1. 任务描述2. 题目分析例子 3. 思路4. 详细步骤4.1 创建虚拟头节点4.2 寻找反转区间的前一个节点4.3 反转区间中的节点4.4 重新连接链表4.5 返回结果 5. 代码实现6. 代码解析6.1 初始化虚拟头节点6.2 寻找反转区间的前一个节点6.3 反转区间中的节…...

Cherno C++学习笔记 P50 C++当中的动态库

在上一篇文章当中我们学习了C当中是如何使用静态库的&#xff0c;这一篇我们会讲一下如何使用动态库&#xff0c;并同样用GLFW这个已有的库来举例子。 有了静态库的经验&#xff0c;其实动态库就好理解和使用多了。这两者的区别是&#xff0c;静态链接发生在编译的时候&#x…...

【Flink CDC】Flink CDC的Schema Evolution表结构演变的源码分析和流程图

Flink CDC版本&#xff1a;3.2.1 说明&#xff1a;本文从SchemaOperator接收到&#xff0c;表结构变更事件开始&#xff0c;表结构变更事件应由source端产生&#xff0c;本文不讨论。 可以先看流程图&#xff0c;研究源码。 参考文章&#xff1a; Flink cdc3.0动态变更表结构—…...

计算机网络 (27)IP多播

前言 IP多播&#xff08;也称多址广播或组播&#xff09;技术是一种允许一台或多台主机&#xff08;多播源&#xff09;发送单一数据包到多台主机&#xff08;一次性的、同时的&#xff09;的TCP/IP网络技术。 一、基本概念 定义&#xff1a;多播作为一点对多点的通信&#xff…...

当算法遇到线性代数(四):奇异值分解(SVD)

SVD分解的理论与应用 线性代数系列相关文章&#xff08;置顶&#xff09; 1.当算法遇到线性代数&#xff08;一&#xff09;&#xff1a;二次型和矩阵正定的意义 2.当算法遇到线性代数&#xff08;二&#xff09;&#xff1a;矩阵特征值的意义 3.当算法遇到线性代数&#xff0…...

鸿蒙操作系统(HarmonyOS)

鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为公司推出的一款面向未来、面向全场景的分布式操作系统。它旨在为用户提供一个更加智能、便捷和安全的操作环境&#xff0c;支持多种终端设备之间的无缝协作。在鸿蒙应用开发中&#xff0c;ArkUI作为官方推荐的用户界面开发…...

通义灵码在跨领域应用拓展之物联网篇

目录 一.引言 二.通义灵码简介 三.通义灵码在物联网领域的设备端应用 1.传感器数据采集 (1).不同类型传感器的数据读取 (2).数据转换与预处理 2.设备控制指令接收和执行 (1).指令解析与处理 (2).设备动作执行 四.通义灵码在物联网领域的云端平台应用 1.数据存储和管…...

CSS语言的数据库交互

CSS语言的数据库交互&#xff1a;一种新潮流的探索 引言 在现代网页开发中&#xff0c;CSS&#xff08;层叠样式表&#xff09;无疑是构建优美和响应式网页的重要工具。然而&#xff0c;关于CSS和数据库之间的直接交互&#xff0c;尽管并不是一种常见的做法&#xff0c;却引发…...

[SMARTFORMS] 创建二维码

我们可以使用事务码SE73创建二维码 选择系统条形码&#xff0c;点击"更改"按钮 点击 创建选项 选择"新" 输入二维码名称和简短描述&#xff0c;点击"确认"按钮 选择"QR CODE 2005"&#xff0c;点击"确认"按钮 选择"No…...

数据项目相关的AWS云计算架构设计

电商数据平台架构 高性能&#xff1a;使用Amazon EC2的计算优化实例处理业务逻辑和数据计算&#xff0c;搭配Amazon ElastiCache内存缓存&#xff0c;加速数据读取。应用负载均衡器&#xff08;ALB&#xff09;在EC2实例间分发流量&#xff0c;实现负载均衡。高可用性&#xf…...

智慧农业应用场景|珈和科技高标准农田信息化监管平台解决方案

近年来&#xff0c;珈和科技持续深耕农业领域&#xff0c;深耕农业时空大数据服务。 珈和利用遥感大数据、云计算、移动互联网、物联网、人工智能等先进技术&#xff0c;搭建“天空地一体化”监测体系&#xff0c;并创新建设了150的全球领先算法模型&#xff0c;可为100多种农作…...

C++ operator = 返回void 会发生什么?

1.operator 正常情况 #include <iostream> using namespace std;class Box { public:Box(double L) : length(L) {}Box(const Box& b){}Box& operator (const Box&){return *this;}public:double length; // 长度 };int main() {Box box1(1.0);Box box2(…...

Scala 模式匹配

Scala 模式匹配 引言 Scala 作为一种多范式编程语言,不仅支持面向对象编程,还融合了函数式编程的特性。在其丰富的特性集中,模式匹配(Pattern Matching)尤为引人注目,它是一种在许多编程语言中都有应用的编程范式,但在 Scala 中得到了特别强大的支持。模式匹配允许开发…...

微信小程序中 “页面” 和 “非页面” 的区别

微信小程序中 “页面” 和 “非页面” 的区别&#xff0c;并用表格进行对比。 核心概念&#xff1a; 页面 (Page)&#xff1a; 页面是微信小程序中用户可以直接交互的视图层&#xff0c;也是小程序的基本组成部分。每个页面都有自己的 WXML 结构、WXSS 样式和 JavaScript 逻辑…...

解耦Java应用程序的方法和技巧

解耦 Java 应用程序是一项重要的设计原则是减少组件之间的依赖关系&#xff0c;使系统更加模块化、灵活和可维护。通过分离&#xff0c;您可以更轻松地更改、扩展或测试应用程序的各个部分&#xff0c;而不会影响其他部分。 分离 Java 应用程序需要应用减少组件之间直接依赖关系…...

Go语言的 的设计模式(Design Patterns)基础知识

Go语言的设计模式基础知识 引言 设计模式是一种在软件开发中经常使用的解决特定问题的通用方案。它们为开发者提供了一种有效的方式来组织代码、提高代码的可复用性、可维护性和灵活性。在众多编程语言中&#xff0c;Go语言因其独特的特性&#xff0c;如并发支持和简洁的语法…...

【Uniapp-Vue3】常用的表单组件button和input

表单组件中最常用的就是button组件和input组件 一、button组件 常用属性&#xff1a; <template><button>普通按钮</button><button size"mini">小按钮</button><button type"primary">蓝色按钮</button><…...

深入理解非对称加密:用Java实现RSA加解密

目录 一、非对称加密算法概述 二、Java 中实现非对称加密 非对称加密&#xff08;Asymmetric Encryption&#xff09;是一种加密方式&#xff0c;其中使用一对密钥&#xff1a;公钥&#xff08;Public Key&#xff09;和私钥&#xff08;Private Key&#xff09;。这种加密算…...

钓鱼邮件 wp

背景&#xff1a;Bob收到了一份钓鱼邮件&#xff0c;请找出木马的回连地址和端口。 1.打开文件 2.发现base64编码 3.base64解码 将base64编码全部存储在文件 base64.txt 中。 使用命令cat base6.txt | base64 -d | less解码并查看。 关键字&#xff1a; PK 知识点&#xff1a…...

飞书企业消息实践

一、飞书自带的消息机器人限制 频控策略 - 服务端 API - 飞书开放平台 自定义机器人的频率控制和普通应用不同&#xff0c;为单租户单机器人 100 次/分钟&#xff0c;5 次/秒。建议发送消息尽量避开诸如 10:00、17:30 等整点及半点时间&#xff0c;否则可能出现因系统压力导致…...

逆向安卓抓包

打开Mumu网易&#xff0c;打开设置&#xff0c;打开其他&#xff0c;开启root权限 打开Mumu网易&#xff0c;找到apk安装藏航准备网.apk charles配置&#xff1a;proxy setting 端口9888 查看当地IP:help--->local IP address SSL Proxying Setting--->Add---->IP…...

简单的spring boot tomcat版本升级

简单的spring boot tomcat版本升级 1. 需求 我们使用的springboot版本为2.3.8.RELEASE&#xff0c;对应的tomcat版本为9.0.41&#xff0c;公司tomcat对应版本发现攻击者可发送不完整的POST请求触发错误响应&#xff0c;从而可能导致获取其他用户先前请求的数据&#xff0c;造…...

导出中心设计

业务背景 应用业务经常需要导出数据&#xff0c;但是并发的导出以及不合理的导出参数常常导致应用服务的内存溢出、其他依赖应用的崩溃、导出失败&#xff1b;因此才有导出中心的设计 设计思想 将导出应用所需的内存转移至导出中心&#xff0c;将导出的条数加以限制&#xf…...

zookeeper 数据类型

文章目录 引言I Znodezonde stat (状态信息)znode类型临时\永久序列化特性引言 在结构上与标准文件系统非常类似,拥有一个层次的命名空间,都是采用树形层次结构 Zookeeper树中的每个节点被称为:Znode,没有文件和目录之分。Znode兼具文件和目录两种特点Znode存储数据大小有…...

INT305 Machine Learning

W1 Introduction Nearest Neighbor Preliminaries and Nearest Neighbor Methods • Suppose we’re given a novel input vector &#x1d465; we’d like to classify. • The idea: find the nearest input vector to &#x1d465; in the training set and copy …...

OneFlow和PyTorch在性能上有哪些区别?

OneFlow 和 PyTorch 在性能上的区别主要体现在以下几个方面&#xff1a; 本篇文章的目录 分布式训练性能 硬件利用率和显存优化 模型训练速度 OneFlow&#xff1a;默认采用静态图模式&#xff0c;在模型训练前会对计算图进行编译优化&#xff0c;能够减少运行时的开销&…...

Java高频面试之SE-09

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本牛马baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; final关键字有什么作用&#xff1f; 在 Java 中&#xff0c;final 关键字有多个用途&#xff0c;它可以用于类、方法和变量。根据使用的上…...

面向对象(综合练习)

文字版格斗游戏 public class people {private String name;private int xuetiao;public people(String name){this.namename;this.xuetiao100;}public String getName(){return this.name;}public int getXuetiao(){return this.xuetiao;} } import java.util.Random; public…...

《机器学习》——随机森林

文章目录 什么是随机森林&#xff1f;随机森林的原理随机森林的优缺点优点缺点 随机森林模型API主要参数 实例实例步骤导入数据处理数据&#xff0c;切分数据构建模型训练模型测试数据并输出分类报告和混淆矩阵画出模型的前十重要性的特征 扩展 什么是随机森林&#xff1f; -随…...

Synthesia技术浅析(二):虚拟人物视频生成

Synthesia 的虚拟人物视频生成模块是其核心技术之一&#xff0c;能够将文本输入转换为带有同步语音和口型的虚拟人物视频。该模块如下所示&#xff1a; 1.文本输入处理 2.语音生成&#xff08;TTS, Text-to-Speech&#xff09; 3.口型同步&#xff08;Lip Syncing&#xff0…...

kubelet状态错误报错

journalctl -xeu kubelet 执行后的日志如下: -- -- The process exit code is exited and its exit status is 1. Jan 02 14:20:06 iv-ydipyqxfr4wuxjsij0bd systemd[1]: kubelet.service: Failed with result exit-code. -- Subject: Unit failed -- Defined-By: system…...

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(do-while循环语句)

在C编程中&#xff0c;循环结构是一种用于重复执行某段代码直到特定条件不再满足的控制流语句。除了常见的for循环和while循环之外&#xff0c;C还提供了一种特殊的循环结构——do-while循环。这种循环结构在某些场景下非常有用&#xff0c;特别是在需要至少执行一次循环体的情…...

专访“梦想”号总设计师:如何向11000米深海进发

在我国迈向海洋强国的征程中&#xff0c;“梦想” 号钻探船无疑是一颗闪耀的明星。作为我国自主设计建造的首艘大洋钻探船&#xff0c;它肩负着探索深海奥秘、挖掘地球深部资源的重任&#xff0c;承载着无数科研人员的梦想与期望。其总长 179.8 米、型宽 32.8 米&#xff0c;高…...

有限元分析学习——Anasys Workbanch第一阶段笔记(7)对称问题预备水杯案例分析

目录 1 序言 2 水杯案例 2.1 添加新材料 2.2 水压设置 2.3 约束边界条件设置及其结果 2.3.1 全约束固定(压缩桌面、Fixed support固定水杯底面) 2.3.2 单方面位移约束(压缩桌面、Displacement约束软弹簧) 2.3.3 接触约束(不压缩桌面、Fixed support 固定桌面、Frictional…...

【A-Lab】部署手册:开源AAA解决方案 —FreeRADIUS

由于篇幅限制&#xff0c;完整版请移步至部署手册&#xff1a;开源AAA解决方案 —FreeRADIUS - 星融元Asterfusion 1 软件介绍 2 基础环境 2.1 部署环境 2.2 操作系统基础设置 3 安装配置数据库 4 安装配置Web和PHP 5 安装配置FreeRADIUS 6 安装配置DaloRaDIUS 7 部署结…...

配置管理工具和k8s功能重叠部分的优势比较

通过自动化配置管理工具&#xff08;如 Ansible、Puppet、Chef&#xff09;和应用内管理机制&#xff0c;也可以实现自动部署、扩缩容、负载均衡和故障恢复等功能。Kubernetes&#xff08;K8s&#xff09;在这些方面具有哪些独特的优势呢&#xff0c;尤其是在云原生环境和大规模…...

五个不同类型的数据库安装

一、 官方首页下载 打开 MySQL 官方首页&#xff0c;链接为&#xff1a; MySQL 进去社区后选择合适的版本进行安装 安装细节 依图一路next 点击finish结束安装 二、 在线YUM仓库 将该安装包的下载链接在 Linux 操作系统中按照以下命令直接进行下载 三、 二进制本地 通过该链接…...

【万字详细教程】Linux to go——装在移动硬盘里的Linux系统(Ubuntu22.04)制作流程;一口气解决系统安装引导文件迁移显卡驱动安装等问题

Linux to go制作流程 0.写在前面 关于教程Why Linux to go&#xff1f;实际效果 1.准备工具2.制作步骤 下载系统镜像硬盘分区准备启动U盘安装系统重启完成驱动安装将系统启动引导程序迁移到移动硬盘上 3.可能出现的问题 3.1.U盘引导系统安装时出现崩溃3.2.不影响硬盘里本身已有…...

LeetCode 704 如何正确书写一个二分查找

题目链接 中文版&#xff1a;https://leetcode.cn/problems/binary-search/description/ 题目描述 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标…...

LEED绿色建筑认证在2025年相关消息

关于LEED绿色建筑认证在2025年的相关消息&#xff0c;以下是一些关键信息&#xff1a; 一、认证体系的重要性与影响力 LEED&#xff08;能源与环境设计先锋奖&#xff09;评估体系是全球最具影响力的绿色建筑认证标准之一。中国已成为全球第二大LEED认证市场&#xff0c;显示…...

百度Android最新150道面试题及参考答案 (中)

Android 中一个 View 的显示渲染过程,自定义 View 的时候需要避免什么操作? 一、View 的显示渲染过程 测量(Measure)阶段 这个阶段是 View 渲染的第一步。父容器会调用子 View 的measure()方法来确定子 View 的大小。measure()方法会传入两个参数,即MeasureSpec(测量规格…...

详解Redis的Hash类型及相关命令

目录 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET HLEN HSETNX HINCRBY HINCRBYFLOAT 内部编码 应用场景 HSET 设置 hash 中指定的字段&#xff08;field&#xff09;的值&#xff08;value&#xff09;。 语法 HSET key field value [field value ...] 时…...

会议活动管理系统django

完整源码项目包获取→点击文章末尾名片&#xff01;...

【数据结构与算法:七、查找】

第7章 查找 7.1 查找的基本概念 查找是通过某种算法&#xff0c;在一个给定的数据集合中找到目标元素或判断目标元素是否存在的操作。查找效率直接决定了程序性能&#xff0c;尤其在大数据处理场景下&#xff0c;合理选择查找算法至关重要。 查找的基本步骤 确定查找表结构…...

如何使用SparkSql

一、SparkSql的前世今生 Hive->Shark->Spark SQL 二、SparkSql依赖 <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.1.2</version> </dependency> 三、…...

沃尔玛购物卡查询

在平常生活里&#xff0c;沃尔玛卡可不只是一张购物的凭据&#xff0c;它是连着心意的绳子&#xff0c;是让生活方便的小幸福。每次拿着沃尔玛卡走进熟悉的超市大门&#xff0c;心里就会有一点期待和满足。可随着时间过去&#xff0c;可能有些卡就静静躺在抽屉角落&#xff0c;…...

Markdown中流程图的用法

Markdown中流程图图的用法 前言语法详解基本流程图几何图形节点默认的节点分离节点的ID与内容节点形状圆角形节点的语法圆形节点的语法。非对称节点语法菱形节点的语法。六角形节点的语法。平行四边形节点的语法。梯形节点的语法。 连接线基本的连接线语法。无向线段连接线。点…...

Linux的proc目录与什么有关?【以及它里面的文件各自记录着什么信息】

在 Linux 系统中&#xff0c;/proc 目录是一个虚拟文件系统&#xff0c;提供了关于内核、进程和系统状态的实时信息。它与系统的 内核 和 进程 运行状态紧密相关&#xff0c;是系统管理员、开发人员和用户了解系统运行状况的重要途径。 /proc 目录的名称来源于 “process”&am…...