【QT】窗口MainWindow

目录

窗口的组成

菜单栏

图形化创建菜单栏

代码创建菜单栏

给菜单设置快捷键 

添加子菜单

添加分割线 

添加图标 

创建menuBar的细节

工具栏

设置工具栏出现的初始位置(上下左右) 

设置工具栏允许停靠的位置

设置不允许浮动

设置不允许移动

状态栏

创建状态栏

显示实时消息

给状态栏添加子控件

浮动窗口 

1. 给主窗口添加一个浮动窗口(子窗口)

2. 给浮动窗户设置标题

3.给浮动窗口内部,添加一些其他控件

4. 设置浮动窗口的停靠位置 

对话框

对话框介绍

分类 

内存释放问题

创建对话框

自定义对话框

通过代码实现自定义

通过图形化自定义

模态对话框

 消息对话框

1. 创建消息对话框

2. 设置对话框窗口标题和文本

3.设置对话框风格

 4.设置对话框包含的按钮

5. 获取用户点击哪个按钮

简便写法

颜色对话框

常用方法

使用示例:基于用户选择的颜色,修改窗口的背景色 

文件对话框

常用方法

字体对话框

使用示例:基于用户选择的font属性,设置button的字体

输入对话框


窗口的组成

        Qt中窗口是通过QMainWindow类来实现的,QMainWindow是一个为用户提供主程序的类,继承自QWidget类,并且提供了⼀个预定义的 布局。QMainWindow 包含 ⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝(铆接部件)(dock widgets 也就是子窗口)、⼀个状态栏(status bar) 和⼀个 中⼼部件(central widget)

菜单栏跟工具栏的区别 :
菜单栏如下:

工具栏如下:

 工具栏中本质上就是菜单栏中一些选项的快捷方式。

菜单栏

一个主窗口最多只能有一个菜单栏。

菜单项通过QAction类实现。

图形化创建菜单栏

在 这里的 “在这里输入” 是新建一个菜单页

在文件下拉选项中的 是新建一个菜单项 

代码创建菜单栏

1. 创建菜单栏

    QMenuBar* menuBar = new QMenuBar();this->setMenuBar(menuBar);

2. 创建菜单

    QMenu* menu1 = new QMenu("文件");QMenu* menu2 = new QMenu("编辑");QMenu* menu3 = new QMenu("视图");menuBar->addMenu(menu1);menuBar->addMenu(menu2);menuBar->addMenu(menu3);

3. 给菜单添加菜单项

    QAction* action1 = new QAction("新建");QAction* action2 = new QAction("打开");QAction* action3 = new QAction("保存");menu1->addAction(action1);menu1->addAction(action2);menu1->addAction(action3);

4. 给action添加信号槽

connect(action1,&QAction::triggered,this,&MainWindow::handle);

5. 效果如下:

给菜单设置快捷键 

设置好的快捷键搭配alt就可以进行使用了

QMenu* menu1 = new QMenu("文件(&F)");

通过给文本设置 “ (&F)” 即可设置快捷键,与QLabel设置伙伴类似。

菜单项的快捷键与这一样。

添加子菜单

菜单栏通过 addMenu 添加菜单,菜单也是通过addMenu 添加子菜单。

示例:

    QMenuBar* menuBar = new QMenuBar();this->setMenuBar(menuBar);QMenu* menuParent = new QMenu("父菜单");QMenu* menuChild = new QMenu("子菜单");QAction* action1 = new QAction("菜单项1");QAction* action2 = new QAction("菜单项2");;menuBar->addMenu(menuParent);menuParent->addMenu(menuChild);menuParent->addAction(action1);menuParent->addAction(action2);

效果如下: 

添加分割线 

菜单里菜单项特别多,就可以通过分割线,进行分组。

QMenu中提供了 addSeparator 函数。

这是添加分割线之前的效果:

添加之后: 

代码如下:

    menuParent->addAction(action1);menuParent->addSeparator();menuParent->addAction(action2);

通过这个分割线,可以把菜单中若干个菜单项分成几个部分,以达到更好的用户体验效果。

添加图标 

这里涉及到之前所介绍的QIcon类和qrc机制。

代码如下:

    QAction* action1 = new QAction("编辑");action1->setIcon(QIcon(":/edit.png"));

