Qt 停靠布局QDockWidget使用

news2025/1/17 3:39:23

基本使用

QDockWidget是一个可以停靠在QMainWindow内的窗口控件,它可以保持浮动状态或在指定位置作为子窗口附加到主窗口中。停靠窗口QDockWidget类是应用程序中经常用到的,设置停靠窗口的一般流程如下。

  • 创建一个QDockWidget对象的停靠窗体。
  • 设置此停靠窗体的属性,通常调用setFeatures()及setAllowedAreas()两种方法。
  • 新建一个要插入停靠窗体的控件,常用的有QListWidget和QTextEdit。
  • 将控件插入停靠窗体,调用QDockWidget的setWidget()方法。
  • 使用addDockWidget()方法在MainWindow中加入此停靠窗体。

这里使用Qt Designer ,随意拖拽添加QDockWidget到MainWindow任意区域可以停靠即可,在代码中对QDockWidget进行管理。Qt Designer无法任意调整位置,可以使用代码初始化QDockWidget布局。
在这里插入图片描述

布局相关

停靠特性

setFeatures()方法设置停靠窗体的特性,参数QDockWidget::DockWidgetFeatures指定停靠窗体的特性,包括以下几种参数。
① QDockWidget::DockWidgetClosable:停靠窗体可关闭。
② QDockWidget::DockWidgetMovable:停靠窗体可移动。
③ QDockWidget::DockWidgetFloatable:停靠窗体可浮动。
④ QDockWidget::AllDockWidgetFeatures:此参数表示拥有停靠窗体的所有特性。
⑤ QDockWidget::NoDockWidgetFeatures:不可移动、不可关闭、不可浮动。

停靠区域

setAllowedAreas()方法设置停靠窗体可停靠的区域,参数Qt::DockWidgetAreas指定了停靠窗体可停靠的区域,包括以下几种参数。
① Qt::LeftDockWidgetArea:可在主窗口的左侧停靠。
② Qt::RightDockWidgetArea:可在主窗口的右侧停靠。
③ Qt::TopDockWidgetArea:可在主窗口的顶端停靠。
④ Qt::BottomDockWidgetArea:可在主窗口的底部停靠。
⑤ Qt::AllDockWidgetArea:可在主窗口任意(以上四个)部位停靠。
⑥ Qt::NoDockWidgetArea:只可停靠在插入处。

添加dock

addDockWidget()方法用于添加dock,给dock指定位置,同时也可以更改dock的位置。

void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget * dockwidget)

分割dock

splitDockWidget()方法用于分割dock窗口,是把两个dock进行左右或上下并排布置,做成一个类似QSplit的功能,分割原则是:水平从左到右,竖直从上到下。

void QMainWindow::splitDockWidget(QDockWidget * first, QDockWidget * second, Qt::Orientation orientation)

dock tab化窗口

tabifyDockWidget()方法用于tab化窗口,把多个dock变成一个tab形式的窗体。

void QMainWindow::tabifyDockWidget(QDockWidget * first, QDockWidget * second)

初始化大小

靠左右布局的QDockWidget的高度是自适应的,宽度需要初始化设置,同理靠上下布局的高度需要初始化设置。使用splitDockWidget分割、tabifyDockWidget tab化窗口的QDockWidget的初始化大小与其依赖的QDockWidget(参数first)初始化大小一样。

void QMainWindow::resizeDocks(const QList<QDockWidget *> &docks, const QList<int> &sizes, Qt::Orientation orientation)

它的第一个参数是用来配置是哪个dock窗口需要调整大小;第二个参数是用来配置dock所占的像素大小,如果配置大于或者小于QMainWindow本身空间,Qt会根据所配置的像素大小的相对权重分配到dock中;第三个参数用来配置调整的方向,如果为Qt::Horizontal,调整dock宽度,Qt::Vertical调整dock高度,确定了停靠位置后resizeDocks才起作用。需要注意的是Qt官方文档上有注明这个方法在Qt5.6中引入,所以比Qt5.6低的版本并不能使用本方法。resizeDocks在多行或多列时初始化高宽无效问题!

