C++学习之路(六)C++ 实现简单的工具箱系统命令行应用 - 示例代码拆分讲解

写一个C++工具类 2. 添加静态成员函数:在类中添加静态成员函数,这些函数将提供各种实用的功能。4. 提供头文件和源文件:将工具类的声明放在头文件中,并将实现放在源文件中。1. 定义类:首先,需要定义一个类来表示工具类。可以选择将其定义为静态类,这样就不需要创建对象来使用工具函数。C++工具类是一种封装了一组相关功能的类,用于提供常用的工具函数或方法。5. 编译和使用:将源文件编译为可执行文件或库文件,并在其他项目中使用该工具类。这是一个简单的C++工具类示例,你可以根据自己的需求扩展和修改工具类的功能。 阅读详情

简单的工具箱系统示例介绍:

这个示例展示了一个简单的工具箱框架,它涉及了几个关键概念和知识点:

  1. 面向对象编程 (OOP):使用了类和继承的概念。Tool 是一个纯虚类,CalculatorTool 和 FileReaderTool 是其派生类。

  2. 多态:通过将不同类型的工具对象放入同一个容器中,实现了多态,能够根据用户输入执行不同的工具。

  3. STL 容器 (std::map):使用了 std::map 作为工具箱的存储容器,将工具名称映射到相应的工具对象。

  4. 文件输入输出:在 FileReaderTool 中展示了如何使用文件输入输出流来读取文件内容。

  5. 异常处理:在 CalculatorTool 中检查除数是否为零,避免出现除以零的情况。

这个示例提供了一个基础框架,能够让用户扩展和添加新的工具到工具箱中,并在运行时选择和执行这些工具。它展示了如何使用面向对象的思想创建可扩展的程序结构,并利用 C++ 的特性和标准库来实现这一点。
在这里插入图片描述

功能和概述:

  1. 工具箱功能:用户可以通过添加不同的工具(例如计算器、文件读取器)扩展工具箱。每个工具都执行特定的任务。

  2. 用户交互:程序在运行时会列出所有可用的工具,并要求用户输入要执行的工具名称。用户可以通过输入工具名称来选择要执行的功能。

  3. 多态执行:使用多态性,不同类型的工具对象存储在同一个容器中,通过执行基类 Tool 的虚函数 execute() 来实现不同工具的执行。

  4. 异常处理:在计算器工具中,程序会检查用户输入的除数是否为零,并进行相应的异常处理,避免出现除以零的情况。

  5. C++ 特性应用:使用了面向对象编程的概念,包括类、继承和虚函数,以及标准库中的 std::map 和输入输出流。

这个框架提供了一个基础结构,可用作添加更多功能的起点,用户可以根据需求扩展和修改工具箱,并通过添加新的工具类来实现更多的功能。


示例在Clion中运行步骤:

1. 新建项目

在这里插入图片描述

2. 粘贴代码
#include <iostream>
#include <map>
#include <functional>
#include <fstream>

// 工具基类
class Tool {
public:
    virtual void execute() = 0;
    virtual ~Tool() = default;
};

// 示例工具类:计算器
class CalculatorTool : public Tool {
public:
    void execute() override {
        std::cout << "Executing Calculator Tool..." << std::endl;
        double num1, num2;
        char op;
        std::cout << "Enter first number: ";
        std::cin >> num1;
        std::cout << "Enter operator (+, -, *, /): ";
        std::cin >> op;
        std::cout << "Enter second number: ";
        std::cin >> num2;

        double result;
        switch (op) {
            case '+':
                result = num1 + num2;
                break;
            case '-':
                result = num1 - num2;
                break;
            case '*':
                result = num1 * num2;
                break;
            case '/':
                if (num2 != 0) {
                    result = num1 / num2;
                } else {
                    std::cout << "Error! Division by zero is not allowed." << std::endl;
                    return;
                }
                break;
            default:
                std::cout << "Invalid operator." << std::endl;
                return;
        }

        std::cout << "Result: " << result << std::endl;
    }
};

