Qt中QSplitter使QWidget改变屏占比

2023-11-19

Qt系列文章目录

前言

在Qt中把QWidget窗体三等分,我想实现QWidget中的三等分窗口能够像QDockWidget类一样用鼠标拖动这三等分窗体边缘使屏占比改变。一般我们会直接使用QDockWidget,但是我们这里只想鼠标拖拽,不需要窗体停靠的功能。
QDockWidget类提供了一个特殊的窗口部件,它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。QDockWidget可以移动、悬浮,在许多工程软件中,都是使用dock布局窗口,用户可以自由组合窗口界面。
我们可以使用QSplitter控件,布局器中控件大小是根据窗口大小自动调整,用户能拉伸窗口但是不能直接拉伸界面内部的某个控件
先看一下效果
在这里插入图片描述

一、QSplitter是什么?

一个QSplitter是一个可以包含其他控件的控件,这些控件被一个分隔条隔开,托拽这个分隔条,可以改变splitter的子控件的大小。

QSplitter控件经常做为布局管理器使用,给用户提供更多的界面控制。
默认情况下,QSplitter动态调整子节点的大小,也即是鼠标按下拖动的时候,控件大小也随着变,如果希望QSplitter只在调整大小操作结束时调整子节点的大小,也即是鼠标按下拖动的时候不调整大小,释放鼠标之后,也即是调整结束后才调整大小,用setOpaqueResize(false) 来设置。

控件之间的初始大小分布由初始大小与拉伸因子相乘确定。还可以使用 setSizes() 来设置所有 控件的大小。函数 sizes() 返回用户设置的大小。或者,我们以分别使用 saveState() 和restoreState() 从QByteArray保存和恢复 之前控件的大小状态,等下一次启动的时候把这个状态再恢复就好啦。

当我们 hide() 一个子节点控件时,它的空间将被分配给其他的子节点。当我们 show() 它时,它将被恢复。
1.QSplitter的构造方法:

QSplitter *splitterMain=new QSplitter(Qt::Horizontal,0);

第一个参数通过Qt::Horizontal 和 Qt::Vertical来设定为水平分割或垂直分割。第二个设定0代表是主窗口,无父窗口。

不过子splitter设置的

new QSplitter(Qt::Vertical,splitterMain);

代表主窗口是splitterMain。则子splitter就被添加到splitterMain中。

添加时为从左至右(或从上至下)添加;

二、具体代码

1.头文件

#ifndef PROJECTWIN_H
#define PROJECTWIN_H

#include <QWidget>
#include <QStandardPaths>
#include <QDir>
#include <QDebug>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QSplitter>
#include <QTextEdit>
#include <QVector>
#include <QFile>
#include <QTextStream>
#include <QSplitter>
#include "FileMonitorMgr.h"

namespace Ui {
class ProjectWin;
}


const QString styles = "QTreeView\
{\
        background-color: #5B677A;\
        font-size:17px;\
        color: white;\
}\
    QTreeView::item:hover\
{\
        background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e7effd, stop: 1 #cbdaf1);\
        border: 1px solid #bfcde4;\
}\
    QTreeView::item:hover\
{\
        background: rgb(69, 187, 217);\
}\
    QTreeView::item:selected:active\
{\
        background: rgb(255, 62, 150);\
}\
    QTreeView::item:selected:!active\
{\
        background: rgb(63, 147, 168);\
}\
    QTreeView::branch\
{\
        background:#5B677A;\
}\
    QTreeView::branch:has-children:!has-siblings:closed,QTreeView::branch:closed:has-children:has-siblings\
{\
        border-image: none;\
        background:#5B677A;\
        image: url(image/Folder-1.png);\
}\
    QTreeView::branch:open:has-children:!has-siblings,QTreeView::branch:open:has-children:has-siblings\
{\
        border-image: none;\
        background:#5B677A;\
        image: url(image/Open-Folder.png);\
}";


class ProjectWin : public QWidget
{
    Q_OBJECT
public:
    static ProjectWin* getInstance();
    ~ProjectWin();

    FileMonitorMgr *m_fileMgr;
    QString m_paraFolder;
private:
    QTreeWidget* m_picTree;
//    QTreeWidget* m_paraTree;
    QWidget* m_naviWgt;

private:
    void initWidget();
    void initPicTree();
    void readParaFile(QString filePath);
private:
    Ui::ProjectWin *ui;
    QGridLayout* m_grid;
    QWidget* m_centralWidget;
    QTabWidget* m_tabWidget;
    QTabWidget* m_tabWidgetPara;
    QTabWidget* m_tabWidgetNavi;
    QTextEdit*  m_paraText;
    QVBoxLayout* m_mainLayout;