使用setFeatures、setAllowedAreas、addDockWidget、splitDockWidget、tabifyDockWidget、resizeDocks可以满足基本的Dock布局了。

标题栏设置

去掉标题栏,但是不能拖动了。

QWidget *Widget = new QWidget;
ui->dockwidget_dockWidget_1->setTitleBarWidget(Widget);

自定义QWidget即可以自定义标题栏。

标题栏竖起

ui->dockwidget_dockWidget_6->setFeatures(QDockWidget::DockWidgetVerticalTitleBar);

其他问题

当使用tabifyDockWidgets进行tab化窗口时对Tabbar设置背景色时发现Tabbar上方有一行间隙。在QSS中使用qproperty-drawBase: 0;可以使得背景色填充到间隙中,但是发现Tabbar超过两个后其他的Tabbar不生效!!!

QTabBar {
  qproperty-drawBase: 0;
  background: rgb(45, 45, 45);
} 

直接在代码中遍历Tabbar设置DrawBase属性可以解决Tabbar上方有一行间隙无法填充背景色问题。

Q_FOREACH (QTabBar *bar, this->findChildren<QTabBar *>())
{
  bar->setDrawBase(false);
}

当tab个数大于一定个数时,会出现如下图左侧白线所示,这个是Qt自带的,作用是点击回到第一个tab,但是显示不好看,这里隐藏掉

QTabBar::tear {
  width: 0px;
  border: none;
}

后续

  • 自定义标题栏。
  • 补充还原布局。

效果

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

相关代码

#include "dockwidget.h"
#include <QtCore/QtCore>

DockWidget::DockWidget(QWidget *parent) : QMainWindow(parent), ui(new Ui_dockwidget)
{
  ui->setupUi(this);
  StyleMgr::SetStyleToWidgetByCssFile(this, ":/helloqt/resources/qss/custom/dockwidget.qss");

  // 如果不需要MainWindow的中间窗口,整个视图都由QDockWidget组成,可以把QMainWindow的中间窗口部件去除
  // QWidget *p = takeCentralWidget();
  // if (p)
  //   delete p;

  // 当不需要MainWindow的中间窗口时,发现不能拖动QDockWidget到中间,需要设置
  // setDockNestingEnabled(true);

  ui->dockwidget_dockWidget_1->setWindowTitle("Dock 1");
  ui->dockwidget_dockWidget_2->setWindowTitle("Dock 2");
  ui->dockwidget_dockWidget_3->setWindowTitle("Dock 3");
  ui->dockwidget_dockWidget_4->setWindowTitle("Dock 4");
  ui->dockwidget_dockWidget_5->setWindowTitle("Dock 5");
  ui->dockwidget_dockWidget_6->setWindowTitle("Dock 6");
  ui->dockwidget_dockWidget_7->setWindowTitle("Dock 7");
  ui->dockwidget_dockWidget_8->setWindowTitle("Dock 8");
  ui->dockwidget_dockWidget_9->setWindowTitle("Dock 9");

  ui->dockwidget_dockWidget_1->setFeatures(QDockWidget::DockWidgetMovable);                                   //可移动
  ui->dockwidget_dockWidget_2->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable); //可关闭、移动
  ui->dockwidget_dockWidget_3->setFeatures(QDockWidget::DockWidgetMovable);                                   //可移动
  ui->dockwidget_dockWidget_4->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable); //可关闭、移动
  ui->dockwidget_dockWidget_5->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable); //可关闭、移动
  ui->dockwidget_dockWidget_6->setFeatures(QDockWidget::DockWidgetMovable);                                   //可移动
  ui->dockwidget_dockWidget_7->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable); //可关闭、移动
  ui->dockwidget_dockWidget_8->setFeatures(QDockWidget::DockWidgetMovable);                                   //可移动
  ui->dockwidget_dockWidget_9->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable); //可关闭、移动

  ui->dockwidget_dockWidget_1->setAllowedAreas(Qt::TopDockWidgetArea);    //可在主窗口的上侧停靠。
  ui->dockwidget_dockWidget_3->setAllowedAreas(Qt::LeftDockWidgetArea);   //可在主窗口的左侧停靠。
  ui->dockwidget_dockWidget_6->setAllowedAreas(Qt::RightDockWidgetArea);  //可在主窗口的右侧停靠。
  ui->dockwidget_dockWidget_8->setAllowedAreas(Qt::BottomDockWidgetArea); //可在主窗口的下侧停靠。

  // 去掉标题栏
  // QWidget *Widget = new QWidget;
  // ui->dockwidget_dockWidget_1->setTitleBarWidget(Widget);

  // 把QDockWidget标题栏竖起来
  // ui->dockwidget_dockWidget_6->setFeatures(QDockWidget::DockWidgetVerticalTitleBar);

  m_docks.append(ui->dockwidget_dockWidget_1);
  m_docks.append(ui->dockwidget_dockWidget_2);
  m_docks.append(ui->dockwidget_dockWidget_3);
  m_docks.append(ui->dockwidget_dockWidget_4);
  m_docks.append(ui->dockwidget_dockWidget_5);
  m_docks.append(ui->dockwidget_dockWidget_6);
  m_docks.append(ui->dockwidget_dockWidget_7);
  m_docks.append(ui->dockwidget_dockWidget_8);
  m_docks.append(ui->dockwidget_dockWidget_9);
}

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

