多窗口编程

news2024/10/5 20:24:12

六、多窗口编程

  1. QMessageBox消息对话框(掌握)

QMessageBox继承自QDialog,显示一个模态对话框。用于用户前台信息通知或询问用户问题,并接收问题答案。

QDialog的Qt源码中,派生类往往都是一些在特定场合下使用的预设好的对话框窗口,这些窗口无需创建对象,直接使用静态成员函数弹窗,使用函数的返回值作为这个窗口的结果。

// 参数1:parent参数
// 参数2:窗口标题
// 参数3:信息内容,窗口展示的信息
// 返回值:用户点击的按钮类型
StandardButton	critical(QWidget * parent, const QString & title, const QString & text)
StandardButton	information(QWidget * parent, const QString & title, const QString & text)
StandardButton	question(QWidget * parent, const QString & title, const QString & text)
StandardButton	warning(QWidget * parent, const QString & title, const QString & text)
[static]

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    btp = new QButtonGroup(this);
    btp->addButton(ui->pushButtonQ,1);
    btp->addButton(ui->pushButtonI,2);
    btp->addButton(ui->pushButtonW,3);
    btp->addButton(ui->pushButtonC,4);

    connect(btp,SIGNAL(buttonClicked(int)),
            this,SLOT(buttonClickedSlot(int)));
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::buttonClickedSlot(int id)
{
    if(id == 1)
    {
        // 设置弹窗  question
       QMessageBox::StandardButton stdb = QMessageBox::question(this,"question","是否需要关闭?");
       if(stdb == QMessageBox::Yes)
       {
           close();
       }
       else if(stdb == QMessageBox::No)
       {

       }
    }
    else if(id == 2)
    {
        // 设置弹窗 Information
        QMessageBox::information(this,"information","已加载完成!");
    }
    else if(id == 3)
    {
        // 设置弹窗 warning
        QMessageBox::warning(this,"warning","您的输入有误!");
    }
    else if(id == 4)
    {
        QMessageBox::critical(this,"critical","程序异常404,缺少必要文件");
    }
    else
    {

    }
}

  1. QWidget类(掌握)

QWidget类时所有窗口和组件的基类,之前认识此类更多的是站在组件的角度上,实际上QWidget本身身为所有窗口的基类,也具有很多窗口的特性。

新建一个项目,使自带窗口继承自QWidget

创建完成后运行时发现,与dialog的窗口并无太大区别,表面区别有。

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // 当QWidget的构造函数parent参数使用默认值0时。表示创建的是独立窗口
    // 当QWidget的构造函数parent参数传递参数时,新创建的QWidget类对象会作为组件内嵌到父窗口中(内嵌窗口)
    Widget w;
    w.show();

    return a.exec();
}

QWidget类作为所有窗口的基类,内部也规定了很多窗口的特性:

  • windowFlags : Qt::WindowFlags(窗口标记)

在使用seter函数设置多个标记时,使用 | 分割(多个窗口标记之间可能会存在冲突)。

实现窗口置于最上层,且没有边框。

setWindowFlags(Qt::FramelessWindowHint |Qt::WindowStaysOnTopHint);

setWindowState

// 设置窗口状态
// 参数为要设置的状态
void QWidget::setWindowState(Qt::WindowStates windowState)

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowTitle("无敌");
    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);

    // 设置窗口最大化
    setWindowState(Qt::WindowMaximized);
}

Widget::~Widget()
{
    delete ui;
}

3、parent参数(掌握)

目前对parent参数的理解有以下几点:

  • parent参数表示子组件位于那个窗口中。
  • parent参数决定了QWidget对象是独立的还是内嵌窗口。

实际上parent参数还表示Qt的内存回收机制,如果对象a作为对象b构造函数时的parent参数,表示对象a是对象b的父对象。这是一种内存回收机制的依赖关系,即对象b跟随对象a一并销毁。此时无需手动控制对象b的销毁过程(手动调用delete)。

