Qt 窗口(MainWindow) 上

Qt 窗口是通过 QMainWindow 类来实现的

QMainWindow 是一个为用户提供主窗口程序的类,继承自 QWidget 类,并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏(menubar)多个工具栏(toolbars)多个浮动窗口(铆接部件)(dockwidgets)一个状态栏(statusbar)和一个中心部件(centralwidget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为 QMainwindow 中各组件所处的位置:

在这里插入图片描述

菜单栏(MenuBar)

Qt 中的菜单栏是通过 QMenuBar 这个类来实现的。一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题下面。

菜单栏中包含菜单.菜单中包含菜单项.

在这里插入图片描述

创建菜单栏

方式一:菜单栏的创建可以借助于 QMainWindow 类提供的 menuBar() 函数来实现。menubar() 函数原型如下:

QMenuBar * menuBar() const
//创建菜单栏
QMenuBar *menubar = menuBar();
//将菜单栏放入窗口中
this->setMenuBar(menubar);

方式二:在堆上动态创建;

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

使用 setMenuBar 把菜单栏放到窗口中.

在菜单栏中添加菜单

创建菜单,并通过 QMenu 提供的 addMenu() 函数来添加菜单。

示例

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

    QMenu *menu1 = new QMenu("文件");
    QMenu *menu2 = new QMenu("编辑");
    QMenu *menu3 = new QMenu("构建");

    menubar->addMenu(menu1);
    menubar->addMenu(menu2);
    menubar->addMenu(menu3);
}

mainwindow创建的时候菜单栏默认会创建,所以是setMenuBar,而不是addMenuBar

效果如下

在这里插入图片描述

创建菜单项

在 Qt 中,并没有专门的菜单项类,可以通过 QAction 类,抽象出公共的动作。如在菜单中添加菜单项.

QAction 可以给菜单栏使用, 也可以给工具栏使用.

示例

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

    QMenu *menu1 = new QMenu("文件");
    QMenu *menu2 = new QMenu("编辑");
    QMenu *menu3 = new QMenu("构建");

    menubar->addMenu(menu1);
    menubar->addMenu(menu2);
    menubar->addMenu(menu3);

    //创建菜单项
    QAction *act1 = new QAction("open");
    QAction *act2 = new QAction("close");
    QAction *act3 = new QAction("create");

    //将菜单项添加到菜单上
    menu1 ->addAction(act1);
    menu1 ->addAction(act2);
    menu1 ->addAction(act3);
}

效果如下

在这里插入图片描述

在菜单栏之间添加分割线

在菜单项之间可以添加分割线。分割线如下图所示,添加分割线是通过 QMenu 类提供的 addSeparator() 函数来实现;

示例

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

    QMenu *menu1 = new QMenu("文件");
    QMenu *menu2 = new QMenu("编辑");
    QMenu *menu3 = new QMenu("构建");

    menubar->addMenu(menu1);
    menubar->addMenu(menu2);
    menubar->addMenu(menu3);

    //创建菜单项
    QAction *act1 = new QAction("open");
    QAction *act2 = new QAction("close");
    QAction *act3 = new QAction("create");

    //将菜单项添加到菜单上
    menu1 ->addAction(act1);
    menu1->addSeparator();   //在open和close之间添加分割线
    menu1 ->addAction(act2);
    menu1->addSeparator();
    menu1 ->addAction(act3);
    menu1->addSeparator();
}

在这里插入图片描述

综合示例

在窗口上创建一个菜单栏,在菜单栏中添加一些菜单,在某一个菜单中添加一些菜单项。

1、新建 Qt 项目

注意:此时新建项目时选择的基类 QMainwindow ,如下图示:

在这里插入图片描述

2、在 “mainwindow.cpp” 文件中创建菜单和中央控件

  • 创建一个菜单栏, 一个菜单.
  • 两个菜单项: 保存, 加载
  • 创建一个 QTextEdit 作为窗口的中央控件.
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void save();
    void load();

