Qt 第29课、主窗口中的状态栏

2023-11-15

1、主窗口中的状态栏

  • 状态栏的概念和意义
    — 状态栏是应用程序中输出简要信息的区域
    — 状态栏一般位于主窗口的最底部
    — 状态栏的消息类型
     实时消息:如(当前程序状态)
     永久消息:如(程序版本号,机构名称)
     进度消息:如(进度条提示,百分比提示)
  • 在 Qt 中提供与状态栏相关的类组件
    在这里插入图片描述
  • 在 Qt 主窗口中创建状态栏
    在这里插入图片描述
  • Qt 状态栏的设计原则
    左边的区域用于输出实时消息
    右边的区域用于设置永久消息
    addWidget 在状态栏的左半部分添加组件
    addPermanentWidget 在状态栏的右半部分添加组件

状态栏初体验:

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
};
#endif // MAINWINDOW_H

MainWindow.cpp

#include "MainWindow.h"

#include <QStatusBar>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{
    QStatusBar* sb = statusBar();
    
    QLabel* label = new QLabel("label");
    QLineEdit* edit = new QLineEdit("edit");
    QPushButton* btn = new QPushButton("btn");

    sb->addPermanentWidget(label);
    sb->addPermanentWidget(edit);
    sb->addPermanentWidget(btn);
    
    sb->showMessage("xiebs");

}

MainWindow::~MainWindow()
{
}

main.cpp

#include "MainWindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

在这里插入图片描述
记事本程序:

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    MainWindow();
    MainWindow(const MainWindow& obj);
    MainWindow& operator= (const MainWindow& obj);

    bool construct();

    bool initMenuBar();
    bool initToolBar();
    bool initStatusBar();

    bool initFileMenu(QMenuBar* mb);
    bool initEditMenu(QMenuBar* mb);
    bool initFormatMenu(QMenuBar* mb);
    bool initViewMenu(QMenuBar* mb);
    bool initHelpMenu(QMenuBar* mb);

    bool initFileToolItem(QToolBar* tb);
    bool initEditToolItem(QToolBar* tb);
    bool initFormatToolItem(QToolBar* tb);
    bool initViewToolItem(QToolBar* tb);

    bool makeAction(QAction*& action, QString str, int key);
    bool makeAction(QAction*& action, QString tip, QString res);

public:
    static MainWindow* NewInstance();

    ~MainWindow();
};
#endif // MAINWINDOW_H

MainWindow.cpp

#include "MainWindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QToolBar>
#include <QIcon>
#include <QSize>
#include <QStatusBar>
#include <QLabel>


MainWindow::MainWindow(): QMainWindow()
{

}

bool MainWindow::construct()
{
    bool ret = true;

    ret = ret && initMenuBar();
    ret = ret && initToolBar();
    ret = ret && initStatusBar();

    return ret;
}

MainWindow* MainWindow::NewInstance()
{
    MainWindow* ret = new MainWindow();
    if(!(ret && ret->construct()))
    {
        delete ret;
        ret = nullptr;
    }

    return ret;
}

bool MainWindow::initMenuBar()
{
    bool ret = true;
    QMenuBar* mb = menuBar();
    if(mb != nullptr)
    {
        ret = ret && initFileMenu(mb);
        ret = ret && initEditMenu(mb);
        ret = ret && initFormatMenu(mb);
        ret = ret && initViewMenu(mb);
        ret = ret && initHelpMenu(mb);
    }
    else
    {
        ret = false;
    }

    return ret;
}

bool MainWindow::initToolBar()
{
    bool ret = true;
    QToolBar* tb = addToolBar("ToolBar");

    tb->setFloatable(false);
    tb->setMovable(false);
    tb->setIconSize(QSize(16, 16));

    ret = ret && initFileToolItem(tb);
    tb->addSeparator();

    ret = ret && initEditToolItem(tb);
    tb->addSeparator();

    ret = ret && initFormatToolItem(tb);
    tb->addSeparator();

    ret = ret && initViewToolItem(tb);

    return ret;
}

bool MainWindow::initStatusBar()
{
    bool ret = true;
    QStatusBar* sb = statusBar();

    QLabel* label = new QLabel("D.T.software");
    if(label != nullptr)
    {
        sb->addPermanentWidget(label);
        label->setMinimumWidth(40);
        label->setAlignment(Qt::AlignCenter);
    }
    else
    {
        ret = false;
    }

    return ret;
}