void DockWidget::ShowDockLayout(int type)
{
  RemoveAllDock();
  switch (type)
  {
  case 1:
    addDockWidget(Qt::TopDockWidgetArea, ui->dockwidget_dockWidget_1);
    addDockWidget(Qt::LeftDockWidgetArea, ui->dockwidget_dockWidget_3);
    addDockWidget(Qt::RightDockWidgetArea, ui->dockwidget_dockWidget_6);
    addDockWidget(Qt::BottomDockWidgetArea, ui->dockwidget_dockWidget_8);
    resizeDocks({ui->dockwidget_dockWidget_1, ui->dockwidget_dockWidget_8}, {200, 100}, Qt::Vertical);   //上下
    resizeDocks({ui->dockwidget_dockWidget_3, ui->dockwidget_dockWidget_6}, {300, 300}, Qt::Horizontal); //左右
    ShowDock(QList<int>() << 0 << 2 << 5 << 7);
    break;
  case 2:
    addDockWidget(Qt::TopDockWidgetArea, ui->dockwidget_dockWidget_1);
    addDockWidget(Qt::LeftDockWidgetArea, ui->dockwidget_dockWidget_3);
    addDockWidget(Qt::RightDockWidgetArea, ui->dockwidget_dockWidget_6);
    addDockWidget(Qt::BottomDockWidgetArea, ui->dockwidget_dockWidget_8);

    resizeDocks({ui->dockwidget_dockWidget_1, ui->dockwidget_dockWidget_8}, {200, 100}, Qt::Vertical);   //上下,初始化高度
    resizeDocks({ui->dockwidget_dockWidget_3, ui->dockwidget_dockWidget_6}, {300, 300}, Qt::Horizontal); //左右,初始化宽度

    resizeDocks({ui->dockwidget_dockWidget_1}, {200}, Qt::Horizontal);
    splitDockWidget(ui->dockwidget_dockWidget_1, ui->dockwidget_dockWidget_2, Qt::Horizontal);

    resizeDocks({ui->dockwidget_dockWidget_3}, {50}, Qt::Vertical);
    splitDockWidget(ui->dockwidget_dockWidget_3, ui->dockwidget_dockWidget_4, Qt::Vertical);
    resizeDocks({ui->dockwidget_dockWidget_4}, {100}, Qt::Vertical);
    splitDockWidget(ui->dockwidget_dockWidget_4, ui->dockwidget_dockWidget_5, Qt::Vertical);

    resizeDocks({ui->dockwidget_dockWidget_6}, {150}, Qt::Vertical);
    splitDockWidget(ui->dockwidget_dockWidget_6, ui->dockwidget_dockWidget_7, Qt::Vertical);

    resizeDocks({ui->dockwidget_dockWidget_8}, {300}, Qt::Horizontal);
    splitDockWidget(ui->dockwidget_dockWidget_8, ui->dockwidget_dockWidget_9, Qt::Horizontal);

    ShowDock(QList<int>() << 0 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8);
    break;
  case 3:
    addDockWidget(Qt::TopDockWidgetArea, ui->dockwidget_dockWidget_1);
    tabifyDockWidget(ui->dockwidget_dockWidget_1, ui->dockwidget_dockWidget_2);

    addDockWidget(Qt::LeftDockWidgetArea, ui->dockwidget_dockWidget_3);
    tabifyDockWidget(ui->dockwidget_dockWidget_3, ui->dockwidget_dockWidget_4);
    tabifyDockWidget(ui->dockwidget_dockWidget_4, ui->dockwidget_dockWidget_5);

    addDockWidget(Qt::RightDockWidgetArea, ui->dockwidget_dockWidget_6);
    tabifyDockWidget(ui->dockwidget_dockWidget_6, ui->dockwidget_dockWidget_7);

    addDockWidget(Qt::BottomDockWidgetArea, ui->dockwidget_dockWidget_8);
    tabifyDockWidget(ui->dockwidget_dockWidget_8, ui->dockwidget_dockWidget_9);

    resizeDocks({ui->dockwidget_dockWidget_1, ui->dockwidget_dockWidget_8}, {200, 100}, Qt::Vertical);   //上下
    resizeDocks({ui->dockwidget_dockWidget_3, ui->dockwidget_dockWidget_6}, {300, 300}, Qt::Horizontal); //左右
    ShowDock(QList<int>() << 0 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8);
    break;
  default:
    break;
  }

  // 解决Tabbar上方有一行间隙无法填充背景色问题
  Q_FOREACH (QTabBar *bar, this->findChildren<QTabBar *>())
  {
    bar->setDrawBase(false);
  }
}