如果堆内存对象创建时不传递parent参数,表示对象调用需要程序员手动delete。

绝大多数情况下,建议堆内存对象传递parent参数。

这样做也有缺点, 缺点就是内存占用,主窗口还存在时,子窗口内存不会被释放掉。

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    connect(ui->pushButton0,SIGNAL(clicked()),this,
            SLOT(buttonClickedSlot()));
    connect(ui->pushButtonThis,SIGNAL(clicked()),this,
            SLOT(buttonThisClickedSlot()));
}

Dialog::~Dialog()
{
    qDebug() << "析构函数";
    delete ui;
}

void Dialog::buttonClickedSlot()
{
    Dialog *dlg = new Dialog;
    dlg->show();
}

void Dialog::buttonThisClickedSlot()
{
    Dialog * dlg = new Dialog(this);
    dlg->show();
}

4、堆栈窗口(QStackedWidget)(熟悉)

通常作为独立的内嵌窗口(组件),并于QListWidget进行联动。

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    // 连接信号槽
    connect(ui->listWidget,SIGNAL(currentRowChanged(int)),
            ui->stackedWidget,SLOT(setCurrentIndex(int)));
}

Dialog::~Dialog()
{
    delete ui;
}

5、QMainWindow主窗口类(重点)

QMainWindow是最适合作为主窗口的类型,因为包含多个组成部分。

5.1 QMenuBar菜单栏

菜单栏的组成如下所示:

相关函数如下:

// 向菜单栏中添加一级菜单
// 参数为菜单的文字
// 返回值是添加的菜单对象
QMenu * QMenuBar::addMenu(const QString & title)

// 向菜单栏中添加动作
// 参数为动作的文字
// 返回值是添加的动作对象
QAction * QMenu::​​addAction(const QString & text)

// 向菜单中添加菜单
// 参数为菜单显示的文字
// 返回值是新添加的菜单对象
QMenu * QMenu::​addMenu(const QString & title)

dialog.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QMenu *menuFile = ui->menuBar->addMenu("文件");
    QMenu *menuEdit = ui->menuBar->addMenu("编辑");
    QMenu *menuHelp = ui->menuBar->addMenu("帮助");

    // 向一级菜单中添加动作
    QAction *actionNew = menuFile->addAction("新建");
    QAction *actionOpen = menuFile->addAction("打开");
    QAction *actionClose = menuFile->addAction("关闭");

    // 向一级菜单中添加二级菜单
    QMenu *menuRecent = menuFile->addMenu("访问最近的文件");

    // 向二级菜单中添加动作
    QAction *actionCpp = menuRecent->addAction("hello.cpp");
    QAction *actionH = menuRecent->addAction("hello.h");

}

MainWindow::~MainWindow()
{
    delete ui;
}

信号函数:

dialog.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QMenu *menuFile = ui->menuBar->addMenu("文件");
    QMenu *menuEdit = ui->menuBar->addMenu("编辑");
    QMenu *menuHelp = ui->menuBar->addMenu("帮助");

    // 向一级菜单中添加动作
    QAction *actionNew = menuFile->addAction("新建");
    QAction *actionOpen = menuFile->addAction("打开");
    QAction *actionClose = menuFile->addAction("关闭");

    // 向一级菜单中添加二级菜单
    QMenu *menuRecent = menuFile->addMenu("访问最近的文件");

    // 向二级菜单中添加动作
    QAction *actionCpp = menuRecent->addAction("hello.cpp");
    QAction *actionH = menuRecent->addAction("hello.h");

    connect(actionCpp,SIGNAL(triggered()),
            this,SLOT(triggeredCppSlot()));
    connect(actionH,SIGNAL(triggered()),
            this,SLOT(triggeredHSlot()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::triggeredHSlot()
{
    ui->textEdit->append("打开一个.h文件");
}

void MainWindow::triggeredCppSlot()
{
    ui->textEdit->append("打开一个.Cpp文件");
}

5.2 QToolBar工具栏

工具栏往往是使用菜单栏中的QAction对象,但是需要给QAction设置图标。

dialog.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->action_4,SIGNAL(triggered()),
            this,SLOT(triggeredSaveSlot()));
    // 在状态栏展示信息
    ui->mainToolBar->addAction(ui->action_5);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::triggeredSaveSlot()
{
    ui->textEdit->append("保存了");
}

5.3 QStatusBar 状态栏

// 在状态栏中展示信息
// 参数1:展示的信息内容
// 参数2:信息显示的时间(单位毫秒),默认0表示持续显示
void QStatusBar::​showMessage(const QString & message, int timeout = 0)[slot]

// 清空显示
void QStatusBar::​clearMessage()[slot]

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    lab = new QLabel(this);
    QLabel *lab2 = new QLabel(this);
    lab->setText("显示的内容");
    lab2->setText("2222");
    ui->statusBar->addWidget(lab2);
    ui->statusBar->addWidget(lab);


    connect(ui->action_4,SIGNAL(triggered()),
            this,SLOT(triggeredSaveSlot()));

    connect(ui->action_5,SIGNAL(triggered()),
            this,SLOT(triggeredCloseSlot()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::triggeredSaveSlot()
{
//    ui->textEdit->append("保存了");
//    ui->statusBar->showMessage("保存成功",99999);
//    ui->statusBar->showMessage("保存111111",99999);
}

void MainWindow::triggeredCloseSlot()
{
//    ui->textEdit->append("清除成功");
//    ui->statusBar->clearMessage();
}

6、新建自定义窗口类

在一个项目中创建一个Qt的窗口界面类,操作步骤如下:

  1. 在Qt Creator中选中项目名称,鼠标右键,点击“添加新文件”。
  2. 在弹出的窗口中,按照下图所示操作。

  1. 在弹出的窗口中选择界面模板后,点击”下一步“。

  1. 在弹窗的窗口中,输入类型(注意帕斯卡/大驼峰命名法),然后点击下一步。

  1. 在项目管理界面中,点击完成,可以看到新的窗口类文件已经添加到项目中了。

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked()),
            this,SLOT(btnClickedSlot()));
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::btnClickedSlot()
{
    MyDialog *mydlg = new MyDialog(this);
    mydlg->show();
}

  1. 对象传值(重点)

7.1 父对象→子对象

此处指的是Qt的parent参数的依赖关系,并非继承关系(后文同)。

[需求]:转动主窗口球,子窗口跟着转。

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    mydlg = new MyDialog(this);
    connect(ui->pushButton,SIGNAL(clicked()),
            this,SLOT(btnClickedSlot()));
    connect(ui->dial,SIGNAL(valueChanged(int)),
            this,SLOT(valueChangedSlot(int)));

}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::btnClickedSlot()
{
    mydlg->show();
}

void Dialog::valueChangedSlot(int value)
{
   mydlg->setValue(value);
}

7.2 子对象→父对象

【需求】:转动子对象球,父对象球跟着转。

这种情况最佳的解决方案信号槽传参,子对象发射带参数的信号函数,父对象使用带参数的槽函数接收。

mydilog.cpp

#include "mydialog.h"
#include "ui_mydialog.h"

MyDialog::MyDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyDialog)
{
    ui->setupUi(this);
    connect(ui->dial,SIGNAL(valueChanged(int)),
            this,SLOT(valueChangeSlot(int)));
}

MyDialog::~MyDialog()
{
    delete ui;
}

void MyDialog::setValue(int value)
{
    ui->dial->setValue(value);
}