效果如下:

菜单也可以设置图标,但是如果给QMenu设置图标 ,当前的QMenu是长在QMenuBar上的,此时文本就不显示,图标覆盖了文本,如果当前的QMenu是子菜单,图标和文本是都能显示的。

创建menuBar的细节

    QMenuBar* menuBar = new QMenuBar();this->setMenuBar(menuBar);

上述代码中,在一些多线程之类的情况下,可能会出现原本窗口已经有了菜单栏,我们在进行设置菜单栏的话,会导致原本的菜单栏脱离对象树,从而导致后续内存泄漏。

因此我们可以规范一下创建菜单栏的写法:

    QMenuBar* menuBar = this->menuBar();this->setMenuBar(menuBar);

上述代码写法的好处:

  1. 如果QMenuBar已经存在,直接获取并返回。
  2. 如果QMenubar不存在,就先创建一个新的,再返回。

如果是获取到已经存在的QMenuBar,后面的设置就是自己替换自己,还在对象树上。

工具栏

qt中使用QToolBar表示工具栏对象,一个窗口可以有多个工具栏,也可以没有,同时工具栏往往可以手动移动位置。
使用示例:

    QToolBar* toolBar = new QToolBar();this->addToolBar(toolBar);QAction* action1 = new QAction("保存");action1->setIcon(QIcon(":/edit.png"));toolBar->addAction(action1);

效果:

可以从上述效果中看出,文本被图标所覆盖,但是我们设置的文本并没有消失 ,而是变成tooltip存在。

设置工具栏出现的初始位置(上下左右) 

  • Qt::LeftToolBarArea 停靠在左侧
  • Qt::RightToolBarArea 停靠在右侧
  • Qt::TopToolBarArea 停靠在顶部
  • Qt::BottomToolBarArea 停靠在底部
  • Qt::AllToolBarAreas 以上四个位置都可停靠

示例:

    QToolBar* toolBar = new QToolBar();this->addToolBar(Qt::LeftToolBarArea,toolBar);

设置工具栏允许停靠的位置

示例:允许左侧和右侧停靠

toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea)

设置不允许浮动

    toolBar->setFloatable(false);

设置不允许移动

    toolBar->setMovable(false);

状态栏

状态栏是应⽤程序中输出简要信息的区域。⼀般位于主窗⼝的最底部,⼀个窗⼝中最多只能有⼀个状态栏。在 Qt 中,状态栏是通过 QStatusBar类 来实现的。 在状态栏中可以显⽰的消息类型有:
  • 实时消息:如当前程序状态
  • 永久消息:如程序版本号,机构名称
  • 进度消息:如进度条提⽰,百分百提⽰

创建状态栏

用如下的方式创建状态栏,若原本状态来就存在就获取即可,不存在就创建一个。

    QStatusBar* statusBar = this->statusBar();this->setStatusBar(statusBar);

显示实时消息

第二个参数为显示的时间,如下是显示2秒,如果为0或者不填,则消息永久存在。

statusBar->showMessage("hello",2000);

给状态栏添加子控件

addWidget( ) 在状态栏左侧添加控件

addPermanentWidget( ) 在状态栏右侧添加控件

    statusBar->addWidget(label1);statusBar->addPermanentWidget(label2);

效果如下:

浮动窗口 

浮动窗口也就是子窗口。

Qt中使用QDockWidget 来实现的。

1. 给主窗口添加一个浮动窗口(子窗口)

    QDockWidget* dockWidget = new QDockWidget();this->addDockWidget(Qt::LeftDockWidgetArea,dockWidget);

2. 给浮动窗户设置标题

dockWidget->setWindowTitle("这是浮动窗口");

3.给浮动窗口内部,添加一些其他控件

        不能直接给这个浮动窗口添加子控件,而是需要创建出一个单独的QWidget,把要添加的控件加入到QWidget中。,然后再把这个QWidget设置到dockWidget中。

        由于dockWidget中只能包含一个QWidget,想要添加更多控件只能往这个QWidget中进行添加了。

    QWidget* container = new QWidget();dockWidget->setWidget(container);QVBoxLayout* layout = new QVBoxLayout();container->setLayout(layout);QLabel* label = new QLabel("标签1");QPushButton* btn = new QPushButton("按钮");layout->addWidget(label);layout->addWidget(btn);