/// @brief 移除并隐藏所有的dock
void DockWidget::RemoveAllDock()
{
  for (int i = 0; i < 9; ++i)
  {
    removeDockWidget(m_docks[i]);
  }
}

/// @brief 显示指定序号的dock
/// @param index 指定序号,如果不指定,则会显示所有
void DockWidget::ShowDock(const QList<int> &index)
{
  if (index.isEmpty())
  {
    for (int i = 0; i < 9; ++i)
    {
      m_docks[i]->show();
    }
  }
  else
  {
    foreach (int i, index)
    {
      m_docks[i]->show();
    }
  }
}
QWidget#dockwidget {
  border: none;
  background-color: rgb(30, 30, 30);
}

QDockWidget#dockwidget_dockWidget_1,
#dockwidget_dockWidgetContents_1 {
  border: none;
  background-color: rgb(189, 79, 60);
}

QDockWidget#dockwidget_dockWidget_2,
#dockwidget_dockWidgetContents_2 {
  border: none;
  background-color: rgb(189, 133, 60);
}

QDockWidget#dockwidget_dockWidget_3,
#dockwidget_dockWidgetContents_3 {
  border: none;
  background-color: rgb(161, 189, 60);
}

QDockWidget#dockwidget_dockWidget_4,
#dockwidget_dockWidgetContents_4 {
  border: none;
  background-color: rgb(60, 189, 109);
}

QDockWidget#dockwidget_dockWidget_5,
#dockwidget_dockWidgetContents_5 {
  border: none;
  background-color: rgb(60, 152, 189);
}