void MyDialog::valueChangeSlot(int value)
{
    // 发射带参数的自定义信号给父对象
    emit valueSignal(value);
}

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    mydlg = new MyDialog(this);
    connect(ui->pushButton,SIGNAL(clicked()),
            this,SLOT(btnClickedSlot()));

    connect(ui->dial,SIGNAL(valueChanged(int)),
            this,SLOT(valueChangedSlot(int)));

    connect(mydlg,SIGNAL(valueSignal(int)),
            this,SLOT(valueSlot(int)));

}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::btnClickedSlot()
{
    mydlg->show();
}

void Dialog::valueChangedSlot(int value)
{
    mydlg->setValue(value);
}

void Dialog::valueSlot(int value)
{
    ui->dial->setValue(value);
}

8、事件机制(掌握)

事件时Qt的一种底层机制,经过层层传递,用户输出可以得到处理。程序员也可以使用对应的消息处理函数,来处理当前发生的事件。

本次学习主要在窗口类中实现事件函数,从而检测到事件的传递,利用事件的触发机制,从而实现一些特定的效果。

// 绘制事件
void QWidget::paintEvent(QPaintEvent * event) [virtual protected] 

// 大小改变事件
void QWidget::resizeEvent(QResizeEvent * event) [virtual protected] 

// 鼠标按压事件
void QWidget::mousePressEvent(QMouseEvent * event) [virtual protected]
// 鼠标释放事件
void QWidget::mouseReleaseEvent(QMouseEvent * event) [virtual protected]
// 鼠标双击事件
void QWidget::mouseDoubleClickEvent(QMouseEvent * event) [virtual protected]
// 鼠标移动事件
void QWidget::mouseMoveEvent(QMouseEvent * event) [virtual protected]

// 移动事件
void QWidget::moveEvent(QMoveEvent * event) [virtual protected]

// 按键按压事件
void QWidget::keyPressEvent(QKeyEvent * event) [virtual protected]
// 按键释放事件
void QWidget::keyReleaseEvent(QKeyEvent * event) [virtual protected]

// 获取焦点事件
void QWidget::focusInEvent(QFocusEvent * event) [virtual protected]
// 失去焦点事件
void QWidget::focusOutEvent(QFocusEvent * event) [virtual protected]

// 关闭事件
void QWidget::closeEvent(QCloseEvent * event) [virtual protected]

// 鼠标进入事件
void QWidget::enterEvent(QEvent * event) [virtual protected]
// 鼠标离开事件
void QWidget::leaveEvent(QEvent * event) [virtual protected]

事件函数的基础使用只需要在对应的类中覆盖基类的事件函数即可。事件函数的参数就是包含当前事件数据的对象。

// 绘制图片
// 参数1:横坐标
// 参数2:纵坐标
// 参数3:绘制宽度
// 参数4:绘制高度
// 参数5:绘制
void QPainter::​drawPixmap(int x, int y, int width, int height, const QPixmap & pixmap)

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::paintEvent(QPaintEvent *event)
{
    // 创建一个画家对象
    // 参数为QPaintDevice * 表示可绘制对象
    QPainter painter(this);
    QPixmap map(":/new/prefix1/fengjing.png");
    painter.drawPixmap(0,0,this->width(),this->height(),map);

    qDebug() << this->width() << this->height();
}