// 示例工具类:文件读取器
class FileReaderTool : public Tool {
public:
    void execute() override {
        std::cout << "Executing File Reader Tool..." << std::endl;
        std::string filename;
        std::cout << "Enter file name to read: ";
        std::cin >> filename;

        std::ifstream file(filename);
        if (file.is_open()) {
            std::string line;
            while (std::getline(file, line)) {
                std::cout << line << std::endl;
            }
            file.close();
        } else {
            std::cout << "Failed to open file." << std::endl;
        }
    }
};

// 工具箱
class Toolbox {
private:
    std::map<std::string, std::unique_ptr<Tool>> tools;

public:
    // 添加工具到工具箱
    void addTool(const std::string &name, std::unique_ptr<Tool> tool) {
        tools[name] = std::move(tool);
    }

    // 列出所有可用工具
    void listTools() {
        std::cout << "Available tools: ";
        for (const auto &tool : tools) {
            std::cout << tool.first << ", ";
        }
        std::cout << std::endl;
    }

    // 执行特定工具
    void executeTool(const std::string &name) {
        auto it = tools.find(name);
        if (it != tools.end()) {
            it->second->execute();
        } else {
            std::cout << "Tool not found." << std::endl;
        }
    }
};

int main() {
    Toolbox toolbox;

    // 创建工具对象并添加到工具箱中
    toolbox.addTool("Calculator", std::make_unique<CalculatorTool>());
    toolbox.addTool("FileReader", std::make_unique<FileReaderTool>());

    // 列出所有可用工具
    toolbox.listTools();

    // 执行特定工具
    std::string selectedTool;
    std::cout << "Enter tool name to execute: ";
    std::cin >> selectedTool;
    toolbox.executeTool(selectedTool);

    return 0;
}

3. 编译运行

在这里插入图片描述
在这里插入图片描述

代码拆解,知识点总结

让我们逐步分解和解释这个示例:

🟥 1. 引入头文件和命名空间

#include <iostream>
#include <map>
#include <functional>
#include <fstream>

这部分代码引入了所需的标准库头文件,包括用于输入输出的 iostream,用于映射的 map,用于函数对象的 functional 和文件流的 fstream。同时,使用了 std 命名空间。


Tips: 📢 什么是 functional ?

<functional> 是 C++ 标准库中的头文件,它提供了一组函数对象,以及用于操作函数的工具。函数对象是可调用对象(callable object),可以像函数一样使用。这个头文件提供了很多功能,主要包括以下几个方面:

  1. 函数对象 (Function Objects):包括各种函数对象,如 std::function、std::bind、std::placeholders 等。这些函数对象允许您以更灵活的方式处理函数,例如将函数作为参数传递给其他函数,或者将函数与特定参数绑定在一起。

  2. 函数适配器 (Function Adapters):提供了一些函数适配器,例如 std::bind 和 std::mem_fn,它们允许您更改函数的行为或结构。

  3. 一些工具性质的功能:比如 std::reference_wrapper,它允许将引用封装为可复制的对象,方便函数接受引用参数。

使用 <functional> 头文件,您可以更方便地处理函数式编程、函数组合和函数对象。例如,std::function 允许您将函数作为参数传递给其他函数,std::bind 允许您绑定参数到函数,创建新的函数对象等。

这个头文件提供了许多功能,使得 C++ 中的函数操作更加灵活和便捷。


🟥 2. Tool 类

class Tool {
public:
    virtual void execute() = 0;
    virtual ~Tool() = default;
};

这里定义了一个抽象基类 Tool,它包含一个纯虚函数 execute(),这个函数没有实现,需要在派生类中具体实现。另外,声明了虚析构函数,使得这个类可以作为多态基类。


Tips: 📢 virtual void 和 virtual ~Tool() = default 是什么意思?

这两个内容涉及到 C++ 中的虚函数和虚析构函数的概念。

virtual void execute() = 0;

这行代码定义了一个纯虚函数 execute()。虚函数是在基类中声明为虚函数的函数,在派生类中可以进行重写。纯虚函数没有具体的实现,它的目的是让派生类强制实现该函数。类中包含纯虚函数的类称为抽象类,抽象类不能被实例化,只能被用作其他类的基类。在这个例子中,Tool 类定义了一个纯虚函数 execute(),所有继承自 Tool 的类都必须提供自己的 execute() 函数的实现。

virtual ~Tool() = default;