private:
    Ui::MainWindow *ui;
    QTextEdit* edit;
};

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 设置标题
    this->setWindowTitle("我的记事本");
    // 创建菜单栏
    QMenuBar* menuBar = new QMenuBar(this);
    this->setMenuBar(menuBar);
    // 创建菜单
    QMenu* menu = new QMenu("文件");
    menuBar->addMenu(menu);
    // 创建菜单项
    QAction* action1 = new QAction("保存");
    QAction* action2 = new QAction("加载");
    menu->addAction(action1);
    menu->addAction(action2);
    // 创建中央控件
    edit = new QTextEdit(this);
    this->setCentralWidget(edit);
    edit->setPlaceholderText("此处编写⽂本内容...");
}

3、给 action 添加一些动作

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 设置标题
    this->setWindowTitle("我的记事本");
    // 创建菜单栏
    QMenuBar* menuBar = new QMenuBar(this);
    this->setMenuBar(menuBar);
    // 创建菜单
    QMenu* menu = new QMenu("文件");
    menuBar->addMenu(menu);
    // 创建菜单项
    QAction* action1 = new QAction("保存");
    QAction* action2 = new QAction("加载");
    QAction* action3 = new QAction("退出");
    menu->addAction(action1);
    menu->addAction(action2);
    menu->addAction(action3);
    // 创建中央控件
    edit = new QTextEdit(this);
    this->setCentralWidget(edit);
    edit->setPlaceholderText("此处编写⽂本内容...");

    // 连接信号槽, 点击 action 时触发⼀定的效果.
    connect(action1, &QAction::triggered, this, &MainWindow::save);
    connect(action2, &QAction::triggered, this, &MainWindow::load);
    connect(action3, &QAction::triggered, this, &MainWindow::close);

}

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

void MainWindow::save()
{
    // 弹出对话框, 选择写⼊⽂件的路径
    QFileDialog* dialog = new QFileDialog(this);
    QString fileName = dialog->getSaveFileName(this, "保存⽂件");
    qDebug() << "fileName: " << fileName;
    // 写⼊⽂件
    std::ofstream file(fileName.toStdString().c_str());
    if (!file.is_open()) {
        qDebug() << "⽂件保存失败!";
        return;
    }
    const QString& text = edit->toPlainText();
    file << text.toStdString();
    file.close();
}

void MainWindow::load()
{
    // 弹出对话框, 选择打开的⽂件
    QFileDialog* dialog = new QFileDialog(this);
    QString fileName = dialog->getOpenFileName(this, "加载⽂件");
    qDebug() << "fileName: " << fileName;
    // 读取⽂件
    std::ifstream file(fileName.toStdString().c_str());
    if (!file.is_open()) {
        qDebug() << "⽂件加载失败!";
        return;
    }
    std::string content;
    std::string line;
    while (std::getline(file, line)) {
        content += line;
        content += "\n";
    }
    file.close();
    // 显⽰到界⾯上
    QString text = QString::fromStdString(content);
    edit->setPlainText(text);
}

执行程序, 可以看到此时就可以通过程序来保存/加载文件了. 并且对文件进行编辑

在这里插入图片描述

在这里插入图片描述

工具栏(ToolBar)

工具栏是应用程序中集成各种功能实现快捷键使用的一个区域。可以有多个,也可以没有,它并不是应用程序中必须存在的组件。它是一个可移动的组件,它的元素可以是各种窗口组件,它的元素通常以图标按钮的方式存在。如下图为工具栏的示意图:

在这里插入图片描述

创建工具栏

调用 QMainWindow 类的 addToolBar() 函数来创建工具栏,每增加一个工具栏都需要调用一次该函数。

如添加两个工具栏:

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

    QToolBar *toolBar1 = new QToolBar(this);
    QToolBar *toolBar2 = new QToolBar(this);
    this->addToolBar(toolBar1);
    this->addToolBar(toolBar2);
}

设置停靠位置