效果如下:

 

4. 设置浮动窗口的停靠位置 

浮动窗⼝是位于中⼼部件的周围。可以通过 QDockWidget类 中提供 setAllowedAreas() 函数设置其
允许停靠的位置。其中可以设置允许停靠的位置有:
  • Qt::LeftDockWidgetArea 停靠在左侧
  • Qt::RightDockWidgetArea 停靠在右侧
  • Qt::TopDockWidgetArea 停靠在顶部
  • Qt::BottomDockWidgetArea 停靠在底部
  • Qt::AllDockWidgetAreas 以上四个位置都可停靠

示例:设置浮动窗口只允许上下停靠

dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);

对话框

对话框介绍

        对话框是 GUI 程序中不可或缺的组成部分。⼀些不适合在主窗⼝实现的功能组件可以设置在对话框中。对话框通常是⼀个顶层窗⼝,出现在程序最上层,⽤于实现短期任务或者简洁的⽤⼾交互。Qt⽤的内置对话框有:QFiledialog(⽂件对话框)QColorDialog(颜⾊对话框)QFontDialog (字体对话框)QInputDialog (输⼊对话框)QMessageBox(消息框) 。  

分类 

对话框分为模态对话框和非模态对话框。

内存释放问题

因为dialog可以存在多个,可能会存在内存泄漏的问题,所以我们应该让用户点击 对话框关闭按钮的时候,触发delete操作。

 dialog->setAttribute(Qt::WA_DeleteOnClose);

创建对话框

1. 创建对话框

QDialog* dialog = new QDialog(this);

2. 设置对话框标题 

dialog->setWindowTitle("对话框的标题");

3. 设置对话框尺寸 

dialog->resize(400,300);

4. 显示对话框

dialog->show();

5. 设置delete属性

dialog->setAttribute(Qt::WA_DeleteOnClose);

自定义对话框

        要想自定义对话框,就需要继承QDialog创建类。

通过代码实现自定义

这里我们新建一个类,如下:

 1. Dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QWidget>
#include <QDialog>
class Dialog : public QDialog
{Q_OBJECT
public:Dialog(QWidget* parent);void handle();
};#endif // DIALOG_H

 2. Dialog.cpp

#include "dialog.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>
Dialog::Dialog(QWidget* parent):QDialog(parent)
{QVBoxLayout* layout = new QVBoxLayout();this->setLayout(layout);QLabel* label = new QLabel("这是一个对话框",this);QPushButton* btn = new QPushButton("关闭",this);layout->addWidget(label);layout->addWidget(btn);connect(btn,&QPushButton::clicked,this,&Dialog::handle);}void Dialog::handle()
{this->close();
}

3. 调用

void MainWindow::on_pushButton_clicked()
{Dialog* dialog = new Dialog(this);dialog->setWindowTitle("这是自定义对话框");dialog->resize(400,300);dialog->show();
}

4. 效果 

通过图形化自定义

1. 新建一个Qt设计师界面

2.选择模板 

3.这样会多出来一个ui文件

4. 在dialog 的ui文件中设计自定义对话框即可 

模态对话框

模态:弹出对话框的时候,此时用户无法操作父窗口,必须得完成对话框内部出的操作,关闭对话框之后,才可操作父窗口。

非模态:弹出对话框的时候,用户可以操作父窗口。

那么我们如何产生模态对话框呢?

把前面 .show方法换成exec即可。

dialog->exec();

 消息对话框

消息对话框 QMessageBox,消息对话框是应⽤程序中最常⽤的界⾯元素。消息对话框主要⽤于为⽤⼾提⽰重要信息,强制⽤⼾进⾏选择操作。

1. 创建消息对话框

QMessageBox* message = new QMessageBox(this);

2. 设置对话框窗口标题和文本

   message->setWindowTitle("对话框窗口标题");message->setText("这是对话框文本");

3.设置对话框风格

QMessageBox类 中定义了静态成员函数,可以直接调⽤创建不同⻛格的消息对话框,其中包括:
Question
⽤于正常操作过程中的提问
Information
⽤于报告正常运⾏信息
Warning
⽤于报告⾮关键错误
Critical
⽤于报告严重错误
 message->setIcon(QMessageBox::Warning);

 4.设置对话框包含的按钮