这行代码定义了一个虚析构函数。虚析构函数是用来释放内存的,通常当一个基类指针指向一个派生类对象时,如果基类的析构函数不是虚函数,那么当通过基类指针删除对象时,只会调用基类的析构函数而不会调用派生类的析构函数,可能会导致内存泄漏。所以将基类的析构函数声明为虚函数能够确保通过基类指针删除派生类对象时正确地调用派生类的析构函数。virtual ~Tool() = default; 表示使用默认实现的虚析构函数,即使用编译器生成的默认析构函数。

为什么要写成 virtual void execute() = 0 ?

在 C++ 中,将一个函数声明为纯虚函数(Pure Virtual Function)可以通过在函数声明末尾加上 = 0 来实现。这种写法告诉编译器,这个函数在基类中没有实际的实现,派生类必须提供自己的实现才能创建对象。

纯虚函数实际上是一个占位符,它为派生类提供了一个契约:如果你要成为这个基类的子类,你必须提供这个函数的实际实现。这种机制使得基类能够定义一组接口,但不提供具体的实现,而是将实现的责任交给派生类。

写成 = 0 的语法是 C++ 中定义纯虚函数的标准方式。这样做有两个主要原因:

  1. 为了让编译器理解这是一个纯虚函数,因此任何派生类都需要提供它的实现。
  2. 如果一个类包含了纯虚函数,它就不能被直接实例化,只能被用作其他类的基类,这种情况下它就成为了抽象类。

因此,使用 = 0 是 C++ 中约定的方法,告诉编译器这是一个纯虚函数。


🟥 3. 示例工具类:CalculatorTool 和 FileReaderTool

class CalculatorTool : public Tool {
public:
    void execute() override {
        // ... 实现了简单的计算器功能 ...
    }
};

class FileReaderTool : public Tool {
public:
    void execute() override {
        // ... 实现了文件读取器功能 ...
    }
};

这部分代码展示了两个派生类,分别是 CalculatorTool 和 FileReaderTool。它们继承自 Tool 类,并重写了 execute() 方法,实现了各自的功能。

Tips: 📢 加 public 是什么意思?还有什么其他方式吗?

这段代码定义了一个名为 CalculatorTool 的类,它是 Tool 类的公有派生类。这意味着 CalculatorTool 类继承了 Tool 类的成员和方法,并且可以在其基础上添加自己的成员和方法。

这种继承关系使得 CalculatorTool 类拥有 Tool 类的特性,并且可以通过重写(覆盖)Tool 类中的虚函数来实现自己特定的行为。继承允许在不重复编写相同代码的情况下,扩展已有类的功能,这有助于代码的复用和扩展。

在这里,CalculatorTool 类继承了 Tool 类的一些特性,可能包括一些成员函数、虚函数或其他成员。同时,CalculatorTool 类可以添加自己特有的功能,例如实现 execute() 函数以执行特定的计算器功能。


在 C++ 中,public 是一种访问控制修饰符,它用于指定类成员的访问级别。在这里,class CalculatorTool : public Tool 中的 public 关键字表示派生类 CalculatorTool 继承自基类 Tool 并且继承的是基类中的公有成员。

访问控制修饰符包括三种:public、protected 和 private。它们决定了派生类对基类的继承成员的访问权限:

  • public 继承意味着基类中的公有成员在派生类中仍然是公有的,基类的保护和私有成员在派生类中不可直接访问。
  • protected 继承意味着基类中的公有和保护成员在派生类中都变为保护成员,基类的私有成员在派生类中不可直接访问。
  • private 继承意味着基类中的所有成员都变为派生类的私有成员,不可在派生类之外访问。

除了 public 继承之外,还有 protected 和 private 继承。这些继承方式决定了派生类对基类成员的访问权限。

class Derived : protected Base {
    // 在这里,Derived 是 protected 继承自 Base
    // Base 中的公有成员在 Derived 中变成了 protected
};

class Derived : private Base {
    // 在这里,Derived 是 private 继承自 Base
    // Base 中的所有成员在 Derived 中都变成了 private
};

但一般情况下,使用 public 继承是最常见和推荐的方式,因为它保持了基类的接口,并且能够更加清晰地表达派生类和基类之间的关系。


🟥 4. Toolbox 类