工具栏停靠位置的设置有两种方式。一种是在创建工具栏的同时指定停靠的位置,另一种是通过 QToolBar 类提供的 **setAllowedAreas() **函数来设置。

方式一:创建工具栏的同时指定其停靠的位置。

在创建工具栏的同时,也可以设置工具栏的位置,其默认位置是在窗口的最上面;如上述代码,默认在最上面显示。工具栏允许停靠的区域由 QToolBar 类提供的 allowAreas() 函数决定,其中可以设置的位置包括:

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

示例

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

    QToolBar *toolBar1 = new QToolBar(this);
    QToolBar *toolBar2 = new QToolBar(this);

    //创建工具栏的同时,指定工具栏在左侧显示
    this->addToolBar(Qt::LeftToolBarArea, toolBar1);
    //右侧显示
    this->addToolBar(Qt::RightToolBarArea, toolBar2);
}

方式二:使用 QToolBar 类提供的 setAllowedAreas()函数设置停靠位置。

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

    QToolBar *toolBar1 = new QToolBar(this);
    QToolBar *toolBar2 = new QToolBar(this);

    this->addToolBar(toolBar1);
    this->addToolBar(toolBar2);

    //只允许在左侧停靠
    toolBar1->setAllowedAreas(Qt::LeftToolBarArea);

    //只允许在右侧停靠
    toolBar2->setAllowedAreas(Qt::RightToolBarArea);
}

说明: 在创建工具栏的同时指定其停靠的位置,指的是程序运行时工具栏默认所在的位置;而使用 setAllowedAreas()函数设置停靠位置,指的是工具栏允许其所能停靠的位置。

设置浮动属性

工具栏的浮动属性可以通过 QToolBar 类提供的 setFloatable() 函数来设置。setFloatable() 函数原型为:

void setFloatable (bool floatable)

参数

  • true:浮动
  • false:不浮动

示例

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

    QToolBar *toolBar1 = new QToolBar(this);
    QToolBar *toolBar2 = new QToolBar(this);

    this->addToolBar(Qt::LeftToolBarArea,toolBar1);
    this->addToolBar(Qt::RightToolBarArea,toolBar2);

    toolBar1->setFloatable(true);  //允许工具栏浮动
    toolBar2->setFloatable(false);  //禁止工具栏浮动
}

设置移动属性

设置工具栏的移动属性可以通过 QToolBar 类提供的 setMovable() 函数来设置。**setMovable() **函数原型为:

void setMovable(bool movable)

参数:

  • true:移动
  • false:不移动

说明:若设置工具栏为不移动状态,则设置其停靠位置的操作就不会生效,所以设置工具栏的移动属性类似于总开关的效果。

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

    QToolBar *toolBar1 = new QToolBar(this);
    QToolBar *toolBar2 = new QToolBar(this);

    this->addToolBar(Qt::LeftToolBarArea,toolBar1);
    this->addToolBar(Qt::RightToolBarArea,toolBar2);

    toolBar1->setMovable(true);  //允许移动
    toolBar2->setMovable(false);  //不允许移动
}

综合示例

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

    resize(800,600); //设置窗口大小

    QToolBar *toolBar = new QToolBar(this);
    //设置工具栏的位置:默认在窗口的上面,此处设置为在左侧
    addToolBar(Qt::LeftToolBarArea,toolBar);

    //设置工具栏的停靠位置,设置工具栏只允许在左右停靠
    toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);

    //设置工具栏的浮动属性
    toolBar->setFloatable(false);

    //设置工具栏的移动(总开关)
    toolBar->setMovable(false);

    //设置工具栏的内容
    QAction *openAction = new QAction("open" ,this);
    QAction *newAction = new QAction("new", this);

    toolBar->addAction(openAction);
    toolBar->addSeparator();
    toolBar->addAction(newAction);

    //工具栏也可以添加控件
    QPushButton *btn = new QPushButton("保存",this);
    toolBar->addWidget(btn);
}