QDockWidget#dockwidget_dockWidget_6,
#dockwidget_dockWidgetContents_6 {
  border: none;
  background-color: rgb(62, 60, 189);
}

QDockWidget#dockwidget_dockWidget_7,
#dockwidget_dockWidgetContents_7 {
  border: none;
  background-color: rgb(105, 60, 189);
}

QDockWidget#dockwidget_dockWidget_8,
#dockwidget_dockWidgetContents_8 {
  border: none;
  background-color: rgb(178, 60, 189);
}

QDockWidget#dockwidget_dockWidget_9,
#dockwidget_dockWidgetContents_9 {
  border: none;
  background-color: rgb(189, 60, 120);
}


/* QDockWidget之间的间距调整 */
QMainWindow::separator {
  width: 0px;
  height: 0px;
  margin: 0px;
  /* 如果将两个QDockWidget之间的间距调为0后,QDockWidget将没办法拉拽,所以留出一点小缝隙 */
  padding: 0, 1px;
}

QDockWidget {
  color: white;
}

/* 标题设置 */
QDockWidget::title {
  /* 标题字体在这里设置无效,要在QDockWidget中设置! */
  /* color: white; */
  text-align: left;
  /* 不设置背景色时标题栏下方有空隙! */
  background: rgb(45, 45, 48);
  padding-left: 5px;
}

/* 按钮图标 */
QDockWidget {
  border: 1px solid rgb(45, 45, 48);
  titlebar-close-icon: url(:/dockwidget/resources/image/dockwidget/close.png);
  titlebar-normal-icon: url(:/dockwidget/resources/image/dockwidget/normal.png);
}

QDockWidget::close-button,
QDockWidget::float-button {
  /* 不设置border则hover、pressed时的background颜色不生效! */
  border: 1px solid transparent;
  background: rgb(45, 45, 48);
  /* 会影响标题栏高度 */
  /* padding: 0px; */
  /* 不起作用! */
  icon-size: 32px;
}

QDockWidget::close-button:hover,
QDockWidget::float-button:hover {
  color: rgb(0, 151, 251);
  background: rgb(62, 62, 64);
}

QDockWidget::close-button:pressed,
QDockWidget::float-button:pressed {
  background: rgb(37, 37, 38);
  padding: 1px -1px -1px 1px;
}


/* tabifyDockWidgets TabBar设置*/
QTabBar {
  qproperty-drawBase: 0;
  background: rgb(45, 45, 48);
}

QTabBar::tab {
  color: white;
  background: rgb(45, 45, 48);
  padding: 4px;
  border: 1px solid transparent;
}

QTabBar::tab:hover {
  color: rgb(0, 151, 251);
}

QTabBar::tab:selected {
  color: rgb(0, 151, 251);
  background: rgb(37, 37, 38);
  border-bottom-color: rgb(0, 151, 251);
}

/* 当tab个数大于一定个数时,会出现如下图左侧白线所示,这个是Qt自带的,作用是点击回到第一个tab,但是显示不好看,这里隐藏掉 */
QTabBar::tear {
  width: 0px;
  border: none;
}

github

https://github.com/weichangk/helloqt

参考:

https://doc.qt.io/qt-5/qdockwidget.html
https://doc.qt.io/qt-5/qmainwindow.html#resizeDocks
https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qdockwidget
https://github.com/czyt1988/czyBlog/tree/master/tech/QDockWidget_VSStudioMode
https://zhuanlan.zhihu.com/p/381444869
https://forum.qt.io/topic/88409/stylesheet-and-qtabbar-which-element-is-this

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

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

相关文章

Kafka是什么?Rocket MQ在Spring Boot中怎么整合使用/Kafka在SpringBoot中简单配置使用

写在前面&#xff1a; 继续记录自己的SpringBoot学习之旅&#xff0c;这次是SpringBoot应用相关知识学习记录。若看不懂则建议先看前几篇博客&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 3.5.4.5 SpringBoot整合RocketMQ 3.5.4.5.1 Rocket…