class Toolbox {
private:
    std::map<std::string, std::unique_ptr<Tool>> tools;

public:
    void addTool(const std::string &name, std::unique_ptr<Tool> tool) {
        // ... 将工具名称和对象关联存储到map中 ...
    }

    void listTools() {
        // ... 列出所有可用工具 ...
    }

    void executeTool(const std::string &name) {
        // ... 执行特定工具 ...
    }
};

这个类用来管理工具。它包含一个私有成员 tools,这是一个 map,将工具名称与对应的工具对象关联起来。addTool() 方法用于向工具箱中添加工具,listTools() 方法用于列出所有可用的工具,executeTool() 方法根据用户输入的名称执行相应的工具。


Tips: 📢 有关 std::map 知识点讲解

std::map<std::string, std::unique_ptr<Tool>> tools; 这段代码定义了一个名为 tools 的成员变量,它是一个 std::map 对象。让我来解释一下:

  • std::map 是 C++ 标准库中的关联容器,它提供了键值对(key-value)的存储机制,允许使用一个键来快速检索相关联的值。
  • 在这个例子中,std::map 使用了两个模板参数:std::string 和 std::unique_ptr<Tool>。它将字符串(std::string)作为键,将指向 Tool 类对象的独占指针(std::unique_ptr<Tool>)作为值。
  • 意思是 tools 这个 map 变量能够通过字符串键来快速存储和检索不同的工具对象。

例如,可以用这个 tools map 来存储不同的工具,每个工具都有一个与之对应的字符串名称。这样,通过工具的名字就能够方便地获取对应的工具对象。

例如:

std::map<std::string, std::unique_ptr<Tool>> tools;

// 添加一个名为 "calculator" 的计算器工具
tools["calculator"] = std::make_unique<CalculatorTool>();

// 添加一个名为 "fileReader" 的文件读取器工具
tools["fileReader"] = std::make_unique<FileReaderTool>();

// 通过名称获取特定工具
std::string selectedToolName = "calculator";
auto selectedTool = tools[selectedToolName]; // 获取名为 "calculator" 的工具
selectedTool->execute(); // 执行对应的工具操作

这段代码展示了如何向 tools map 中添加不同的工具,并通过名称检索和执行特定的工具操作。


🟥 5. main() 函数

int main() {
    Toolbox toolbox;

    // ... 添加工具到工具箱中 ...

    toolbox.listTools();
    std::string selectedTool;
    std::cout << "Enter tool name to execute: ";
    std::cin >> selectedTool;
    toolbox.executeTool(selectedTool);

    return 0;
}

在 main() 函数中,创建了一个 Toolbox 对象,并添加了具体的工具到工具箱中。然后列出了所有可用的工具,等待用户输入工具名称,最后执行用户选择的工具。

这个拆解旨在展示这个程序的基本结构和主要组成部分。每个部分都有其特定的功能,通过彼此协作来实现整体的功能。


Tips: 📢 别忘了跑起来,检查检查有没有BUG ~ 😁


本文就到这里了,感谢您的阅读,明天还有更多的实例学习文章等着你 🎆。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇。

【c/c++】C++静态工具类和单例模式对比学习 C++(伪)静态工具类,单例模式,单例模式,懒汉模式,饿汉模式,Meyer单例,静态类和单例模式的选择 阅读详情

相关推荐

C/C++常用库及工具

NetBSD是一个免费的,具有高度移植性的 UNIX-like 操作系统,是现行可移植平台最多的操作系统,可以在许多平台上执行,从 64bit alpha 服务器到手持设备和嵌入式设备。由于简洁的设计和先进的特征,使得它在生产和研究方面,都有卓越的表现,而且它也有受使用者支持的完整的源代码。让我脸红的是Lua的源代码,百分之一百的ANSI C,一点都不掺杂。开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Http Server 的本质。

2301_77162959的博客 1179

【C/C++学院】(17)QT标准对话框/toolbox类