    static ProjectWin* m_pInstance;
private:
    explicit ProjectWin(QWidget *parent = nullptr);
    static void destroyInstance();
public:
Q_SIGNALS:
    void sigShowImageBorder(const QString &imageName);
//    void appendText(const QString &text);
public Q_SLOTS:
    void slotPicTree(QVector<QString> lst, QString path);
    void slotNavi(const QString& file);
    void onItemClicked(QTreeWidgetItem *item, int column);
    void slotParaInfo(QString imageName);
    void slotImageSelectNode(QString imageName);
    void slotUpdatePicTree(const QStringList& fileList);
};

#endif // PROJECTWIN_H

2.实现文件

#include "ProjectWin.h"
#include "ui_ProjectWin.h"

#pragma execution_character_set("utf-8")


ProjectWin* ProjectWin::m_pInstance = nullptr;

ProjectWin* ProjectWin::getInstance()
{
    if(!m_pInstance)
    {
        m_pInstance = new ProjectWin();
        atexit(destroyInstance);
    }
    return m_pInstance;
}

void ProjectWin::destroyInstance()
{
    if(m_pInstance)
    {
        delete m_pInstance;
        m_pInstance = nullptr;
    }
}

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

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

    //图像列表
    m_tabWidget = new QTabWidget();
//    m_tabWidget->setStyleSheet("border: 0; background: transparent");
//    m_tabWidget->setStyleSheet("border: 0");
    m_picTree = new QTreeWidget();
//    m_picTree->setStyleSheet("border: 0; background: transparent");
    m_picTree->hide();
    m_picTree->setStyleSheet("border: 1");
    m_picTree->setContextMenuPolicy(Qt::CustomContextMenu);
    m_picTree->setColumnCount(1);
    m_picTree->setHeaderHidden(true);
    connect(m_picTree, &QTreeWidget::itemClicked, this, &ProjectWin::onItemClicked);

    //图像参数
    m_tabWidgetPara = new QTabWidget();
    m_paraText = new QTextEdit();
    m_tabWidgetPara->addTab(m_paraText, u8"分裂器中间的窗体"/*u8"图像参数数据"*/);
    m_tabWidgetPara->setStyleSheet("border: 1");
    m_paraText->setStyleSheet("border: 1");

//    m_tabWidgetPara->setTabText(0, u8"图像参数数据");

    //导航
    m_tabWidgetNavi = new QTabWidget();
    m_naviWgt = new QWidget();
    m_tabWidgetNavi->addTab(m_naviWgt, u8"分裂器最下面的窗体"/*u8"导航"*/);

    //创建三个部件组
    QWidget* picGroup = new QWidget();
    QWidget* paraGroup = new QWidget();
    QWidget* naviGroup = new QWidget();

    // 只设置QWidget的边框为0,不影响子元素
    picGroup->setStyleSheet("QWidget { border: 0px }");
    paraGroup->setStyleSheet("QWidget { border: 0px }");
    naviGroup->setStyleSheet("QWidget { border: 0px }");

    QSplitter* splitter= new QSplitter(Qt::Vertical, this);
    splitter->addWidget(picGroup);
    splitter->addWidget(paraGroup);
    splitter->addWidget(naviGroup);

    QList<int> sizes;
    sizes << this->height() / 3 << this->height() / 3 << this->height() / 3;
    splitter->setSizes(sizes);

    // 设置拉伸比例,其中1、1、1表示三个窗口的初始尺寸比例都是1,即相等
    splitter->setStretchFactor(0, 1);
    splitter->setStretchFactor(1, 1);
    splitter->setStretchFactor(2, 1);

    QVBoxLayout* picLayout = new QVBoxLayout();
    picLayout->setMargin(0);
    picLayout->setSpacing(0);
    picLayout->addWidget(m_tabWidget);
    picLayout->addWidget(m_picTree);
    picGroup->setLayout(picLayout);

    QVBoxLayout* paraLayout = new QVBoxLayout();
    paraLayout->setMargin(0);
    paraLayout->setSpacing(0);
    paraLayout->addWidget(m_tabWidgetPara);