怎么设计个性时尚的班服?一起来看看莱佛士学生的设计

校园时期&#xff0c;每个学生其实都拥有一次做“设计师”的经历&#xff0c;那就是为自己的班集体设计班服&#xff01; 莱佛士设计学院就曾与新加坡国立大学Yong Loo Lin 医学院合作&#xff0c;进行过一场别开生面的校园文创设计大赛&#xff0c;其中不仅有班服设计&#x…

【iOS开发】-UIPickerView

写在开头 昨天学习了iOS一个简单的控件。 UIPickerView; UIPickerView组件类似HTML都Select组件效果&#xff0c;提供数据供用户选择。可以通过plist文件提供数据。UIPickerView是一个选择器控件&#xff0c;可以生成单列的选择器&#xff0c;也可以生成多列的选择器&#xff…

【待解决】Not a Prefab scene

开发平台&#xff1a;Unity 2018.4.10f1 编程平台&#xff1a;Visual Studio   问题描述 注意&#xff1a;这是一个 意义不明 的报错内容。   问题发生环境&#xff08;可能不唯一&#xff09; 在 Unity 2018版本中&#xff0c;编辑场景内已有预制体的游戏对象时发生的问题…

stm32cubemx hal学习记录:FreeRTOS消息队列

一、基本介绍 1、消息队列就是一个像容器一样的东西&#xff0c;我们所有的任务都可以往内部写&#xff0c;然后队列会将我们的消息按顺序存下来&#xff0c;所有的任务也可以按顺序将其读出来。 2、队列需要明确数据的大小以及队列的长度&#xff0c;写队列和读队列都是采用…

16.面试重点CookieSession

一、文件上传&#xff08;使用频率高&#xff0c;但不是很重要&#xff09; 1.通过form表单 前端&#xff1a; form表单&#xff0c;method必须是POST, enctype属性是multipart/form-data, type是file 引起HTTP请求体的格式以multipart的形式传输 后端&#xff1a; 正常…

UnRaid虚拟机安装Uos家庭版并由Windows远程桌面访问的成功流程

文章目录0、前言1、UnRaid虚拟机安装Uos家庭版1.1、下载Uos系统镜像1.1.1、在https://home.uniontech.com/官网下载镜像安装包&#xff08;如下图&#xff1a;&#xff09;1.1.2、上传至Unraid1.1.3、添加虚拟机1.1.4、激活Uos家庭版2、开启Uos的远程桌面2.1、为Uos安装xrdp服务…

【制作数字人】零门槛通过三维重建技术生成个人三维模型

依托各项技术的发展&#xff0c;数字人技术开始拔地而起。我们发现&#xff0c;各大一线互联网企业、三大运营商&#xff0c;还有不少创业型公司都纷纷入局数字人。 难道元宇宙的入门票是数字人&#xff1f;等不及了&#xff0c;马上接触下这门技术。经简单了解&#xff0c;现…

前端学习路线(三)

往期回顾↓↓↓ 前端学习路线&#xff08;一&#xff09; 前端学习路线&#xff08;二&#xff09; 在前两章中&#xff0c;我们讲了如何去学习前端三剑客、js高级和bootstrap的重点&#xff0c;得到了很多前端初学者的好评&#xff0c;收藏量也是每天都在增加&#xff0c;所以…

【身份证识别】基于matlab GUI BP神经网络身份证识别【含Matlab源码 2239期】

⛄一、身份证号码识别简介 1 引言 当今是一个信息高度发达的时代&#xff0c;对于每个公民而言身份证那一连串的数字体现了个人信息的唯一性&#xff0c;出于保障公民合法权益和社会治安的考虑&#xff0c;越来越多的行业都开始建立自己的安全保障体系&#xff0c;其中最为关键…

STA:虚拟时钟(virtual clock)与I/O延时约束