message->setStandardButtons(QMessageBox::Ok | QMessageBox::Save);

除了使用系统提供按钮,我们也可以添加自己的按钮 ,在添加按钮的时候,可以设置按钮的角色

代码如下:

    QPushButton* btn = new QPushButton("按钮",messageBox);messageBox->addButton(btn,QMessageBox::AcceptRole);

也可以给这个按钮绑定信号槽来使用。 

5. 获取用户点击哪个按钮

        用户点击按钮,使对话框关闭之后,此时就能通过exec的返回值,来知道用户点击的是哪个按钮,从而执行一些对应的逻辑。

        以下是系统自带的按钮:

代码示例:

    int result = messageBox->exec();if(result == QMessageBox::Ok){qDebug()<<"ok"<<endl;}

因为QMessageBox的使用场景一般是模态的,所以我们使用exec方法

简便写法

通过warning这个静态函数,可以快速的构造出一个消息对话框。 

    int result = QMessageBox::warning(this,"对话框标题","对话框文本",QMessageBox::Ok | QMessageBox::No);if(result == QMessageBox::Ok){qDebug()<<"ok"<<endl;}

另外三种也可以通过上述的方法。

颜色对话框

QColorDialog颜⾊对话框的功能是允许用户选择颜⾊。继承⾃ QDialog 类。颜⾊对话框如下图示:

常用方法

1、 QColorDialog (QWidget *parent = nullptr) //创建对象的同时设置⽗对象
2、 QColorDialog(const QColor &initial, QWidget *parent = nullptr) //创建对象的同时通过QColor
对象设置默认颜⾊和⽗对象
3、 void setCurrentColor(const QColor &color) //设置当前颜⾊对话框
4、 QColor currentColor() const //获取当前颜⾊对话框
5、 QColor getColor(const QColor &initial = Qt::white,
                                 QWidget *parent = nullptr,
                                 const QString &title = QString(),
                                 QColorDialog::ColorDialogOptions options = ColorDialogOptions()) //打开颜⾊选择对话框,并返回⼀个QColor对象
参数说明:
                initial:设置默认颜⾊
                parent:设置⽗对象
                title:设置对话框标题
                options:设置选项
           
6、 void open(QObject *receiver, const char *member) //打开颜⾊对话框

使用示例:基于用户选择的颜色,修改窗口的背景色 

QColor(ARGB 1, 0.541176, 0.27451, 1) 

第一个参数为不透明度,1 为不透明 ,接下去的参数为red 、green 、blue

    QColor color =  QColorDialog::getColor(QColor(0,255,0),this,"选择颜色");qDebug()<<color;QString style = "background-color: rgb(" + QString::number(color.red()) + "," +QString::number(color.green()) + "," +QString::number(color.blue()) + ");";this->setStyleSheet(style);

文件对话框

QFileDialog⽂件对话框⽤于应⽤程序中需要打开⼀个外部⽂件或需要将当前内容存储到指定的外部⽂件。

常用方法