//    paraLayout->addWidget(m_paraText);
    paraGroup->setLayout(paraLayout);

    QVBoxLayout* naviLayout = new QVBoxLayout();
    naviLayout->setMargin(0);
    naviLayout->setSpacing(0);
    naviLayout->addWidget(m_tabWidgetNavi);
    naviGroup->setLayout(naviLayout);

    // 设置窗口的主布局
    QVBoxLayout* mainLayout = new QVBoxLayout();
    mainLayout->setMargin(0);
    mainLayout->setSpacing(0);
//    mainLayout->addWidget(picGroup);
//    mainLayout->addWidget(paraGroup);
//    mainLayout->addWidget(naviGroup);
    mainLayout->addWidget(splitter);
    this->setLayout(mainLayout);

//    connect(this, &ProjectWin::appendText, m_paraText, &QTextEdit::append);
}

void ProjectWin::onItemClicked(QTreeWidgetItem *item, int column)
{
    QString imageName = item->text(0);
    emit sigShowImageBorder(imageName);
}

void ProjectWin::initWidget()
{

    //    m_picTree->header()->hide();//设置隐藏头
}

void ProjectWin::initPicTree()
{

}

void ProjectWin::readParaFile(QString filePath)
{
    if (!m_paraText) {
        qDebug() << "m_paraText is null!";
        return;
    }

    m_paraText->clear();

    QString txtFile = filePath.left(filePath.size() -3);
    txtFile += "txt";
    QFile file(txtFile);
    if(!file.open(QIODevice::ReadOnly)) {
        qDebug() << file.errorString();
        return;
    }

    QTextStream in(&file);
    in.setCodec("UTF-8");  // 设置编码为UTF-8

    while(!in.atEnd()) {
        QString line = in.readLine();
//        emit appendText(line);  // 使用信号来添加文本
        m_paraText->append(line);
        // 这里处理每一行
        qDebug() << line;
    }

    file.close();
}

void ProjectWin::slotPicTree(QVector<QString> lst, QString path)
{
    m_paraFolder = path;
    m_picTree->show();
    QTreeWidgetItem* topItem = new QTreeWidgetItem(m_picTree);
    topItem->setText(0, path);
    topItem->setCheckState(0, Qt::Checked);
    m_picTree->addTopLevelItem(topItem);
    int count = lst.size();
    //添加顶层节点
    if (lst.size() > 0)
    {
        for (int i = 0; i < lst.size(); i++)
        {
            //int size = lst.at(i).size();
            //int pos = lst.at(i).lastIndexOf("/");
            //QString temp = lst.at(i).right(size - pos - 1);
            QTreeWidgetItem* item = new QTreeWidgetItem(topItem);
            item->setText(0, lst.at(i));
            item->setCheckState(0, Qt::Checked);
        }
    }

    m_picTree->expandAll();
    //    m_grid = new QGridLayout(this);
    //    m_grid->addWidget(m_picTree);
    m_picTree->setStyleSheet(styles);

    //    this->setLayout(m_grid);

    m_tabWidget->addTab(m_picTree, u8"彩C");
}

void ProjectWin::slotParaInfo(QString imageName)
{
    QString fullPath = m_paraFolder + "/" + imageName;
    readParaFile(fullPath);
}

void ProjectWin::slotImageSelectNode(QString imageName)
{
    QList<QTreeWidgetItem *> items = m_picTree->findItems(imageName, Qt::MatchExactly | Qt::MatchRecursive);

    if(!items.empty()){
        m_picTree->setCurrentItem(items.at(0));
    }
}

void ProjectWin::slotUpdatePicTree(const QStringList &fileList)
{
    for(const QString& str : fileList)
    {
        QTreeWidgetItem* item = new QTreeWidgetItem(m_picTree);
        item->setText(0, str);
        item->setCheckState(0, Qt::Checked);
    }

}

void ProjectWin::slotNavi(const QString& file)
{
    m_tabWidgetNavi->addTab(m_naviWgt, u8"导航");
}

总结

主要是看ProjectWin的构造函数

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

    //图像列表
    m_tabWidget = new QTabWidget();
//    m_tabWidget->setStyleSheet("border: 0; background: transparent");
//    m_tabWidget->setStyleSheet("border: 0");
    m_picTree = new QTreeWidget();
