Qt 窗口:菜单、工具与状态栏的应用
目录
引言:
1. 菜单栏
1.1 创建菜单栏
1.2 在菜单栏中添加菜单
1.3 创建菜单项
1.4 在菜单项之间添加分割线
1.5 综合示例
2.工具栏
2.1 创建工具栏
2.2 设置停靠位置
2.3 设置浮动属性
2.4 设置移动属性
3. 状态栏
3.1 状态栏的创建
3.2 在状态栏中显示实时消息
3.3 在状态栏中显示永久消息
4. 浮动窗口
4.1 浮动窗口的创建
4.2 设置停靠的位置
引言:
Qt 窗口 是通过 QMainWindow类 来实现的。
QMainWindow 是⼀个为用户提供主窗口程序的类,继承自 QWidget 类,并且提供了一个预定义的布局。QMainWindow 包含 一个菜单栏(menu bar)、多个工具栏(tool bars)【工具栏本质上就是把菜单栏中的一些比较常用的选项,直接放到工具栏里了,直接点击工具栏中的按钮就能快速生效】、多个浮动窗口(铆接部件)(dock widgets)、一个状态栏(status bar) 和一个 中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为 QMainwindow 中 各组件所处的位置:
1. 菜单栏
Qt 中的菜单栏是通过 QMenuBar 这个类来实现的。一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。
菜单栏中包含菜单. 菜单中包含菜单项.
1.1 创建菜单栏
方式一 :菜单栏的创建可以借助于 QMainWindow类 提供的 menuBar() 函数来实现。
- menubar()函数原型如下:
QMenuBar * menuBar() const
// 创建菜单栏
QMenuBar* menubar = menuBar();// 将菜单栏放入窗口中
this->setMenuBar(menubar);
方式二:在堆上动态创建;
- 使用 setMenuBar 把菜单栏放到窗口中.
// 创建菜单栏
QMenuBar* menubar = new QMenuBar(this);// 将菜单栏放入窗口中
this->setMenuBar(menubar);
1.2 在菜单栏中添加菜单
创建菜单,并通过 QMenu 提供的 addMenu() 函数 来添加菜单。
示例:
// 创建菜单栏
QMenuBar* menubar = new QMenuBar();// 将菜单栏放入窗口中
this->setMenuBar(menubar);// 创建菜单
QMenu* menu1 = new QMenu("文件");
QMenu* menu2 = new QMenu("编辑");
QMenu* menu3 = new QMenu("视图");// 添加菜单到菜单栏中
menubar->addMenu(menu1);
menubar->addMenu(menu2);
menubar->addMenu(menu3);
1.3 创建菜单项
在 Qt 中,并没有专门的菜单项类,可以通过 QAction 类,抽象出公共的动作。如在菜单中添加菜单项.
🌴QAction 可以给菜单栏使用, 也可以给工具栏使用.
示例:
// 创建菜单项
QAction* action1 = new QAction("新建");
QAction* action2 = new QAction("打开");
QAction* action3 = new QAction("保存");
QAction* action4 = new QAction("另存为");
QAction* action5 = new QAction("退出");// 将菜单添加到菜单上
menu1->addAction(action1);
menu1->addAction(action2);
menu1->addAction(action3);
menu1->addAction(action4);
menu1->addAction(action5);
1.4 在菜单项之间添加分割线
在菜单项之间可以添加分割线。分割线如下图所示,添加分割线是通过 QMenu 类 提供的 addSeparator() 函数来实现;
示例:
// 创建菜单项
QAction* action1 = new QAction("新建");
QAction* action2 = new QAction("打开");
QAction* action3 = new QAction("保存");
QAction* action4 = new QAction("另存为");
QAction* action5 = new QAction("退出");// 将菜单添加到菜单上
menu1->addAction(action1);
menu1->addSeparator();// 在 “新建” 和 “打开” 中间添加分割线
menu1->addAction(action2);
menu1->addAction(action3);
menu1->addAction(action4);
menu1->addAction(action5);
1.5 综合示例
在窗口上创建一个菜单栏,在菜单栏中添加一些菜单,在某一个菜单中添加一些菜单项。
1、新建 Qt 项目
- 注意:此时新建项目时选择的基类 QMainwindow ,如下图示:
2、在 "mainwindow.cpp" 文件中创建菜单和中央控件
- 创建一个菜单栏, 一个菜单.
- 两个菜单项: 保存, 加载
- 创建一个 QTextEdit 作为窗口的中央控件.
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 设置标题this->setWindowTitle("我的记事本");// 创建菜单栏QMenuBar* menubar = this->menuBar();this->setMenuBar(menubar);// 创建菜单QMenu* menu = new QMenu("文件");menubar->addMenu(menu);// 创建菜单项QAction* action1 = new QAction("保存");QAction* action2 = new QAction("加载");menu->addAction(action1);menu->addAction(action2);// 创建中央控件QTextEdit* edit = new QTextEdit(this);this->setCentralWidget(edit);edit->setPlaceholderText("此处编写文本内容...");
}
3、给 action 添加一些动作
// 连接信号槽,点击 action 时触发一定的效果connect(action1, &QAction::triggered, this, &MainWindow::save);connect(action2, &QAction::triggered, this, &MainWindow::load);
实现这两个槽函数
a. 使用 QFileDialog 来实现选择文件的效果.
- getSaveFileName 用于保存文件的场景. 此时的对话框可以输入文件名.
- getOpenFileName 用于打开文件的场景. 此时的对话框可以获取到鼠标选择的文件名.
b. 搭配 C++ 标准库的文件操作实现文件读写.
void MainWindow::save()
{// 弹出对话框, 选择写⼊⽂件的路径QFileDialog* dialog = new QFileDialog(this);QString fileName = dialog->getSaveFileName(this, "保存⽂件", "D:/");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, "加载⽂件", "D:/");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);
}
4、执行程序, 此时就可以通过程序来保存/加载文件了. 并且对文件进行编辑.
2.工具栏
工具栏是应用程序中集成各种功能实现快捷键使用的一个区域。可以有多个,也可以没有,它并不是应用程序中必须存在的组件。它是一个可移动的组件,它的元素可以是各种窗口组件,它的元素通常以图标按钮的方式存在。如下图为工具栏的示意图:
2.1 创建工具栏
调用 QMainWindow类 的 addToolBar() 函数来创建工具栏,每增加一个工具栏都需要调用一次该函数。
代码示例:
1.编写 mainwindow.cpp,在构造函数中编写初始化代码
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 工具栏需要手动创建出来,自身不会创建QToolBar* toolbar = new QToolBar();this->addToolBar(toolbar);QAction* action1 = new QAction("保存");QAction* action2 = new QAction("退出");toolbar->addAction(action1);toolbar->addAction(action2);connect(action1, &QAction::triggered, this, &MainWindow::save);connect(action2, &QAction::triggered, this, &MainWindow::exit);
}
注意:
- 添加菜单栏,使用的是 setMenuBar,这是因为菜单栏只能有一个,重复设置,就会新的替换旧的(set 就包含了 “替换”)。
- 添加工具栏,使用的是 addToolBar,这是因为工具栏可以有多个,重复设置,就会出现多个工具栏,不包含 “替换”。
2.给工具栏的快捷项设置 slot 函数
void MainWindow::save()
{qDebug() << "save";
}void MainWindow::exit()
{qDebug() << "exit";
}
3.执行程序,观察效果
4.工具栏展示的一般是图标,而不是文本,所以我们给它设置成图标(使用 qrc 机制)
QAction* action1 = new QAction("保存");
QAction* action2 = new QAction("退出");
action1->setIcon(QIcon(":/save.png"));
action2->setIcon(QIcon(":/exit.png"));
toolbar->addAction(action1);
toolbar->addAction(action2);
注意:
QAction 如果出现在工具栏上,也会产生 图标 覆盖文本 这样的情况,但是,当我们将文本替换成图标后,之前设置的文本会以 toolTip 的方式来存在,当鼠标悬停上去的时候,就会显示出一段提示信息,另外,我们也可以手动设置这里的 toolTip~
action1->setToolTip("点击这里保存文件");
5.工具栏往往也是和菜单栏搭配使用的,即工具栏中的 QAction 也可以出现在菜单中
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建菜单栏QMenuBar* menubar = this->menuBar();this->setMenuBar(menubar);// 创建菜单QMenu* menu = new QMenu("文件");menubar->addMenu((menu));// 工具栏需要手动创建出来,自身不会创建QToolBar* toolbar = new QToolBar();this->addToolBar(toolbar);// 创建两个菜单项QAction* action1 = new QAction("保存");QAction* action2 = new QAction("退出");
// action1->setToolTip("点击这里保存文件");action1->setIcon(QIcon(":/save.png"));action2->setIcon(QIcon(":/exit.png"));// 菜单项放到工具栏中toolbar->addAction(action1);toolbar->addAction(action2);// 菜单项放在菜单中menu->addAction(action1);menu->addAction(action2);
}
2.2 设置停靠位置
工具栏停靠位置的设置有两种方式。一种是在创建工具栏的同时指定停靠的位置,另一种是通过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();QToolBar* toolBar2 = new QToolBar();// 创建工具栏的同时,指定工具栏在左侧显示this->addToolBar(Qt::LeftToolBarArea, toolBar1);// 创建工具栏的同时,指定工具栏在右侧显示this->addToolBar(Qt::RightToolBarArea, toolBar2);QAction* action1 = new QAction("新建");QAction* action2 = new QAction("打开");QAction* action3 = new QAction("关闭");QAction* action4 = new QAction("保存");toolBar1->addAction(action1);toolBar1->addAction(action2);toolBar2->addAction(action3);toolBar2->addAction(action4);
}
🍒方式二:使用 QToolBar类 提供的 setAllowedAreas()函数 设置停靠位置。
代码示例:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建工具栏QToolBar* toolBar1 = new QToolBar();QToolBar* toolBar2 = new QToolBar();this->addToolBar(toolBar1);this->addToolBar(toolBar2);// 只允许在顶部停靠toolBar1->setAllowedAreas(Qt::TopToolBarArea);// 只允许在底部停靠toolBar2->setAllowedAreas(Qt::BottomToolBarArea);QAction* action1 = new QAction("新建");QAction* action2 = new QAction("打开");QAction* action3 = new QAction("关闭");QAction* action4 = new QAction("保存");toolBar1->addAction(action1);toolBar1->addAction(action2);toolBar2->addAction(action3);toolBar2->addAction(action4);
}
说明:
在创建工具栏的同时指定其停靠的位置,指的是程序运行时工具栏默认所在的位置;而使用setAllowedAreas()函数设置停靠位置,指的是工具栏允许其所能停靠的位置。
2.3 设置浮动属性
工具栏的浮动属性可以通过 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();QToolBar* toolBar2 = new QToolBar();this->addToolBar(toolBar1);this->addToolBar(toolBar2);// 只允许在顶部停靠toolBar1->setAllowedAreas(Qt::TopToolBarArea);// 只允许在底部停靠toolBar2->setAllowedAreas(Qt::BottomToolBarArea);toolBar1->setFloatable(true);// 允许工具栏浮动toolBar2->setFloatable(false);// 不允许工具栏浮动QAction* action1 = new QAction("新建");QAction* action2 = new QAction("打开");QAction* action3 = new QAction("关闭");QAction* action4 = new QAction("保存");toolBar1->addAction(action1);toolBar1->addAction(action2);toolBar2->addAction(action3);toolBar2->addAction(action4);
}
2.4 设置移动属性
设置工具栏的移动属性可以通过 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();QToolBar* toolBar2 = new QToolBar();this->addToolBar(toolBar1);this->addToolBar(toolBar2);// 只允许在顶部停靠toolBar1->setAllowedAreas(Qt::TopToolBarArea);// 只允许在底部停靠toolBar2->setAllowedAreas(Qt::BottomToolBarArea);toolBar1->setFloatable(true);// 允许工具栏浮动toolBar2->setFloatable(false);// 不允许工具栏浮动toolBar1->setMovable(true);// 允许移动toolBar2->setMovable(false);// 不允许移动QAction* action1 = new QAction("新建");QAction* action2 = new QAction("打开");QAction* action3 = new QAction("关闭");QAction* action4 = new QAction("保存");toolBar1->addAction(action1);toolBar1->addAction(action2);toolBar2->addAction(action3);toolBar2->addAction(action4);
}
3. 状态栏
状态栏是应用程序中输出简要信息的区域。一般位于主窗口的最底部,一个窗口中最多只能有一个状态栏。在 Qt 中,状态栏是通过 QStatusBar类 来实现的。 在状态栏中可以显示的消息类型有:
- 实时消息:如当前程序状态
- 永久消息:如程序版本号,机构名称
- 进度消息:如进度条提示,百分百提示
3.1 状态栏的创建
状态栏的创建是通过 QMainWindow 类 提供的 statusBar() 函数来创建;
代码示例:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 存在就获取,不存在就创建QStatusBar* statusBar = this->statusBar();// 如果状态栏没有被创建,这样的设置是必要的// 如果状态栏已经在窗口中存在,这样的设置其实意义不大,但也没副作用,仍然保留this->setStatusBar(statusBar);
}
3.2 在状态栏中显示实时消息
在状态栏中显示实时消息是通过 showMessage() 函数来实现。
通过 showMessage 可以在状态栏中显示一个文本,此时这个文本存在的时间可以自定义。timeOut 参数是一个单位为 ms 的时间,如果 timeOut 为 0(不填),消息就会持久存在。
代码示例:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 存在就获取,不存在就创建QStatusBar* statusBar = this->statusBar();// 如果状态栏没有被创建,这样的设置是必要的// 如果状态栏已经在窗口中存在,这样的设置其实意义不大,但也没副作用,仍然保留this->setStatusBar(statusBar);// 状态栏中显示大约 3秒 的“Hello Qt”statusBar->showMessage("Hello Qt", 3000);
}
3.3 在状态栏中显示永久消息
在状态栏中可以显示永久消息,此处的永久消息是通过 标签 来显示的,也可以添加其它控件。
代码示例:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 存在就获取,不存在就创建QStatusBar* statusBar = this->statusBar();// 如果状态栏没有被创建,这样的设置是必要的// 如果状态栏已经在窗口中存在,这样的设置其实意义不大,但也没副作用,仍然保留this->setStatusBar(statusBar);// 创建标签QLabel* label = new QLabel("提示信息");// 将标签放入状态栏中statusBar->addWidget(label);// 创建进度条并将进度条放入状态栏中QProgressBar* progressBar = new QProgressBar();progressBar->setRange(0, 100);progressBar->setValue(50);statusBar->addWidget(progressBar);
}
显示效果如下:
调整显示消息的位置:
QPushButton* button = new QPushButton("按钮");
statusBar->addPermanentWidget(button);
显示效果如下:
4. 浮动窗口
在 Qt 中,浮动窗口也称之为铆接部件。浮动窗口是通过 QDockWidget类 来实现浮动的功能。浮动窗口一般是位于核心部件的周围,可以有多个。
4.1 浮动窗口的创建
浮动窗口的创建是通过 QDockWidget类 提供的构造方法 QDockWidget()函数 动态创建的;
代码示例:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 浮动窗口QDockWidget* dockWidget = new QDockWidget();// 将浮动窗口置于当前窗口中this->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);// 给浮动窗口设置标题dockWidget->setWindowTitle("浮动窗口");// 给浮动窗口内部添加一些其它的控件// 不能直接给这个浮动窗口添加子控件,而是需要创建出一个单独的 QWidget,把要添加的控件加入到 QWidget 中// 然后再把这个 QWidget 设置到 dockWidget 中QWidget* container = new QWidget();dockWidget->setWidget(container);// 创建布局管理器,把布局管理器设置到 QWidget 中QVBoxLayout* vlayout = new QVBoxLayout();container->setLayout(vlayout);// 创建其它控件添加到 layout 中QLabel* label = new QLabel("标签");QPushButton* button = new QPushButton("按钮");vlayout->addWidget(label);vlayout->addWidget(button);
}
4.2 设置停靠的位置
浮动窗口是位于中心部件的周围。可以通过 QDockWidget类 中提供 setAllowedAreas() 函数设置其允许停靠的位置。其中可以设置允许停靠的位置有:
- Qt::LeftDockWidgetArea 停靠在左侧
- Qt::RightDockWidgetArea 停靠在右侧
- Qt::TopDockWidgetArea 停靠在顶部
- Qt::BottomDockWidgetArea 停靠在底部
- Qt::AllDockWidgetAreas 以上四个位置都可停靠
示例如下:设置浮动窗口只允许上下停靠
// 设置浮动窗口的区域,只允许上下停靠
dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
相关文章:

Qt 窗口:菜单、工具与状态栏的应用
目录 引言: 1. 菜单栏 1.1 创建菜单栏 1.2 在菜单栏中添加菜单 1.3 创建菜单项 1.4 在菜单项之间添加分割线 1.5 综合示例 2.工具栏 2.1 创建工具栏 2.2 设置停靠位置 2.3 设置浮动属性 2.4 设置移动属性 3. 状态栏 3.1 状态栏的创建 3.2 在状态栏中显…...

学习必备好物有哪些?高三开学季好物推荐合集
新学期即将开启,学习必备好物有哪些?以下是特别为高三学生朋友们精心挑选的一系列好物推荐,旨在帮助大家在更快更好的选择,快来看看都有哪些吧! 1、书客护眼大路灯Sun 书客是海内外知名的生物光学技术方案商…...

java的分类
目录 Java SE Java EE Java ME java主要分为三类,分别是Java SE,Java EE,Java ME。其中SE是EE和ME的基础。 Java SE 全名为Java Standard Edition,是 Java 平台的基础版本,为开发人员提供了构建和运行桌面应用程…...

基于火山引擎云搜索服务和豆包模型搭建 RAG 推理任务
大语言模型(LLM,Large language model)作为新一轮科技产业革命的战略性技术,其核心能力在于深层语境解析与知识融合。在生成式人工智能方向主要用于图像生成,书写文稿,信息搜索等。当下的 LLM 模型是基于大…...