1、打开⽂件(⼀次只能打开⼀个⽂件)
QString getOpenFileName (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
2、打开多个⽂件(⼀次可以打开多个⽂件)
QStringList getOpenFileNames (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
3、 保存⽂件
QString getSaveFileName (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
参数说明:
        参数1: parent ⽗亲
        参数2: caption 对话框标题
        参数3: dir 默认打开的路径
        参数4: filter ⽂件过滤器

此处的打开/保存功能需要额外去实现的,并不是说直接一按保存就真的保存了

代码示例:

返回文件路径

    QString filePath = QFileDialog::getOpenFileName(this);QString filePath = QFileDialog::getSaveFileName(this);

字体对话框

Qt 中提供了预定义的字体对话框类 QFontDialog,⽤于提供选择字体的对话框部件。
代码示例:
   bool ok = false;QFont font = QFontDialog::getFont(&ok);qDebug()<<font.family();qDebug()<<font.pointSize();qDebug()<<font.bold();qDebug()<<font.italic();

使用示例:基于用户选择的font属性,设置button的字体

ui->pushButton->setFont(font);

输入对话框

让用户输入一个具体的数据,可以是整数、浮点数,也可以是字符串。

1、双精度浮点型输⼊数据对话框
double getDouble (QWidget *parent, const QString &title, const QString &label, double
value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
2、整型输⼊数据对话框
int getInt (QWidget *parent, const QString &title, const QString &label, int value = 0, int
min = -2147483647, int max = 2147483647, int step = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
3、选择条⽬型输⼊数据框
QString getItem (QWidget *parent, const QString &title, const QString &label, const
QStringList &items, int current = 0, bool editable = true, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone) ;
参数说明:
                parent:⽗亲
                title:对话框标题
                label:对话框标签
                items:可供选择的条⽬
返回值为用户输入的值
字符串数组 QStringList item

这里演示条目输入框的用法:

    QStringList items;items.push_back("111");items.push_back("222");items.push_back("333");QString item = QInputDialog::getItem(this,"条目输入对话框","请输入条目",items);

 效果如下:

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

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

相关文章

提高使用安全,智慧校园在线用户功能概述

智慧校园系统融入了一个查看当前在线用户的功能&#xff0c;这一设计旨在为管理人员提供一个实时的窗口&#xff0c;洞悉校园平台的即时活跃情况&#xff0c;确保系统的高效运作与环境安全。通过这一功能&#xff0c;管理员能够一目了然地看到所有正活跃在平台上的用户群体&…

二叉树专题刷题

二叉树的层平均值 题目 637. 二叉树的层平均值 - 力扣&#xff08;LeetCode&#xff09; 解题思路 使用三个集合&#xff0c;sums集合存储每层的总和&#xff0c;count集合存储每层的节点数&#xff0c;averages存储每层的平均值。 这里要讲一下add方法和set方法的区别 ad…

windows运行库合集(windows必备运行库)

Windows运行库&#xff08;Windows Runtime&#xff0c;简称WinRT&#xff09;是微软为Windows 8及以上版本推出的一种新的应用程序框架&#xff0c;它采用了基于COM的API调用方式&#xff0c;并使用了新的应用程序打包和分发方式。 WinRT包含了大量的通用API&#xff0c;可以…

J026_统计投票人数

一、需求描述 统计投票人数 某个班级80名学生&#xff0c;现在需要组织秋游活动&#xff0c;班长提供了4个景点依次是&#xff08;A、B、C、D&#xff09;&#xff0c;每个学生只能选择一个景点&#xff0c;请统计出最终哪个景点想去的人数最多。 二、代码实现 package com…

JS的隐式转换

1.什么是JS的隐式转换 JavaScript中的隐式转换是指在运行过程中&#xff0c;代码自动将一个数据类型转换为另一个数据类型&#xff0c;而无需显式地调用转换函数。 原因 JavaScript是弱类型语言&#xff0c;这意味着它不像Java&#xff0c;C一样的强类型语言有预先确定的类型…

离线安装pip包

文章目录 离线机器安装需要的python包 离线机器安装需要的python包 本机做一台和实际的生产机器相同环境的虚拟机 在本机环境下下载离线包 pip3 download gunicorn -d /usr/local/gunicorn-package -i https://pypi.tuna.tsinghua.edu.cn/simple 将gunicorn-package下的文件…

【088】基于SpringBoot+Vue实现高校就业管理系统

系统介绍 基于SpringBootVue实现的高校就业管理系统 课程设计 大作业必备 基于SpringBootVue实现高校就业管理系统采用前后端分离的架构方式&#xff0c;系统分为管理员、企业、辅导员、学生四种角色&#xff0c;实现了用户登录、学生注册、商家注册、首页统计、个人信息管理、…

动手学深度学习(Pytorch版)代码实践 -注意力机制-Transformer

68Transformer 1. PositionWiseFFN 基于位置的前馈网络 原理&#xff1a;这是一个应用于每个位置的前馈神经网络。它使用相同的多层感知机&#xff08;MLP&#xff09;对序列中的每个位置独立进行变换。作用&#xff1a;对输入序列的每个位置独立地进行非线性变换&#xff0c…

备份及恢复Sonarqube服务数据

基础数据&#xff1a; 源数据机ip&#xff1a;192.*.53 测试机ip&#xff1a;192.*.65 Sonarqube访问地址&#xff1a;http://192.*.65:9000/ 账户名&#xff1a;admin 密码&#xff1a;123456 数据库postgres&#xff1a; 版本&#xff1a;PostgreSQL 15.3 一、数据备份…

AI写歌词,为你的音乐之旅添彩

在追求音乐梦想的道路上&#xff0c;每一个音符都承载着我们的情感与故事。而精彩的歌词&#xff0c;更是让这些音符焕发出耀眼光芒的关键。如今&#xff0c;AI 写词的出现&#xff0c;为我们的音乐之旅增添了绚丽的色彩。 “妙笔生词智能写歌词软件&#xff08;veve522&#…

JAVA自定义注释

interface 声明 package test; public interface InProgress { } InProgress public void calculateInterest(float amount, float rate) { } 带成员 public interface TODO {String value(); } InProgress //只有成员变量名有value时&#xff0c;值有给value赋值时可以这…

Spring Cloud Eureka

引入&#xff1a;远程调用时&#xff0c;url是写死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 解决思路&#xff1a; 比如&#xff08;医院&#xff0c;学校等&#xff09;机构的电话号码发生变化&#xff0c;就需要通知各个使⽤…

基于深度学习的问答系统

基于深度学习的问答系统是一种利用深度学习技术从文本数据中提取信息并回答用户提出的问题的技术。它在智能助手、客服系统、教育和医疗等领域有广泛应用。以下是对这一领域的系统介绍&#xff1a; 1. 任务和目标 问答系统的主要任务和目标包括&#xff1a; 信息检索&#x…

Android14系统应用统一裁剪方案

Android14系统应用统一裁剪方案 背景 当前移除集成到系统里的应用,一般都是根据应用名,到各个mk文件里逐个在PRODUCT_PACKAGES中删除;这种方法,耗时而且不易管理集成到系统里的应用;需要有一个统一管理删除不需要应用的方案。 方案 参考PRODUCT_PACKAGES变量,添加PRO…

【PyTorch单点知识】自动求导机制的原理与实践

文章目录 0. 前言1. 自动求导的基本原理2. PyTorch中的自动求导2.1 创建计算图2.2 反向传播2.3 反向传播详解2.4 梯度清零2.5 定制自动求导 3. 代码实例&#xff1a;线性回归的自动求导4. 结论 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&…

游戏的无边框模式是什么?有啥用?

现在很多游戏的显示设置中&#xff0c;都有个比较特殊的选项“无边框”。小伙伴们如果尝试过&#xff0c;就会发现这个效果和全屏几乎一毛一样&#xff0c;于是就很欢快地用了起来&#xff0c;不过大家也许会发现&#xff0c;怎么和全屏比起来&#xff0c;似乎有点不够爽快&…

渲染引擎实践 - OSG引擎渲染一帧的过程

一&#xff1a;概述 经过前面两节的介绍&#xff0c;我们已经创建了窗口(OSG引擎窗口)和启动了渲染线程(OSG渲染线程)。当应用程序加载好模型数据以后&#xff0c;就开始正式的渲染了&#xff0c;那么本节分析下渲染一帧的过程&#xff0c;本文尽量做到简单&#xff0c;清晰&am…

uniapp编译成h5后接口请求参数变成[object object]

问题&#xff1a;uniapp编译成h5后接口请求参数变成[object object] 但是运行在开发者工具上没有一点问题 排查&#xff1a; 1&#xff1a;请求参数&#xff1a;看是否是在请求前就已经变成了[object object]了 结果&#xff1a; 一切正常 2&#xff1a;请求头&#xff1a;看…

AST反混淆实战:提升JavaScript代码的可读性与调试便利性

博客标题&#xff1a;AST反混淆&#xff1a;提升JavaScript代码的可读性与调试便利性 引言 JavaScript代码混淆是一种常见的保护源码的方法&#xff0c;但这也给代码的维护和调试带来了不小的挑战。抽象语法树&#xff08;AST&#xff09;提供了一种结构化的方式来分析和转换…

C语言实现数据结构B树

B树&#xff08;B-Tree&#xff09;是一种自平衡的树数据结构&#xff0c;它维护着数据的有序性&#xff0c;并允许搜索、顺序访问、插入、删除等操作都在对数时间内完成。B树广泛用于数据库和操作系统的文件系统中。 B树的基本特性 根节点&#xff1a;根节点至少有两个子节点…