//    m_picTree->setStyleSheet("border: 0; background: transparent");
    m_picTree->hide();
    m_picTree->setStyleSheet("border: 1");
    m_picTree->setContextMenuPolicy(Qt::CustomContextMenu);
    m_picTree->setColumnCount(1);
    m_picTree->setHeaderHidden(true);
    connect(m_picTree, &QTreeWidget::itemClicked, this, &ProjectWin::onItemClicked);

    //图像参数
    m_tabWidgetPara = new QTabWidget();
    m_paraText = new QTextEdit();
    m_tabWidgetPara->addTab(m_paraText, u8"分裂器中间的窗体"/*u8"图像参数数据"*/);
    m_tabWidgetPara->setStyleSheet("border: 1");
    m_paraText->setStyleSheet("border: 1");

//    m_tabWidgetPara->setTabText(0, u8"图像参数数据");

    //导航
    m_tabWidgetNavi = new QTabWidget();
    m_naviWgt = new QWidget();
    m_tabWidgetNavi->addTab(m_naviWgt, u8"分裂器最下面的窗体"/*u8"导航"*/);

    //创建三个部件组
    QWidget* picGroup = new QWidget();
    QWidget* paraGroup = new QWidget();
    QWidget* naviGroup = new QWidget();

    // 只设置QWidget的边框为0,不影响子元素
    picGroup->setStyleSheet("QWidget { border: 0px }");
    paraGroup->setStyleSheet("QWidget { border: 0px }");
    naviGroup->setStyleSheet("QWidget { border: 0px }");

    QSplitter* splitter= new QSplitter(Qt::Vertical, this);
    splitter->addWidget(picGroup);
    splitter->addWidget(paraGroup);
    splitter->addWidget(naviGroup);

    QList<int> sizes;
    sizes << this->height() / 3 << this->height() / 3 << this->height() / 3;
    splitter->setSizes(sizes);

    // 设置拉伸比例,其中1、1、1表示三个窗口的初始尺寸比例都是1,即相等
    splitter->setStretchFactor(0, 1);
    splitter->setStretchFactor(1, 1);
    splitter->setStretchFactor(2, 1);

    QVBoxLayout* picLayout = new QVBoxLayout();
    picLayout->setMargin(0);
    picLayout->setSpacing(0);
    picLayout->addWidget(m_tabWidget);
    picLayout->addWidget(m_picTree);
    picGroup->setLayout(picLayout);

    QVBoxLayout* paraLayout = new QVBoxLayout();
    paraLayout->setMargin(0);
    paraLayout->setSpacing(0);
    paraLayout->addWidget(m_tabWidgetPara);
//    paraLayout->addWidget(m_paraText);
    paraGroup->setLayout(paraLayout);

    QVBoxLayout* naviLayout = new QVBoxLayout();
    naviLayout->setMargin(0);
    naviLayout->setSpacing(0);
    naviLayout->addWidget(m_tabWidgetNavi);
    naviGroup->setLayout(naviLayout);

    // 设置窗口的主布局
    QVBoxLayout* mainLayout = new QVBoxLayout();
    mainLayout->setMargin(0);
    mainLayout->setSpacing(0);
//    mainLayout->addWidget(picGroup);
//    mainLayout->addWidget(paraGroup);
//    mainLayout->addWidget(naviGroup);
    mainLayout->addWidget(splitter);
    this->setLayout(mainLayout);