状态栏(StatusBar)

状态栏是应用程序中输出简要信息的区域。一般位于主窗口的最底部,一个窗口中最多只能有一个状态栏。在 Qt 中,状态栏是通过 QStatusBar 类来实现的。 在状态栏中可以显示的消息类型有:

  • 实时消息:如当前程序状态
  • 永久消息:如程序版本号,机构名称
  • 进度消息:如进度条提示,百分百提示

状态栏的创建

状态栏的创建是通过 QStatusBar 类提供的 statusBar() 函数来创建;示例如下:

//创建状态栏
QStatusBar *stbr = this->statusBar();
//将状态栏置于窗口中
this->setStatusBar(stbr);

在状态栏中显示实时消息

在状态栏中显示实时消息是通过 showMessage() 函数来实现,示例如下:

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

    //创建状态栏
    QStatusBar *stbr = this->statusBar();
    //将状态栏置于窗口中
    setStatusBar(stbr);

    //状态栏中显示大约2秒的 "hello world"
    stbr->showMessage("Hello World", 2000);
}

在状态栏中显示永久消息

在状态栏中可以显示永久消息,此处的永久消息是通过标签来显示的;示例如下:

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

    //创建状态栏
    QStatusBar *stbr = this->statusBar();
    //将状态栏置于窗口中
    setStatusBar(stbr);

    //创建标签
    QLabel *label = new QLabel("提示信息",this);
    //将标签放入状态栏中
    stbr->addWidget(label);
}

显示效果如下:

在这里插入图片描述

调整显示消息的位置

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

    //创建状态栏
    QStatusBar *stbr = this->statusBar();
    //将状态栏置于窗口中
    setStatusBar(stbr);

    //创建标签
    QLabel *label = new QLabel("提示信息",this);
    //将标签放入状态栏中
    stbr->addWidget(label);

    //将创建的标签放入到状态栏的右侧
    QLabel *label2 = new QLabel("右侧提示信息",this);
    stbr->addPermanentWidget(label2);
}

显示效果如下:

在这里插入图片描述

浮动窗口(DockWidget)

在 Qt 中,浮动窗口也称之为铆接部件。浮动窗⼝是通过 QDockWidget 类来实现浮动的功能。浮动窗口一般是位于核心部件的周围,可以有多个

浮动窗口的创建

浮动窗口的创建是通过 **QDockWidget **类提供的构造方法 QDockWidget() 函数动态创建的;示例如下:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //浮动窗口
    QDockWidget *dockwidget = new QDockWidget("浮动窗口",this);
    //将浮动窗口置于当前窗口中
    this->addDockWidget(Qt::BottomDockWidgetArea,dockwidget);
}

设置停靠的位置

浮动窗口是位于中心部件的周围。可以通过 QDockWidget 类中提供 setAllowedAreas() 函数设置其允许停靠的位置。其中可以设置允许停靠的位置有:

  • Qt::LeftDockWidgetArea 停靠在左侧
  • Qt::RightDockWidgetArea 停靠在右侧
  • Qt::TopDockWidgetArea 停靠在顶部
  • Qt::BottomDockWidgetArea 停靠在底部
  • Qt::AllDockWidgetAreas 以上四个位置都可停靠

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //浮动窗口
    QDockWidget *dockwidget = new QDockWidget("浮动窗口",this);
    //将浮动窗口置于当前窗口中
    this->addDockWidget(Qt::BottomDockWidgetArea,dockwidget);
    //设置浮动窗口的停靠区域,只允许上下停靠
    dockwidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
}

效果如下

数设置其允许停靠的位置。其中可以设置允许停靠的位置有:

  • Qt::LeftDockWidgetArea 停靠在左侧
  • Qt::RightDockWidgetArea 停靠在右侧
  • Qt::TopDockWidgetArea 停靠在顶部
  • Qt::BottomDockWidgetArea 停靠在底部
  • Qt::AllDockWidgetAreas 以上四个位置都可停靠

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //浮动窗口
    QDockWidget *dockwidget = new QDockWidget("浮动窗口",this);
    //将浮动窗口置于当前窗口中
    this->addDockWidget(Qt::BottomDockWidgetArea,dockwidget);
    //设置浮动窗口的停靠区域,只允许上下停靠
    dockwidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
}