Python 实现 Excel 文件操作的技术性详解
目录 一、引言 二、Excel 文件格式及库的选择 2.1 Excel 文件格式 2.2 库的选择 三、安装必要的库 四、使用 openpyxl 读取 Excel 文件 4.1 基本步骤 4.2 实战案例 五、使用 pandas 读取 Excel 文件 5.1 基本步骤 5.2 实战案例 六、写入 Excel 文件 6.1 使用 …...

Spring WebFlux 实现 SSE 流式回复:类GPT逐字显示回复效果完整指南
本节将提供基于 Spring WebFlux 和 SSE 实现类ChatGPT流式回复效果的完整代码示例,并详细说明所需的依赖和配置。 1. 项目配置 构建工具: Maven 或 Gradle依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>sp…...

成功解决7版本的数据库导入 8版本数据库脚本报错问题
我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 🎓擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号:热爱技术的小郑。回复 Java全套视频教程 或 前端全套视频…...

如何让RStudio使用不同版本的R
下面内容摘录自: 专栏问答:管理和选择不同的R,如何做好R的笔记_rstudio如何在不同的r版本中进行切换-CSDN博客 欢迎订阅我们专栏 问题一:如何发现RStudio需要安装和使用不同版本的R。这是为什么呢? R允许用户在同一系统…...