1.标准对话框 各种基本对话框通过调用格子不同的静态函数来完成其功能: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPushButton> class Widget : public QWidget { Q_OBJECT p...

weixin_34272308的博客 258

C++实现整型数值的拆分

通过传入一个整型数num和一个整型数组num_pro将num的每一位存入到数组num_pro中。 #include <iostream> #include<iomanip> using namespace std; int numProcess(int num,int * num_pro) { int diget=0; int num_befor=n...

小鸡撞大叔 2165

C++设计模式(8)——命令模式

C++ 命令模式

伍粟的博客 2243

拆分C++源程序

源程序为: // proj1.cpp: 定义控制台应用程序的入口点。 //使程序的输出为:1 2 3 4 5 6 7 8 9 10 // #include "stdafx.h" #include using namespace std; class MyClass { public: MyClass(int len) { array = new int[len]; arr

guoliangstyle的博客 1241

C++工具类-常用工具类源码

c++常用的工具类源码 包括:文件处理,编码处理,字符串处理,网络爬虫,网页数据的抓取 ,可根据数组规则抓取指定网页的内容(有一个例子)等等

C++学习之路(十二)C++ 用Qt5实现一个工具箱(增加一个XML文本格式化功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《进制转换器功能》功能。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 XML文本格式化 」功能。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 674

Veritas NetBackup 10.1 Windows安装指南:从账户配置到完整部署

本文详细介绍了Veritas NetBackup 10.1在Windows系统上的完整安装流程,从账户配置到部署验证。重点讲解了创建专用服务账户、安装组件选择、许可证输入等关键步骤,并提供了常见问题排查和进阶配置建议,帮助用户顺利完成企业级备份解决方案的部署。

weixin_26765287的博客 454

C++学习之路(十三)C++ 用Qt5实现一个工具箱(增加一个Base64加解密功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《XML文本格式化功能》功能。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 Base64加解密 」功能。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 1267

GPU服务器选购避坑指南:从硬件配置到场景化性能调优

本文提供GPU服务器选购的全面指南,涵盖硬件架构解析、应用场景配置策略和性能调优实践。针对大模型训练、推理服务和科学计算等场景,详细分析GPU选型、内存带宽匹配和散热设计等关键因素,帮助技术决策者避免常见配置误区,实现成本效益最大化。

peace的博客 1030

Redmi K30 5G刷 LineageOS17.1

前言 买手机前就观望了Xdr论坛,看Redmi K30 5G有LineageOS17.1的Rom并且还挺热,应该还不错,就入手了。晚上就刷机了。买了小米就是为了折腾,为发烧而生。 在开始前还请先安装adb工具,因为我自己是做Android开发的,自带adb,不会安装的可以百度“Android安装adb工具”。还有下载刷机文件:百度云 密码:2a0f 刷机的系统是刚买来的低版本,没有升级过Rom,如果高版本慎刷。 还有这个Rom是5G版本的,4G版本的不要刷。 建议没有刷过机器的最好不要尝试,变砖后果自负。

u010436867的博客 1万+

C++学习之路(十七)C++ 用Qt5实现一个工具箱(增加托盘图标并且增加显示和退出菜单)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《为屏幕颜色提取功能增加一个点击复制的功能》功能。今天我们增加一个比较正式点的功能,就是增加托盘图标并且增加显示和退出菜单(越来越像回事了吧 😁 )。下面我们就来看看如何来规划开发这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 1379

某讯天御滑块验证码逆向实战:从参数解析到环境对抗

本文详细解析了某讯天御滑块验证码的逆向工程实战技巧,从关键参数解析到浏览器环境模拟对抗。重点介绍了collect、eks等参数的逆向思路,以及如何通过puppeteer等工具补全环境检测,帮助开发者有效突破验证码防护。文章还提供了常见错误解决方案和性能优化建议,是验证码逆向领域的实用指南。

weixin_29325007的博客 437

C++学习之路(十四)C++ 用Qt5实现一个工具箱(增加一个Base64图片编码预览功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《Base64加解密功能》功能。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 Base64图片预览 」功能。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 991

YOLOv8 ultralytics使用笔记----labelme标记数据,训练模型、追踪目标。

Ultralytics是一个Python库,它是为执行高级计算机视觉任务而创建的,如对象检测、实例分割、图像分类等。Ultralytics为YOLO模型发布了一个全新的存储库,它被构建为用于机器视觉统一框架。这里先利用,并激活。

qq_48050838的博客 1万+

SAR动目标检测三剑客:DPCA/ATI/STAP技术选型指南(含2023最新实验数据对比)

本文深入对比了SAR动目标检测三大主流技术DPCA、ATI与STAP的核心原理与性能差异。基于2023年最新实验数据,分析了它们在最小可检测速度、测速精度、计算复杂度及对通道失配敏感度等方面的优劣,并结合海洋监视与城市交通监控等典型场景,提供了具体的技术选型指南与工程落地考量。

m5n6o7的博客 293

C++学习之路(四)C++ 实现简单的待办事项列表命令行应用 - 示例代码拆分讲解

本期示例《待办事项列表应用》展示了一个简单的任务管理系统,用户可以通过命令行界面执行添加任务、删除任务和显示任务列表等操作。让我们来拆分讲解一下这个待办事项列表应用,我们可以逐步解释每个部分的作用和实现。

天河书阁 - VicRestart 929

【AI智能体】QClaw 对接GitHub处理自动化任务实战操作详解

QClaw 对接GitHub处理自动化任务实战操作详解

congge 4869

C++学习之路(五)C++ 实现简单的文件管理系统命令行应用 - 示例代码拆分讲解

本期文件管理系统示例是一个简单的命令行程序,允许用户进行文件的创建、读取、追加内容和删除操作。这个示例涉及了一些基本的文件操作和用户交互。创建文件 (用户可以输入文件名和内容,创建新的文件。读取文件 (readFile()用户可以输入文件名,读取并显示文件的内容。追加文件内容 (用户可以输入文件名和内容,将新内容追加到已存在的文件末尾。删除文件 (用户可以输入文件名,删除指定的文件。当我们拆分讲解这个文件管理系统示例时,可以按照功能模块来逐步解释每个部分的作用和实现。

天河书阁 - VicRestart 903

亚马逊跨境电商选品数据分析:Python爬虫实战指南

本文将带领大家构建一套完整的亚马逊选品数据采集与分析系统,使用最新的Python技术栈,从零开始爬取亚马逊商品数据,并进行深度分析。

2201_76125261的博客 299

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++学习之路(十六)C++ 用Qt5实现一个工具箱(为屏幕颜色提取功能增加一个点击复制的功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《颜色代码转换和屏幕颜色提取功能》功能。今天我们把屏幕颜色提取的功能再扩展一下,让它可以点击复制吧。下面我们就来看看如何来规划开发这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 1102

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++学习之路(十八)C++ 用Qt5实现一个工具箱(点击按钮以新窗口打开功能面板)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《增加托盘图标并且增加显示和退出菜单》功能。今天我们把按钮打开功能的方式改一改,让点击按钮以新窗口打开功能面板。下面我们就来看看如何来规划开发这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 1300

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++学习之路(八)C++ 用Qt5实现一个工具箱(增加一个粘贴板记录管理功能)- 示例代码拆分讲解

昨天,我们用 Qt5 实现了一个小工具箱的雏形《C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)》,但是没什么实用价值。为了增加点作用,我们今天就为这个小工具箱增加第一个小功能 「 粘贴板记录管理功能 」,下面我们就来看看如何来规划开发一个这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 682

C++学习之路(十五)C++ 用Qt5实现一个工具箱(增加16进制颜色码转换和屏幕颜色提取功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《Base64图片编码预览功能》功能。为了继续丰富我们的工具箱,今天我们就再增加两个平时经常用到的功能吧,就是「 16进制颜色码转RGB文本 」和 「屏幕颜色提取」功能。下面我们就来看看如何来规划开发这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 1247

C++学习之路(十)C++ 用Qt5实现一个工具箱(增加一个时间戳转换功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《JSON数据格式化》功能,还是比较实用的。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 时间戳转换 」功能,而且实现点击按钮后文字进行变更的处理逻辑。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 694

C++学习之路(九)C++ 用Qt5实现一个工具箱(增加一个JSON数据格式化功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《粘贴板记录管理》功能,用着还不错哈。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 JSON数据格式化 」功能。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 626
上一篇: C++学习之路(五)C++ 实现简单的文件管理系统命令行应用 - 示例代码拆分讲解
下一篇: C++学习之路(七)C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)- 示例代码拆分讲解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天河书阁 VicRestart

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值