void Dialog::keyPressEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_A)
    {
        int value = ui->progressBar->value();
        ui->progressBar->setValue(--value);
    }
    else if(event->key() == Qt::Key_D)
    {
        int value = ui->progressBar->value();
        ui->progressBar->setValue(++value);
    }
    else if(event->key() == Qt::Key_W)
    {
        ui->progressBar->setValue(100);
    }
    else if(event->key() == Qt::Key_S)
    {
        ui->progressBar->setValue(0);
    }
    else
    {

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1466937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vuforia+Unity】AR03-圆柱体物体识别(Cylinder Targets)

1.创建数据库模型 这个是让我们把生活中类似圆柱体和圆锥体的物体进行AR识别所选择的模型 Bottom Diameter:底部直径 Top Diameter:顶部直径 Side Length:圆柱侧面长度 请注意&#xff0c;您不必上传所有三个部分的图片&#xff0c;但您需要先为侧面曲面关联一个图像&#…

Threejs 实现3D影像地图,Json地图,地图下钻

1.使用threejs实现3D影像地图效果&#xff0c;整体效果看起来还可以&#xff0c;底层抽象了基类&#xff0c;实现了通用&#xff0c;对任意省份&#xff0c;城市都可以只替换数据&#xff0c;即可轻松实现效果。 效果如下&#xff1a; 链接https://www.bilibili.com/video/BV1…

[AutoSar]BSW_Com1 Can通信入门

目录 关键词平台说明一、车身CAN简介二、相关模块三、Can报文分类及信号流路径3.1 应用报文3.2 应用报文&#xff08;多路复用multiplexer&#xff09;3.3 诊断报文3.4 网络管理报文3.5 XCP报文&#xff08;标定报文&#xff09; 关键词 嵌入式、C语言、autosar、OS、BSW 平台…

分散的产品开发团队

分散的产品开发团队指的是各个团队或成员在地理位置上分布在不同地方&#xff0c;通过互联网和现代通讯技术进行协作和沟通&#xff0c;以共同完成产品开发任务的团队模式。 这种团队模式的优势在于可以充分利用各地的人才资源&#xff0c;降低团队的管理和协作成本&#xff0…

RobotGPT:利用ChatGPT的机器人操作学习框架,三星电子研究院与张建伟院士、孙富春教授、方斌教授合作发表RAL论文

1 引言 大型语言模型&#xff08;LLMs&#xff09;在文本生成、翻译和代码合成方面展示了令人印象深刻的能力。最近的工作集中在将LLMs&#xff0c;特别是ChatGPT&#xff0c;整合到机器人技术中&#xff0c;用于任务如零次系统规划。尽管取得了进展&#xff0c;LLMs在机器人技…

VSCODE使用Django 页面和渲染

https://code.visualstudio.com/docs/python/tutorial-django#_use-a-template-to-render-a-page 通过模板渲染页面 文件 实现步骤 1&#xff0c; 修改代码&#xff0c;hello的App名字增加到installed_apps表中。 2&#xff0c; hello子目录下&#xff0c;创建 .\templates\…

RT-Thread 时钟 timer delay 相关

前言 此处,介绍对delay 时钟 timer 这几部分之间的关联和相关的知识点;本来只是想介绍一下 delay的,但是发现说到delay 不先 提到 先验知识 晶振\时钟\时钟节拍\定时器 好像没法解释透彻,所以就变成了 晶振\时钟\时钟节拍\定时器\delay 的很简单的概括一遍;并附带上能直接运行的…

STM32物联网(封装AT指令进行TCP连接及数据的接收和发送)

文章目录 前言一、AT指令函数封装1.向ESP8266发送数据函数2.设置ESP8266工作模式3.连接WIFI函数4.查询IP地址5.连接TCP服务器6.发送数据到TCP服务器7.接收并解析来自TCP服务器的数据8.关闭TCP服务器 二、代码测试总结 前言 本篇文章将继续带大家学习STM32物联网&#xff0c;那…

二百二十四、Kettle——曲线实现从Hive插入更新到ClickHouse(分区字段是month或year)

一、目的 对于以month、year为分区字段的数据&#xff0c;不是像day字段分区那样每天增量插入更新即可&#xff0c;而是要以部分字段查询、部分字段更新&#xff0c;但是ClickHouse数据库并不适合更新操作&#xff0c;直接使用Kettle的插入更新控件会导致问题&#xff0c;必须…

前后端联调可能出现的问题

调不到后端数据 前后端传参方式不一样 --- formdata 主要接收文件 或者有文件和数据 --- json 纯数据

Linux命令 - 如何查询当前已使用的内存占比

结果先行 free -h | awk NR2{printf "%.2f%%", $3*100/$2 }解释一下 这个命令组合了 free -h 和 awk 命令来输出已用内存的百分比。我们一步一步来解析这个命令&#xff1a; Step 1 free -hfree 是一个用来显示 Linux 系统内存使用情况的命令。-h 参数是 “human…

《TCP/IP详解 卷一》第2章 Internet地址结构

目录 2.1 引言 2.2 表示IP地址 2.3 基本的IP地址结构 单播地址 全球单播地址&#xff1a; 组播地址 任播地址 2.4 CIDR和聚合 2.5 特殊用途地址 2.6 分配机构 2.7 单播地址分配 2.8 与IP地址相关的攻击 2.9 总结 2.1 引言 2.2 表示IP地址 IPv4地址&#xff1a;3…

2024-2-22 作业

作业要求&#xff1a; 复习前面知识点(指针、结构体、函数)整理思维导图顺序表(按位置插入、按位置删除和去重、重新写)理解链表的代码&#xff0c;尝试写一下链表的尾插和输出 1.复习前面知识点(指针、结构体、函数) 2.整理思维导图 3.顺序表(按位置插入、按位置删除和去重、…

Seurat包学习:如何查看R包函数源代码

​我们很多时候都很好奇作者的r包是如何写出来的&#xff0c;手痒的时候就想学习一下源码&#xff0c;顺便改一改 问题来源 为什么要写今天这个推文呢&#xff1f; 起因是因为我想使用seurat自带函数画热图&#xff0c;奈何这个图不是那么好看 DoHeatmap(pbmc,features fea…

2024-02-21 作业

作业要求&#xff1a; 复习课上内容 //已完成结构体字节对齐&#xff0c;64位没做完的做完&#xff0c;32位重新都做一遍&#xff0c;课上指定2字节对齐的做一遍&#xff0c;自己验证 //已完成两种验证大小端对齐的代码写一遍复习指针内容 //已完成完善顺序表已写出的…

视频评论抓取软件|抖音数据抓取工具

最近我们推出了一款基于C#语言开发的工具。这款工具提供了丰富的功能&#xff0c;旨在帮助用户轻松获取抖音视频内容。让我们一起来详细介绍一下这款工具的主要功能模块&#xff1a; 1. 批量视频提取&#xff1a; 工具提供了便捷的批量视频提取功能&#xff0c;用户只需输入关…

cookie伪造 [BSidesCF 2019]Kookie1

打开题目 提示用admin用户登录 尝试弱口令发现&#xff0c;登录失败 显示用admin&passwordadmin!进行登录 有发现说cookie&#xff0c;就尝试用cookie登录&#xff1a; f12编辑添加cookie重发包: 或者bp抓包 Cookie:usernameadmin 用admin登录成功 得到flag: 参考文章&…

Vue3项目结构分析

node_modules: 是项目npm install下载的node依赖库。 public&#xff1a; favicon.ico: 网页图标logo图片。index.html: 入口html。是一个基础的html页面&#xff0c;其中进行网页最基础的设置&#xff0c;并且设置了id为app的div盒子。该页面即为Vue单页面应用的基础页面。后…

QSettings使用示例

解决的问题&#xff1a; 平常要存储一些临时数据&#xff0c;或者ini的系统参数数据&#xff0c;以下是源码解析 如何实现&#xff1a; 实现的UI如下 主要功能&#xff1a; 初始化&#xff1a; m_settings new QSettings("DParamSetting.ini", QSettings::IniFo…

京东数据分析|京东销售数据怎么查|京东销售数据查询软件分享!

京东销售数据分析对商家来说具有多方面的重要作用&#xff0c;主要体现在以下几个方面&#xff1a; 市场趋势分析&#xff1a; 分析京东平台上的商品销量、销售额和价格走势等数据&#xff0c;可以帮助商家了解当前市场的整体需求趋势&#xff0c;以及不同品类的季节性变化、…