汽车免拆诊断案例 | 2011 款进口现代新胜达车智能钥匙系统有时失效
故障现象 一辆2011款进口现代新胜达车,搭载G4KE发动机,累计行驶里程约为26.3万km。车主进厂反映,有时进入车内按下起动按钮,发动机无法起动,且组合仪表黑屏。 故障诊断 接车后试车,车辆使用一切正常。…...

Count clock
写了半天不对,才注意到是十六进制的 - - 另外安装了vivado 哈哈哈哈,可以看看写的到底对不对 之前好多程序在 hdlbits 可以正确运行 但是 vivado 编译不通过。 module clock(input clk,input reset,input ena,output reg pm,output reg[7:0] hh,output …...

【MySQL】1.MySQL基本操作
目录 一、MySQL数据库登陆 1、设置环境变量 2、cmd命令登陆数据库 二、基本操作语法 1、显示数据库——SHOW 2、使用/选择数据库——USE 3、删除——DROP 4、创建——CREATE 5、查看表结构——DESC 6、数据操作——增删改查 (1)增/插入&#…...

Qt .qm文件详解
Qt中的.qm文件是Qt翻译文件的一种,主要用于支持软件的多语言转换。在生成Qt应用程序时,qm文件会被包含进应用程序中,根据逻辑以显示对应语言的界面。 .qm文件的基本信息 格式:.qm文件是Qt应用程序中用于存储翻译文本的二进制文件…...

【计算机网络】UDP实战
其实经过这几天写的几种不同的UDP的简易客户端与服务端,还是很有套路的,起手式都是非常像的。 更多的难点对我来说反而是解耦,各种各样的function一用,回调函数一调,呕吼,就会懵一下。 对于这篇文章&#x…...

七、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制和JS颜色选择器改变灯珠颜色
本地代码集成离线iro.js库来添加一个颜色选择器控件,在无网络环境可以通过JavaScript将选中的颜色发送到服务器以改变LED颜色。以下是将iro.js集成到网页后的颜色图片。 Iro.js 地址API操作手册 color:change # 每当所选颜色发生变化时触发 - 无论是当用户与颜色选…...

Z 字形遍历二叉树
假设一个二叉树上各结点的权值互不相同。 我们就可以通过其后序遍历和中序遍历来确定唯一二叉树。 请你输出该二叉树的 ZZ 字形遍历序列----也就是说,从根结点开始,逐层遍历,第一层从右到左遍历,第二层从左到右遍历,…...

[Vue]Vue3从入门到精通-综合案例分析
一.Vue是什么: 概念:Vue是一个用于构建用户界面的渐进式的框架 以下的内容是自里向外的 声明式渲染(Vuejs核心包)组件系统(Vuejs核心包)客户端路由VueRouter大规模状态管理Vuex构建工具Webpack/Vite Vue的两种使用方式: Vue核心包开发-&…...

深度学习——神经网络(neural network)详解(二). 带手算步骤,步骤清晰0基础可看
深度学习——神经网络(neural network)详解(二). 手算步骤,步骤清晰0基础可看 前文如下:深度学习——神经网络(neural network)详解(一). 带手算步骤&#x…...

【扒网络架构】backbone、ccff
backbone CCFF 还不知道网络连接方式,只是知道了每一层 backbone backbone.backbone.conv1.weight torch.Size([64, 3, 7, 7])backbone.backbone.layer1.0.conv1.weight torch.Size([64, 64, 1, 1])backbone.backbone.layer1.0.conv2.weight torch.Size([64, 64,…...

linux进程
exit()函数正常结束进程 man ps aux 是在使用 ps 命令时常用的一个选项组合,用于显示系统中所有进程的详细信息。aux 不是 ps 命令的一个正式选项,而是三个选项的组合:a, u, 和 x。这三个选项分别代表不同的含义&#…...

PRVF-4037 : CRS is not installed on any of the nodes
描述:公司要求替换centos,重新安装ORACLE LINUX RAC的数据库做备库,到时候切换成主库,安装Linux7GRID 19C 11G Oracle,顺利安装grid 19c,安装11G数据库软件的时候检测报如题错误:**PRVF-4037 …...

整理 酷炫 Flutter 开源UI框架 FAB
flutter_villains 灵活且易于使用的页面转换。 项目地址:https://github.com/Norbert515/flutter_villains 项目Demo:https://download.csdn.net/download/qq_36040764/89631324...

Unity 编写自己的aar库,接收Android广播(broadcastReceiver)并传递到Unity
编写本文是因为找了很多文章,都比较片段,不容易理解,对于Android新手来说理解起来不友好。我这里写了一个针对比较小白的文章,希望有所帮助。 Android端 首先还是先来写Android端,我们新建一个Android空项目…...

Mysql cast函数、cast用法、字符串转数字、字符串转日期、数据类型转换
文章目录 一、语法二、示例2.1、复杂示例 三、cast与convert的区别 CAST 函数是 SQL 中的一种类型转换函数,它用于将一个数据类型转换为另一个数据类型,这篇文章主要介绍了Mysql中Cast()函数的用法,需要的朋友可以参考下。 Mysql提供了两种将值转换成指…...

微信小程序开发之组件复用机制
新建复用文件,另外需要注册 behavior 例如: 在behavior.js文件中写入方法,并向外暴露出去 写法一: module.exportsBehavior({data: {num: 1},lifetimes: {created() {console.log(1);}} })写法二: const behavior …...

数据结构--线性表
数据结构分类 集合 线性结构(一对一) 树形结构(一对多) 图结构(多对多) 数据结构三要素 1、逻辑结构 2、数据的运算 3、存储结构(物理结构) 线性表分类 1、顺序表 2、链表 3、栈 4、队列 5、串 线性表--顺序表 顺序表的特点 顺序表的删除和插入…...

深入探针:PHP与DTrace的动态追踪艺术
标题:深入探针:PHP与DTrace的动态追踪艺术 在高性能的PHP应用开发中,深入理解代码的执行流程和性能瓶颈是至关重要的。DTrace,作为一种强大的动态追踪工具,为开发者提供了对PHP脚本运行时行为的深入洞察。本文将详细介…...

黑龙江日报报道第5届中国计算机应用技术大赛,赛氪提供赛事支持
2024年7月17日,黑龙江日报、极光新闻对在哈尔滨市举办的第5届中国计算机应用技术大赛全国总决赛进行了深入报道。此次大赛由中国计算机学会主办,中国计算机学会计算机应用专业委员会与赛氪网共同承办,吸引了来自全国各地的顶尖技术团队和选手…...

【计算机网络】LVS四层负载均衡器
https://mobian.blog.csdn.net/article/details/141093263 https://blog.csdn.net/weixin_42175752/article/details/139966198 《高并发的哲学原理》 (基本来自本书) 《亿级流量系统架构设计与实战》 LVS 章文嵩博士创造 LVS(IPVS) 章⽂嵩发…...

Java 守护线程练习 (2024.8.12)
DaemonExercise package DaemonExercise20240812;public class DaemonExercise {public static void main(String[] args) {// 守护线程// 当普通线程执行完毕之后,守护线程没有继续执行的必要,所以说会逐步关闭(并非瞬间关闭)//…...

C#小桌面程序调试出错,如何解决??
🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…...