效果如下

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

yolov6实现遥感影像目标识别|以DIOR数据集为例

1 目标检测是计算机视觉领域中的一项重要任务&#xff0c;它的目标是在图像或视频中检测出物体的位置和类别。YOLO&#xff08;You Only Look Once&#xff09;是一系列经典的目标检测算法&#xff0c;最初由Joseph Redmon等人于2016年提出。YOLO算法具有快速、简单、端到端的特…

【机器学习之---统计】统计学基础概念

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 统计学基础 1. 频率派 频率学派&#xff08;传统学派&#xff09;认为样本信息来自总体&#xff0c;通过对样本信息的研究可以合理地推断和估计总体信息…

深入理解MySQL中的JOIN算法

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、引言二、嵌套循环连接&#xff08;Nested-Loop Join&#xff09;2.1 工作原理2.2 性能考虑2.3 优化策略 三、块嵌套循环…

如何在iOS系统抓取log

前言&#xff1a;因为作者目前工作领域和苹果智能家居有关&#xff0c;然后发现一些bug其实是apple sdk原生code的问题&#xff0c;所以需要给apple提radar单&#xff0c;就需要抓ios端Log充当证据给apple看&#xff0c;其实ios抓log非常简单&#xff0c;大家感兴趣可以学习下哦…

谈谈synchronized关键字

synchronized是什么&#xff1f; synchronized为同步之意&#xff0c;可保证在同一时刻&#xff0c;被它修饰的方法或代码块只能有一个线程执行&#xff0c;它的使用解决了并发多线程中的三大问题&#xff1a;原子性、可见性、顺序性。 有的书籍中可能会看到说synchronized是…

用vscode调试cpp程序相关操作记录

需要在服务器上用vscode调试cpp程序&#xff0c;写此记录launch.json配置和相关步骤错误导致的问题 1.在需要运行程序的服务器上安装C/C Extension Pack&#xff08;之前只在本地装了&#xff09;&#xff0c;可以支持调试C/C应用程序(设置断点&#xff0c;单步执行&#xff0c…

【计算机视觉】Gaussian Splatting源码解读补充(二)

第一部分 本文是对学习笔记之——3D Gaussian Splatting源码解读的补充&#xff0c;并订正了一些错误。 目录 三、相机相关scene/cameras.py&#xff1a;class Camera 四、前向传播&#xff08;渲染&#xff09;&#xff1a;submodules/diff-gaussian-rasterization/cuda_rast…

【java数据结构】基于java提供的ArrayList实现的扑克牌游戏-(附源码~)

【Java数据结构】基于java泛型实现的二维数组完成三人扑克游戏 基本框架的实现创建一副牌如何进行洗牌&#xff1a;每个人抓的牌放到哪里&#xff1a; 源码具体实现cardcardsTest 个人简介&#xff1a;努力学编程 每日鸡汤&#xff1a;stay foolish,stay hungry-史蒂芬.乔布斯斯…

springboot+vue 的图书个性化推荐系统的设计与实现

图书个性化推荐系统的主要使用者分为管理员和学生&#xff0c;实现功能包括管理员&#xff1a;首页、个人中心、学生管理、图书分类管理、图书信息管理、图书预约管理、退换图书管理、管理员管理、留言板管理、系统管理&#xff0c;学生&#xff1a;首页、个人中心、图书预约管…

适用于 Windows PC 的 6 款最佳照片恢复软件