bool MainWindow::initFileMenu(QMenuBar* mb)
{
    QMenu* menu = new QMenu("File(&F)", nullptr);
    bool ret = (menu != nullptr);
    if(ret)
    {
        QAction* action = nullptr;

        ret = ret && makeAction(action, "New(&N)", Qt::CTRL + Qt::Key_N);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Open(&O)", Qt::CTRL + Qt::Key_O);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Save(&N)", Qt::CTRL + Qt::Key_S);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Save As(&A)", Qt::CTRL + Qt::SHIFT + Qt::Key_S);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Print(&P)", Qt::CTRL + Qt::Key_P);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Exit(&X)", 0);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();
    }

    if(ret)
    {
        mb->addMenu(menu);
    }
    else
    {
        delete menu;
    }
    return ret;
}

bool MainWindow::initEditMenu(QMenuBar* mb)
{
    QMenu* menu = new QMenu("Edit(&E)", nullptr);
    bool ret = (menu != nullptr);
    if(ret)
    {
        QAction* action = nullptr;
        ret = ret && makeAction(action, "Undo(&U)", Qt::CTRL + Qt::Key_Z);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Redo(&R)", Qt::CTRL + Qt::Key_Y);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Cut(&T)", Qt::CTRL + Qt::Key_X);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Copy(&C)", Qt::CTRL + Qt::Key_C);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Paste(&P)", Qt::CTRL + Qt::Key_V);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Delete(&L)", Qt::Key_Delete);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Find(&F)", Qt::CTRL + Qt::Key_F);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Replace(&R)", Qt::CTRL + Qt::Key_H);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Goto(&G)", Qt::CTRL + Qt::Key_G);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Select All(&A)", Qt::CTRL + Qt::Key_A);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();
    }

    if(ret)
    {
        mb->addMenu(menu);
    }
    else
    {
        delete menu;
    }
    return ret;
}

bool MainWindow::initFormatMenu(QMenuBar* mb)
{
    QMenu* menu = new QMenu("Format(&O)", nullptr);
    bool ret = (menu != nullptr);
    if(ret)
    {
        QAction* action = nullptr;
        ret = ret && makeAction(action, "AutoWrap(&W)", 0);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "Font(&F)", 0);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

    }

    if(ret)
    {
        mb->addMenu(menu);
    }
    else
    {
        delete menu;
    }
    return ret;
}

bool MainWindow::initViewMenu(QMenuBar* mb)
{
    QMenu* menu = new QMenu("View(&V)", nullptr);
    bool ret = (menu != nullptr);
    if(ret)
    {
        QAction* action = nullptr;
        ret = ret && makeAction(action, "ToolBar(&T)", 0);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "StatusBar(&S)", 0);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

    }

    if(ret)
    {
        mb->addMenu(menu);
    }
    else
    {
        delete menu;
    }
    return ret;
}

bool MainWindow::initHelpMenu(QMenuBar* mb)
{
    QMenu* menu = new QMenu("Help(&H)", nullptr);
    bool ret = (menu != nullptr);
    if(ret)
    {
        QAction* action = nullptr;
        ret = ret && makeAction(action, "User Manual", 0);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

        ret = ret && makeAction(action, "About NotePad...", 0);
        if(ret)
        {
            menu->addAction(action);
        }
        menu->addSeparator();

    }

    if(ret)
    {
        mb->addMenu(menu);
    }
    else
    {
        delete menu;
    }
    return ret;
}

bool MainWindow::initFileToolItem(QToolBar* tb)
{
    bool ret = true;
    QAction* action = nullptr;

    ret = ret && makeAction(action, "New", ":/res/pic/new.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, "Open", ":/res/pic/open.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, "Save", ":/res/pic/save.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, "Save as", ":/res/pic/saveas.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, "Print", ":/res/pic/print.png");
    if(ret)
    {
        tb->addAction(action);
    }

    return ret;
}