1.什么是虚拟时钟&#xff1f; 虚拟时钟&#xff08;virtual clock&#xff09;是存在但没有clock source(pin/port)定义的时钟&#xff0c;仅作为输入输出端口延时约束的参考时钟。定义方式如下例: create_clock -name virtual_clock -period 10 -waveform {0 5} &#xff1…

第四章:Spring七大核心模块Bean、Core、Context

Spring框架七大模块 容器模块&#xff08;spring core&#xff09;、应用上下文模块&#xff08;spring context&#xff09;、AOP模块&#xff08;spring aop&#xff09;、JDBC抽象和DAO模块&#xff08;spring dao&#xff09;、对象/关系映射集成模块&#xff08;spring o…

R3LIVE代码详解(三)

0. 简介 在上一章中&#xff0c;我们过完了主函数以及LIO的操作&#xff0c;由于这部分代码在FAST-LIO2中已经充分详细的介绍过了&#xff0c;所以说这里在R3LIVE中就不过多介绍了&#xff0c;下面我们来看一下本系列的重点&#xff0c;即VIO部分。 1. 主函数 我们在之前分析…

美国访问学者申请|J1签证官方指定材料大全

美国访问学者申请需要哪些材料&#xff1f;下面就随知识人网老师一起来看一看J1签证官方指定材料大全。 一、 有效护照&#xff1a;如果您的护照将在距您预计抵美日期的六个月内过期、或已损坏、或护照上已无空白的签证签发页, 请在前来面谈之前先申请一本新护照。 二、DS-160…

leetcode:1957. 删除字符使字符串变好

难度&#xff1a;简单 一个字符串如果没有 三个连续 相同字符&#xff0c;那么它就是一个 好字符串 。 给你一个字符串 s &#xff0c;请你从 s 删除 最少 的字符&#xff0c;使它变成一个 好字符串 。 请你返回删除后的字符串。题目数据保证答案总是 唯一的 。 示例 1&#xf…

Podman 部署私有镜像仓库

Podman 部署私有镜像仓库 文章目录Podman 部署私有镜像仓库1. 安装 Podman 和 httpd-tools2. 配置仓库存储位置3. 生成访问仓库的凭据3.1 htpasswd 用户名和密码3.2 TLS 密钥对4. 启动容器5. 测试5.1 登陆5.2 API访问5.3 镜像入库5.4 查询镜像信息Podman是一个无守护进程的开源…

JavaScript基础(14)_in、hasOwnProperty、instanceof的用法、垃圾回收

in 用法&#xff1a;检查对象和原型对象是否含有该属性。 语法&#xff1a;"属性名" in 对象名 hasOwnProperty 用法&#xff1a;检查对象自身是否含有该属性。 语法&#xff1a;对象名.hasOwnProperty("属性名") instanceof 用法&#xff1a;检查一个对…

在裸机上输出Hello,world! [rCore-lab1]

引言 非常简单的“Hello, world”应用程序,实际上有着多层硬件和软件工具和支撑环境隐藏在它背后&#xff0c;才让我们不必付出那么多努力就能够创造出功能强大的应用程序。生成应用程序二进制执行代码所依赖的是以 编译器 为主的开发环境&#xff1b;运行应用程序执行码所依赖…

寻找更好的分类模型loss

寻找更好的loss1.CE loss并不完美2.可能更好的loss函数2.1 CC-LOSS2.2 Center-LOSS参考文献1.CE loss并不完美 最常用于深度学习分类模型的损失函数可以说就是CE(交叉熵) loss了。正如CC-LOSS paper中所述&#xff0c;该loss更关注各类是否separated&#xff0c;而非不同类之间…

Zookeeper:实现“通知协调”的 Demo

应用配置集中到节点上&#xff0c;应用启动时主动获取&#xff0c;并在节点上注册一个 watcher&#xff0c;每次配置更新都会通知到应用。数据发布/订阅&#xff08;Publish/Subscribe&#xff09;系统&#xff0c;即所谓的配置中心&#xff0c;顾名思义就是发布者将数据发布到…