您想向您的朋友展示您上个月访问迈阿密海滩的照片。可惜&#xff01;您的 Windows 计算机中不再有照片文件夹。不仅是这个文件夹&#xff0c;您还发现您的许多重要和有趣时刻的照片都丢失了&#xff01;这意味着您丢失了许多家庭成员、可爱宝宝的珍贵照片或毕业典礼等难忘活动的…

利用Base64加密算法将数据加密解密

1. Base64加密算法 Base64准确来说并不像是一种加密算法&#xff0c;而更像是一种编码标准。 我们知道现在最为流行的编码标准就是ASCLL&#xff0c;它用八个二进制位&#xff08;一个char的大小&#xff09;表示了127个字符&#xff0c;任何二进制序列都可以用这127个字符表…

chap验证实验

一、添加接口 在每个路由器里添加2SA接口 二、配IP 进入serial接口配置IP R1&#xff1a; R2&#xff1a; ppp mp Mp-group 0/0/0 R3: 查看&#xff1a; 三、aaa认证&#xff0c;chap验证 创建一个新用户&#xff1a; R2进入3/0/0接口&#xff1a; R1进入3/0/0接口&a…

制作一个RISC-V的操作系统六-bootstrap program(risv 引导程序)

文章目录 硬件基本概念qemu-virt地址映射系统引导CSR![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/86461c434e7f4b1b982afba7fad0256c.png)machine模式下的csr对应的csr指令csrrwcsrrs mhartid引导程序做的事情判断当前hart是不是第一个hart初始化栈跳转到c语言的…

【Android开发】【创建Activity,Activity之间的切换/消息传递】【java】

一、第一个Activity 1.1 创建一个空Activity 1.2 创建一个布局 知识点 在XML中引用一个id&#xff1a;id/id_name 在XML中定义一个id&#xff1a;id/id_name 右键错误&#xff0c;点击Show Quick-Fixes&#xff0c;再点击弹出的Suppress:Add........&#xff0c;错误会被自动修…

详细分析PyAutoGUI中的locate函数(附Demo)

目录 前言1. 基本知识2. 源代码分析3. Demo 前言 起因是实战中locate对个别定位会有偏差&#xff0c;导致一直识别错误 相应的基本知识推荐阅读&#xff1a;详细分析Python中的Pyautogui库&#xff08;附Demo&#xff09; 1. 基本知识 pyautogui.locate()函数用于在屏幕上定…

DBO优化朴素贝叶斯分类预测(matlab代码)

DBO-朴素贝叶斯分类预测matlab代码 蜣螂优化算法(Dung Beetle Optimizer, DBO)是一种新型的群智能优化算法&#xff0c;在2022年底提出&#xff0c;主要是受蜣螂的的滚球、跳舞、觅食、偷窃和繁殖行为的启发。 数据为Excel分类数据集数据。 数据集划分为训练集、验证集、测试…

YOLO-v8-seg实例分割使用

最近需要实例分割完成一些任务&#xff0c;一直用的SAM(segment anything&#xff09;速度慢&#xff0c;找一个轻量分割模型。 1. YOLO-v8-seg使用 git clone https://github.com/ultralytics/ultralytics.git cd ultralytics vim run.py from ultralytics import YOLO# L…

鸿蒙一次开发,多端部署(十三)功能开发的一多能力介绍

应用开发至少包含两部分工作&#xff1a; UI页面开发和底层功能开发&#xff08;部分需要联网的应用还会涉及服务端开发&#xff09;。前面章节介绍了如何解决页面适配的问题&#xff0c;本章节主要介绍应用如何解决设备系统能力差异的兼容问题。 系统能力 系统能力&#xff…

RK3568驱动指南|第十三篇 输入子系统-第143章 多对多的匹配关系分析

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

有哪些强大好用的AI表格数据处理工具或者 AI Excel工具?

在繁忙的工作和生活中&#xff0c;处理大量的表格数据往往令人感到头疼。面对一列列数字、一行行文字&#xff0c;我们需要花费大量的时间和精力去整理、核对。然而&#xff0c;随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术正逐渐改变这一现状。 如…