//    connect(this, &ProjectWin::appendText, m_paraText, &QTextEdit::append);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt中QSplitter使QWidget改变屏占比 的相关文章

  • Linq - 从表达式 创建表达式

    我有一个谓词Expression
  • Caliburn.Micro - ShowDialog() 如何关闭对话框?

    EDIT 新信息 刚刚设法让记录器工作 老实说 我不知道 cm 有一个 并且在尝试使用时收到此消息TryClose TryClose requires a parent IConductor or a view with a Close m
  • NDK 应用 onDestroy 清理 - 如何 DetachCurrentThread

    因此 如果我们连接 我们必须在完成后分离线程 对吗 JNIEnv get jni env JNIEnv res JAVA VM gt GetEnv void res JNI VERSION 1 6 Using cached JavaVM J
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • 将公历日期转换为儒略日期,然后再转换回来(随着时间)

    我正在编写一个程序 必须将当前的公历日期和时间转换为儒略日期 然后再转换回公历门 最终我需要添加能够添加年 月 日 小时 分钟和秒的功能 但我需要先解决这部分问题 现在我已经从公历日期转换为儒略日期 所以从逻辑上讲 我觉得我应该能够以某种方
  • 最新 .Net MongoDb.Driver 的连接问题

    我创建了一个 MongoLab 沙箱数据库 我与 MongoChef 连接 效果很好 我通过 Nuget 安装了 MongoDB Driver 2 2 2 我编写了一些简单的 C 演示代码 但就是无法使其工作 连接字符串是直接从 Mongo
  • 嵌入资源文件的路径

    我的资源文件中有一个图标 我想引用它 这是需要图标文件路径的代码 IWshRuntimeLibrary IWshShortcut MyShortcut MyShortcut IWshRuntimeLibrary IWshShortcut W
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • opencv中如何去除二值图像噪声?

    将图像转换为二值图像 黑白 后如果有任何噪音怎么办 我消除了那些不需要的噪音 您可以看到下图的黑色区域内有一些白噪声 我该如何去除噪声 使用opencv http img857 imageshack us img857 999 blackn
  • wkhtmltopdf 修补了 qt 吗?

    我正在尝试将多个 URL 转换为 PDF 但是 当我编译 wkhtmltopdf 或运行时apt get install wkhtmltopdf并尝试一下 它说 错误 此版本的 wkhtmltopdf 是针对未修补的 QT 版本构建的 并且
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • 使用数据绑定,如何将包含表情符号的文本绑定到标签并使其正确显示?

    我正在编写一个应用程序来连接 WordPress BuddyPress API 该应用程序将允许用户通过 API 相互发送消息 当这些消息包含表情符号时 我很难正确显示它们 以下是 API 返回的消息文本的简短示例 Hi x1f642 ho
  • Type.GetInterfaces() 仅适用于声明的接口

    首先 像这样的问题有很多 也许有些OP甚至在问同样的问题 问题是这些问题的答案 无论是否接受 都没有真正回答这个问题 至少我找不到 如何确定类直接声明的接口 而不是由父级或声明的接口继承的接口 e g interface I interfa
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • 如何将System.Windows dll添加到Visual Studio 2010 Express?

    我正在开发一个小型应用程序C and VS2010 as IDE with NET框架4 我想用CaptureSource类以便从笔记本电脑的网络摄像头捕获视频 为此我需要添加一个命名空间System Windows DependencyO
  • 如何从 Access 数据库中读取“是/否”值作为布尔值?

    帮我找回YES NO来自 MS Access 的布尔格式数据类型 我尝试解析它 但它总是返回 false 更新 实际上不是问题抱歉 它确实接受 YES NO 作为布尔值 OleDbconnection dbConnect new OleDb
  • 将一个 IEnumerable 拆分为多个 IEnumerable

    我是 linq 新手 我需要根据指示器将 Couple string text bool Indicator 类型的 IEnumerable 拆分为多个 IEnumerable 我尝试使用skipWhile 和 TakeWhile 但没有找
  • 如何使用 C# 为 azure devops 变量赋值

    我有 selenium C 测试脚本 可以从浏览器获取令牌 我有两个 azure devops 任务 一个用于执行 selenium 测试 另一个用于执行 API 测试 我想将 selenium 测试获取的令牌传递给 API 测试执行任务