bool MainWindow::initEditToolItem(QToolBar* tb)
{
    bool ret = true;
    QAction* action = nullptr;

    ret = ret && makeAction(action, "Undo", ":/res/pic/undo.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, "Redo", ":/res/pic/redo.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, "Cut", ":/res/pic/cut.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, "Copy", ":/res/pic/copy.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, "Paste", ":/res/pic/paste.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, "Find", ":/res/pic/find.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, "Replace", ":/res/pic/replace.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, "Goto", ":/res/pic/goto.png");
    if(ret)
    {
        tb->addAction(action);
    }

    return ret;
}

bool MainWindow::initFormatToolItem(QToolBar* tb)
{
    bool ret = true;
    QAction* action = nullptr;

    ret = ret && makeAction(action, "Wrap", ":/res/pic/wrap.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, "Font", ":/res/pic/font.png");
    if(ret)
    {
        tb->addAction(action);
    }

    return ret;
}

bool MainWindow::initViewToolItem(QToolBar* tb)
{
    bool ret = true;
    QAction* action = nullptr;

    ret = ret && makeAction(action, "Tool", ":/res/pic/tool.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, "Status", ":/res/pic/status.png");
    if(ret)
    {
        tb->addAction(action);
    }

    return ret;
}

bool MainWindow::makeAction(QAction*& action, QString str, int key)
{
    bool ret = true;
    action = new QAction(str, nullptr);
    if(action != nullptr)
    {
        action->setShortcut(QKeySequence(key));
    }
    else
    {
        ret = false;
    }
    return ret;
}

bool MainWindow::makeAction(QAction*& action, QString tip, QString res)
{
    bool ret = true;
    action = new QAction("", nullptr);
    if(action != nullptr)
    {
        action->setToolTip(tip);
        action->setIcon(QIcon(res));
    }
    else
    {
        ret = false;
    }
    return ret;
}


MainWindow::~MainWindow()
{

}

main.cpp

#include "MainWindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    int ret = 0;

    MainWindow* w = MainWindow::NewInstance();
    if(w != nullptr)
    {
        w->show();
        ret = a.exec();
    }
    delete w;

    return ret;
}

在这里插入图片描述

  • 小结:
    — 状态栏是程序中输出简要信息的区域
    QStatusBar 是 Qt 中创建状态栏组件的类
    QStatusBar 中可以添加任意的QWidget
    QStatusBar 有自己内置的设计原则
    QStatusBar 可以定制出各种形式的状态栏
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 第29课、主窗口中的状态栏 的相关文章

  • 从 Qt 更改屏幕分辨率?

    我想更改屏幕分辨率 然后使用一个 ActiveX 控件 Flash 播放器 进入全屏 显然 仅适用于 Windows 的解决方案就可以了 有 Qt api 吗 还是我需要深入研究 winapi 如果是这样 我该在哪里查找 关键字 谢谢您的帮
  • 在Qt中,如何正确实现委托?

    我遵循模型 视图 控制器范例 我很确定模型和视图是正确的 但我认为我的代表做错了一些事情 一切都 有效 除了第一次单击控件只是 点亮控件 而第二次单击与之交互之外 这是代表通常的实施方式吗 我的实现需要大量的构造和销毁 由scoped pt
  • QFileDialog 作为 TableView 的编辑器:如何获取结果?

    我正在使用一个QFileDialog作为某些专栏的编辑QTableView 这基本上有效 对一些焦点问题取模 请参阅here https stackoverflow com questions 22854242 qfiledialog as
  • cmake 找不到 Qt4

    由于4 8 0已经发布 我重新安装了Qt 现在我也想使用cmake 为了使 cmake 工作 我记得必须添加 mingw bin 文件夹 QtSDK Desktop Qt 4 7 3 到Qt4 7 3中的PATH 所以我猜测在中会有一个类似
  • C++ QT libXL 错误:“启动期间程序退出,代码为 0xc0000135”

    我正在尝试编写一个使用 libXL 的 QT 应用程序 但是当我尝试编译时 我收到一个弹出框 显示 During Startup program exited with code 0xc0000135 我已经准确地找出了哪一行导致了问题 它
  • QGraphicsSimpleTextItem“无效使用不完整类型”

    我的代码如下 指针部件 h QGraphicsSimpleTextItem text 指针控件 cpp void PointerWidget placeNumbers float spacing int currentTickNumber
  • 在另一个中使用 QAbstractListModel

    我在尝试使用 Qt QML 为我的应用程序开发数据模型时遇到问题 我已经用过一个QAbstractListModel能够将海关数据模型从 C 传递到 QML 并且它对于简单模型 例如基于字符串和布尔的模型 来说就像一个魅力 但现在我需要建立
  • 如何从键盘为 QTableWidget 创建信号?

    我有一张桌子 可以通过左 右 上 下按钮在里面移动 现在 当我停留在某个单元格并按空格键时 我需要创建一个信号 该信号还应该带来该单元格的坐标 我尝试使用 QTableWidget 的标准信号 但它不起作用 我该如何解决这个问题 创建一个单
  • QGraphicsView 在完整布局中未最大化

    I have following GUI having four QGraphicView objects 正如您在每个视图下看到的那样 它有四个工具按钮 为了最大化视图 我连接了工具按钮的信号来隐藏其他三个视图的插槽 并将大小策略设置为扩
  • Qt:关闭模式对话框关闭程序

    在我的 Qt 程序中 我有 2 个窗口 主窗口和子窗口 在程序中 一次仅显示这些窗口之一 主窗口有一个插槽 用于创建模式对话框 现在 假设子窗口中单击按钮的信号被发送到该插槽 在这种情况下 主窗口隐藏 子窗口可见 对话框显示得很好 但是当对
  • 在 Qt 中构建 Android 项目不再有效

    所以我对 Android SDK NDK 和 Apache Ant 进行了一些更新 现在我无法构建任何 Android 项目 我收到一条警告 然后它说找不到 build xml 文件 错误 Warning Android platform
  • 错误:命名空间“std”中没有名为“enable_if_t”的模板;您的意思是“enable_if”吗?

    我正在 macOS 10 13 6 上使用 Qt 5 11 3 进行编译 Qt使用的clang版本是 Applications Xcode app Contents Developer Toolchains XcodeDefault xct
  • QStandardItemModel::removeRows() 在我的用例中不起作用

    基本上我想删除模型中的所有行 我更喜欢使用removeRows 代替clear 因为我想保留我的标题 我想我错过了一些东西 文档在这里 http doc qt nokia com 4 7 snapshot qstandarditemmode
  • QTableView 选择已更改

    我有一个QTableView我需要从中获取选择更改事件 我似乎无法让连接工作 我有 MyWidget h protected slots void slotLoadTransaction const QItemSelection selec
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 如何在 QT 安装程序框架中区分每用户安装与系统范围安装?

    我正在使用一些名为 pgModeler 的应用程序 它的当前版本提供了一个基于 QT 安装程序框架的安装程序 Windows 上该安装程序的问题是它安装每个用户的开始菜单条目 https github com pgmodeler pgmod
  • 如何在Qt无框窗口中实现QSizeGrip?

    如何使用 Qt 无框窗口实现 QSizeGrip 代码会是什么样的 您只需在布局内窗口的一角添加 QSizeGrip 即可使其保持在该角落 QDialog dialog new QDialog 0 Qt FramelessWindowHin
  • 第一个随机数始终小于其余随机数

    我碰巧注意到 在 C 中 使用 std rand 方法调用的第一个随机数大多数时候都明显小于第二个随机数 关于 Qt 实现 第一个几乎总是小几个数量级 qsrand QTime currentTime msec qDebug lt lt q
  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width

随机推荐

  • 内存卡永久删除的文件如何恢复?

    内存卡是和机械硬盘 U盘一个性质的数据存储工具 可以说是 同行 而作用更是不必多说 就是存储文件数据 谈谈今天的主题 万一真出现了这种情况 那存储我们电脑数据的内存卡永久删除的文件怎么恢复 内存卡永久删除的文件怎么恢复 内存卡永久删除的文件
  • gitee中git不能使用http协议提交项目

    git使用https协议提交项目的时候出现以下错误 error RPC failed curl 56 GnuTLS recv error 110 The TLS connection was non properly terminated
  • mixins详解

    实现一个日志功能 组件在挂载前打印 Component will mount 组件挂载后打印 Component did mount 不能忍受的写法 var AComponent React createClass componentWil
  • README_Albumentations

    一 文档 GitHub https github com albumentations team albumentations 官方文档 Albumentations Documentation 二 Installation pip ins
  • Amazon AWS —— 免费的午餐不好吃

    转自acgcss 众技术宅所周知 Amazon AWS 之前提供了 新用户凭有效信用卡免费试用一年 的活动 至今没有给出截止日期 虽说免费的午餐很诱人 而且由于信用卡的门槛 也避免了一部分的滥用 但是要安心吃好这顿饭 没有第一个吃螃蟹的人提
  • Python简要复习

    Python程序设计复习 Python基础知识 python的特点 兼具编译型和解释型特性 兼顾过程式 函数式和面向对象编程范式的通用编程语言 解释型语言无需像编译型需要一次性的编译成机器码 然后运行 而是由名叫解释器的程序动态的将源代码逐
  • 快手登录不上去 显示服务器繁忙,快手登录失败怎么回事

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 快手登录失败的原因 1 可能是登录环境不太安全 2 可能是新手机的原因 3 可能是长期未登录或者是异地登录 4 可能是账号存在被盗风险或者已经被其他人登录了 建议修改密码
  • JAVA注解实现@WebServlet(一)

    JAVA注解实现 WebServlet 提示 需要些反射和文件操作 文章目录 JAVA注解实现 WebServlet 前言 一 创建注解RequestMapping 二 创建一个继承HttpServlet的类 三 创建过滤器 总结 前言 在
  • mysql invalid uuid_我为什么不建议开发中使用UUID作为MySQL的主键

    我是少侠露飞 学习塑造人生 技术改变世界 引言 我在之前一篇博客专门介绍了MySQL聚簇索引和非聚簇索引 附传送门 享学MySQL 系列 MySQL索引的数据结构 索引种类及聚簇索引和非聚簇索引 简单来说 就是我们设计表的时候 基本都会人为
  • 【linux kernel】linux中断管理—软中断

    linux中断管理 软中断 一 简介 软中断是linux预留给系统中对时间要求最为严苛和最重要的中断下半部使用的 并且 驱动中只有一些对时间极其敏感的模块使用了 例如 块设备和网络子系统 linux系统中定义了几种软中断类型 如下所示 in
  • 面试题:连续子数组的最大和与循环列表中的子数组最大和

    一 连续子数组的最大和 LeetCode 53 Maximum Subarray 题意 给定一个整数数组 nums 找到一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 定义dp i 为前i个数中的连续子数组的最大和 状态转
  • Jenkins+SonarQube 代码质量检测详解

    一 SonarQube 概述 1 SonarQube 简介 Sonar Qube是一个开源的代码分析平台 支持Java Python PHP JavaScript CSS等25种以上的语言 可以检测出重复代码 代码漏洞 代码规范和安全性漏洞
  • HTTP基础知识(用一万字帮助你入门)

    HTTP中文意思是超文本传输协议 它可以承载的内容有很多像html web Api css js等等 入门HTTP 一 初识 1 1背景知识 二 协议分析 2 1http的发展历程 2 2状态码 2 3缓存 2 4HTTP 2概述 2 5H
  • 利用Python实现黑客帝国代码雨,打造属于自己的黑客帝国

    导语 看安全类文章的时候 发现文章前面经常会加个代码雨的特效图 感觉拿来用python实现一下当成一个小案例还是不错的 让我们愉快地开始吧 开发工具 Python版本 3 6 4 相关模块 pygame模块 以及一些python自带的模块
  • 计算机打印错误,打印机错误正在打印处理方法,详细教您电脑打印机错误正在打印处理方法...

    打印机 是办公常见的打印设备 平时需要打印表格 订单什么的 但是有的时候打印东西会提示 正在打印打印错误 但是打印机连接完好 驱动也安装正确 这是怎么回事呢 下面 小编就教大家如何去解决打印机出现正在打印处理方法 如今在办公室中电脑和打印机
  • CVE-2021-3156 sudo堆溢出 漏洞分析

    漏洞简介 sudo 是 linux 系统管理指令 是允许系统管理员让普通用户执行一些或者全部的 root 命令的一个工具 它允许授权用户以 root 权限执行命令或者程序 sudo 的 sudoer 插件里面存在一个堆溢出漏洞 攻击者可以利
  • Java异步执行代码块,史上最简单的异步执行!!!

    声明 private static final ExecutorService executor Executors newCachedThreadPool new ThreadFactory int i 0 Override public
  • Git命令使用教程

    git文件提交大致流程 本地文件 git add 文件名 暂存区 git commit m 提交信息 本地仓库 git push 远程仓库地址 复制的 分支名称 要推送的分支名称 远程仓库 github git操作详细流程 1 先配置提交人
  • Unity导入google.protobuf失败,无法找到google命名空间

    问题 1 刚开始把protobuf的文件夹直接从其他项目里 unity2021 里复制到unity 2020 版本 当时报错protobuf dll的依赖项system memory版本不对 2 没有使用原来的protobuf文件了 使用v
  • Qt 第29课、主窗口中的状态栏

    1 主窗口中的状态栏 状态栏的概念和意义 状态栏是应用程序中输出简要信息的区域 状态栏一般位于主窗口的最底部 状态栏的消息类型 实时消息 如 当前程序状态 永久消息 如 程序版本号 机构名称 进度消息 如 进度条提示 百分比提示 在 Qt