随机推荐

  • R语言读取Excel文件

    因为一个项目需要 原始数据全部是Excel文件 包括 xls和 xlsx格式 并且很多excel数据的格式并不规范 一个个转为csv格式不太现实 所以把所有能了解到的读取excel的方法都试了一遍 做个简单汇总 相关的包 RODBC xls
  • IGBT工作原理及作用

    一 IGBT是什么 IGBT Insulated Gate Bipolar Transistor 绝缘栅双极型晶体管 是由BJT 双极型三极管 和MOS 绝缘栅型场效应管 组成的复合全控型电压驱动式功率半导体器件 兼有MOSFET的高输入阻
  • condition_variable 锁

    std condition variable提供了两种 wait 函数 当前线程调用 wait 后将被阻塞 此时当前线程应该获得了锁 mutex 不妨设获得锁 lck 直到另外某个线程调用 notify 唤醒了当前线程 在线程被阻塞时 该函
  • QML 相互之间通讯 信号 槽

    QML 之间 信号与槽 方式一 对于 QML 中的属性如果其值发生改变 QML 自动会发生相关信号 on
  • 关于nlp-pyltp的基本介绍和使用

    一 下载 ltp 模型 ltp data v3 4 0 pyltp 1 ltp模型下载地址如下 https download csdn net download TFATS 12758993 2 下载pyltp如下 pip install
  • 编译linux内核成vmlinuz,内核编译之vmlinuz vmlinux system.map initrd

    一 vmlinuz vmlinuz是可引导的 压缩的内核 vm 代表 Virtual Memory Linux 支持虚拟内存 不像老的操作系统比如DOS有640KB内存的限制 Linux能够使用硬盘空间作为虚拟内存 因此得名 vm vmli
  • 使用Minitab解决Excel的限制问题

    前两天 当我在做数据转置以期获得更好分析图形的时候 我碰到了传说中excel的限制 如图 在解决这个问题的过程中 我发现了用来做数据分析 比excel更好的工具Minitab 打开minitab 把纪录数据的Excel表以File gt O
  • pageaudit 属性不正确。_浅析script 标签的 async 和 defer 属性

    每日前端夜话 第420篇 正文共 1500 字 预计阅读时间 7 分钟 前端当然要从 HTML 开始 今天来聊聊在 script 标签中加上 async defer 时的功能及差异 都明白的道理 我们都知道 浏览器解析 HTML 是一行一行
  • 【Xilinx Vivado时序分析/约束系列4】FPGA开发时序分析/约束-实验工程上手实操

    目录 建立工程 添加顶层 模块1 模块2 添加约束文件 编辑时钟约束 打开布线设计 代码代表的含义 时序报告 进行时序分析 Summary 包含了汇总的信息量 Source Clock Path 这部分是表示Tclk1的延时细节 Data
  • 数字后端知识点扫盲——CTS (上)

    后端和前端一样在IC设计中扮演着非常重要的角色 甚至可以说入门的前端设计工程师对timing的理解远不如一个后端设计工程师 因此想要更好的理解电路的timing在后端P R之后或者说在大规模的设计中后端如何实现clock对DFF的驱动 就需
  • VM16 CentOS 快照恢复以及Linux自动修复指令

    目录 快照恢复 自动修复磁盘 快照恢复 点击上图的拍摄快照 即可进行CentOS 6的虚拟机系统备份 需要恢复系统 就点击之前备份过的快照记录 即可恢复系统 自动修复磁盘 当Linux启动时出现 UNEXPECTED INCONSISTEN
  • 【threejs】根据点绘制直线

    实现代码
  • 东京大学最新研究成果!一种可实现陆空两栖的新型四足机器人SPIDAR,具备多模态运动能力

    原创 文 BFT机器人 现实中 蜘蛛可以凭借飘荡的蛛丝在空中漂浮 让它们能够穿越复杂地形 普通蜘蛛长度只有几毫米 重量只有几十克 如何让比蜘蛛重数百倍的机器人实现多模态运动 是众多学者研究的热点 具有多模态运动能力的机器人 几乎都是移动系统
  • ESP32-C2开发板 Homekit烧录教程

    准备 1 1硬件ESP32 C2开发板 如图1 1所示 图1 1 ESP32 C2开发板 1 2软件 CozyLife APP可以在各大应用市场搜索下载 也可以扫描二维码下载如图1 2所示 HomeKit flash download to
  • 【Maven】maven如何配置本地仓库?

    前言 很多小伙伴不清楚怎么配置maven本地仓库 这里给大家分享一下方法 如果觉得有用的话 记得点赞支持哦 1 创建新的路径 maven默认的存放路径是C盘 在你想要的位置创建一个存放maven repository的路径 我是创建在了D盘
  • 读取其他进程内存数据

    1 读取进程内存数据 读取其他进程内存数据 需要用到的windows API函数 BOOL ReadProcessMemory HANDLE hProcess LPCVOID lpBaseAddress LPVOID lpBuffer DW
  • Mysql-DML(数据处理语言)

    插入数据 insert into member values 1 张三 21 5000 insert into member id name values 2 李四 insert into member values 3 王五 23 300
  • typedef struct 用法详解

    typedef为C语言的关键字 作用是为一种数据类型定义一个新名字 当typedef与结构结合使用时 会有一些比较复杂的情况 而且在C语言和C 里面有略有差别 本文将详细讲解typedef struct的用法 第一篇 typedef str
  • C++异常处理

    如果你写的方法是给他人使用 那么 如果这个方法失败 最好是以抛异常的方式告诉别人 而不是在方法声明的地方写注释 0 成功 1 网络连接失败 3 参数错误 抛出异常 throw 1 抛出 int 类型异常 throw 1 2 抛出 doubl
  • Qt中QSplitter使QWidget改变屏占比

    Qt系列文章目录 文章目录 Qt系列文章目录 前言 一 QSplitter是什么 二 具体代码 1 头文件 2 实现文件 总结 前言 在Qt中把QWidget窗体三等分 我想实现QWidget中的三等分窗口能够像QDockWidget类一样