目录

一,关于窗口

二,菜单栏

2.1 菜单介绍

2.2 添加菜单

2.3 添加快捷键

2.4 添加其子菜单

2.5 添加分割线和图标

三,工具栏

3.1 添加和使用工具栏

3.2 设置位置属性

四,状态栏

五,浮动窗口

六,对话框

6.1 介绍

6.2 自定义对话框

6.3 模态对话框

6.4 内置对话框

6.4.1 QMessageBox

6.4.2 QColorDialog

6.4.3 QFileDialog

6.4.4 QfontDialog

6.4.5 QInputDialog

一,关于窗口

我们前面学习的所有控件的代码,都是基于 QWidget 的,但是 QWidget 更多的是作为别的窗口的一个部分

在创建项目时,选择 QMainWindow,这个才是 Qt 窗口的完全体:

一个 QMainWindow 包含了下列内容:

从上往下依次是:

  • 标题:操作系统加的,与Qt关系不大,可以修改名称
  • 菜单栏:与标题紧挨,只能置于最上面
  • 工具栏:类似于菜单栏,本质上是把菜单栏一些常用选项直接放到工具栏,目的是方便使用,上图的粉色区域四个方向都有,表示可以置于四个方向上
  • 子窗口:一个程序里可能包含多个窗口,比如 Qt 界面就同时包含了:“文件管理窗口”,“代码编辑窗口”,“输出窗口”等等
  • 中央控件:窗口最核心的部分
  • 状态栏:显示一些信息,和上面所有内容一样,都可以在 Qt 的界面找到对应的内容 

二,菜单栏

2.1 菜单介绍

Qt 中的菜单栏通过 QMenuBar 这个类来实现,并且一个主窗口最多只能有一个菜单栏,下面是Qt的菜单栏:

工具栏里的选项也叫做 QAction,因为前面说过,工具栏本质是菜单栏一些功能的快捷选项

2.2 添加菜单

以后我们创建项目时,选择 QMainWindow,而不是 QWidget 了:

生成的代码和 QWidget 的很相似,也是在 mainwindow.cpp 里编写代码,在 .h 里声明函数

唯一的区别也就是 ui 界面了,如下图:

添加菜单栏和添加菜单项都可以通过上面的图形化界面来创建,下面是通过代码创建的演示:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//1,创建并设置菜单栏QMenuBar* menuBar = new QMenuBar(); this->setMenuBar(menuBar); //设置进窗口里,其实是挂到对象树里去//2,创建菜单QMenu* m1 = new QMenu("文件");QMenu* m2 = new QMenu("编辑");QMenu* m3 = new QMenu("构建");menuBar->addMenu(m1);menuBar->addMenu(m2);menuBar->addMenu(m3);//3,给菜单添加菜单项QAction* a1 = new QAction("新建");QAction* a2 = new QAction("打开");QAction* a3 = new QAction("保存");QAction* a4 = new QAction("另存为");QAction* a5 = new QAction("退出");m1->addAction(a1);m1->addAction(a2);m1->addAction(a3);m1->addAction(a4);m1->addAction(a5);//4,给 action 添加信号槽,上面的菜单项被点击后会产生一个 triggered 信号connect(a1, &QAction::triggered, this, &MainWindow::handle); //a1发信号,发triggered信号,this接收,执行handle函数
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handle()
{qDebug() << "触发操作";
}

效果如下:

2.3 添加快捷键

直接在创建项目时,添加下列内容即可:

但是默认是 alt + 随机键,如果是要用 Ctrl + 随机键,就需要用到 setShortcuts,如下给菜单项添加 Ctrl 的快捷键:

2.4 添加其子菜单

有时候菜单栏下面是菜单,但是往下还有一层或多层子菜单,如下:

QMenu 也提供了 addMenu 功能给某个菜单项添加子菜单,QMenuBar 也可以, 如下代码:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenuBar* menuBar = new QMenuBar();this->setMenuBar(menuBar);QMenu* menuParent = new QMenu("父菜单");QMenu* menuChild = new QMenu("子菜单");menuBar->addMenu(menuParent);menuParent->addMenu(menuChild); //直接在对应的父菜单调用 addMenu函数添加QAction* a1 = new QAction("菜单项1");QAction* a2 = new QAction("菜单项2");menuChild->addAction(a1);menuChild->addAction(a2);
}

如果还想添加子菜单,直接继续直接用菜单对象调用 addMenu 函数即可 

2.5 添加分割线和图标

如标题,当菜单里的菜单项特别多时,可以通过 QMenu 提供的 addSeparator 方法添加分割线进行分组;同时也可以通过 setIcon 来进行设置,如下代码:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenuBar* menuBar = new QMenuBar();this->setMenuBar(menuBar);QMenu* m = new QMenu("你好");menuBar->addMenu(m);QAction* a1 = new QAction("菜单项1");a1->setIcon(QIcon(":/deepseek.png")); //设置图标QAction* a2 = new QAction("菜单项2");QAction* a3 = new QAction("菜单项3");m->addAction(a1);m->addSeparator(); //添加分割线m->addAction(a2);m->addSeparator();m->addAction(a3);
}

如果给主菜单的 QMune 设置图标,由于 QMenu是直接覆盖在 MenuBar 上的,那么图标就会覆盖文本,可以根据需要自行设置

三,工具栏

3.1 添加和使用工具栏

使用 QToolBar 表示工具栏对象,一个窗口可以有多个工具栏也可以没有,而且工具栏也可以手动移动位置,如下代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QToolBar>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* a1 = new QAction("保存");QAction* a2 = new QAction("新建");a1->setToolTip("点击以保存文件"); //鼠标放在对应选项时的提示信息,默认是上面创建时的a2->setToolTip("点击新建文件");a1->setIcon(QIcon(":/deepseek.png")); //工具栏一般也是用图标代替,这里暂时用 老图片代替a2->setIcon(QIcon(":/deepseek.png"));//菜单项可以放在菜单和工具栏中menu->addAction(a1);menu->addAction(a2);toolBar->addAction(a1);toolBar->addAction(a2);connect(a1, &QAction::triggered, this, &MainWindow::handle);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handle()
{qDebug() << "触发操作";
}

3.2 设置位置属性

工具栏的位置并不是固定的:

  • 很多工具栏并不是指放置于菜单栏下面,也可以放置在靠左靠右和靠下位置
  • 而且鼠标长按工具栏本体,可以直接将工具栏分离出来,以浮动窗口的形式显示在屏幕上
  • 所以我们也可以将我们上面的工具栏添加一些属性,让其也有类似的效果

①设置位置 

可以设置初始位置和停靠位置,如下:

有四种参数可以设置:

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

也可以使用 selAllowedAreas 方法设置工具栏允许停靠的位置,如下:

②设置浮动属性 

工具栏的浮动可以通过 setFloatable 方法来设置,就是可以将工具栏以浮动小窗口的形式显示在屏幕上,如下:

设置不能浮动后,工具栏也是可以移动到允许停靠的位置的 

③设置移动属性 

设置工具栏移动属性可以通过 setMovable 方法来设置,并且若工具栏设置了不移动状态,则停靠位置和浮动的操作都会禁用,相当于固定死了位置,只能在初始化的时候指定位置,所以这个方法类似于总开关的效果,如下:

四,状态栏

状态栏是应用程序输出简要信息的区域,一般位于窗口最底层,且一个窗口只能有一个状态栏

由 QStatusBar 来实现,可以显示三种信息:

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

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QStatusBar* s = this->statusBar(); //直接获取this->setStatusBar(s);//1,显示临时消息//s->showMessage("你好", 2000); //设置显示大约2秒的信息//2,设置永久消息,需要通过 label 控件来显示s->addWidget(new QLabel("这是一条永久消息"));//3,调整显示消息的位置s->addPermanentWidget(new QLabel("右侧提示消息"));
}
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QStatusBar* s = this->statusBar(); //直接获取this->setStatusBar(s);//1,显示临时消息//s->showMessage("你好", 2000); //设置显示大约2秒的信息//2,设置永久消息,需要通过 label 控件来显示s->addWidget(new QLabel("你好111"), 1); //第二个参数表示拉伸系数s->addWidget(new QLabel("你好222"), 2);//3,在右下角显示进度条QProgressBar* p = new QProgressBar();p->setValue(50);s->addPermanentWidget(p); //表示从右往左设置
}

五,浮动窗口

上面我们也讲到了,一个程序里可能包含多个窗口,比如 Qt 界面就同时包含了:“文件管理窗口”,“代码编辑窗口”,“输出窗口”等等

我们可以使用 QDockWidget 类来实现浮动的功能,可以有多个,并且部分操作和工具栏的操作类似,如下演示:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QLabel>
#include<QDockWidget>
#include<QVBoxLayout>
#include<QPushButton>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 设置进 dockWidget 才行QWidget* w = new QWidget();dockWidget->setWidget(w);//创建布局遍历器,并设置进 QWidget 中QVBoxLayout* l = new QVBoxLayout;w->setLayout(l);//再创建其它控件,添加到 layout 中l->addWidget(new QLabel("这是一个 QLabel"));l->addWidget(new QPushButton("这是按钮"));
}MainWindow::~MainWindow()
{delete ui;
}

六,对话框

6.1 介绍

对话框是 GUI 程序中不可或缺的部分,往往是程序与用户之间进行“短平快” 的操作

Qt 中使用 QDialog 类表示对话框,通常是一个顶层窗口,出现在程序最上层,用于实现短期热内或者简洁的用户交互

Qt 常用的内置对话框有:QFiledialog(文件对话框)、QColorDialog(颜色对话框)、QFontDialog (字体对话框)、QInputDialog(输入对话框)和QMessageBox(消息框)

创建项目时选择 QDialog :

直接运行程序会显示:

总体来说,基于 QDialog 作为父类创建出来的程序窗口和之前通过 QWidget 创建出来的非常相似,就是部分属性不一样,后面我们会详细介绍

实际开发中,更多的情况不是在创建项目时继承自 QDialog,而是在代码中创建额外的类,让这个类继承自 QDialog,从而让主窗口产出一些其他的对话框

我们也可以在 QMainWindow 项目里用按钮生成一个对话框,如下槽函数:

void MainWindow::on_pushButton_clicked()
{QDialog* d = new QDialog();d->setWindowTitle("你好"); //设置对话框标题d->resize(400, 300); //设置对话框的大小d->show(); //显示对话框
}

问题:我们按下按钮弹出弹窗,关闭后再次点击按钮,此时弹出的弹窗和第一此弹出的是同一个对象吗?

解答:每次按下按钮都是创建一个新的 QDialog 对象,并进行显示

追问:那么多次甚至无数次点击按钮创建对象,内存泄漏问题如何解决?

解答:将 delete 释放逻辑和关闭按钮的点击信号关联起来,在用户点击关闭的时候,触发 delete;并且 Qt 也给QDialog 设置了一个属性,可以通过属性来完成上述操作,如下:

6.2 自定义对话框

 上面我们通过按钮弹出一个对话框,但是目前这个对话框是空白的,如何在里面添加控件呢?

要自定义对话框,就需要继承自 QDialog 创建类,然后有两种继承方式,下面分别演示一下:

①纯代码方式来自定义 QDialog 界面

先新键一个类:

 

 然后就会创建出一个头文件和一个 .cpp 文件,然后我们就可以把这两个文件当初是我们之前用的另一个 QWidget 的头文件和 .cpp 文件去编写控件代码了,如下:

dialog.h内容如下:

#ifndef DIALOG_H
#define DIALOG_H#include <QWidget>
#include <QDialog>class Dialog : public QDialog
{Q_OBJECT
public:Dialog(QWidget* parent); //添加进 QWidget 的对象树中void handle();
};#endif // DIALOG_H

dialog.cpp 内容如下:

#include "dialog.h"
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>Dialog::Dialog(QWidget* parent) : QDialog(parent)
{//创建出一些控件,加入到 Dialog 中QVBoxLayout* layout = new QVBoxLayout();this->setLayout(layout);QLabel* label = new QLabel("你好");QPushButton* b = new QPushButton("关闭", this);layout->addWidget(label);layout->addWidget(b);connect(b, &QPushButton::clicked, this, &Dialog::handle);
}void Dialog::handle()
{this->close();
}

 mainwindow.cpp 里将原来的 QDialog 替换为我们的 Dialog,效果如下:

②通过图形化的方式

 我们上面的按钮保存,但是按下按钮后显示的对话框不再是纯代码的了,所以先删除槽函数内容

而通过图形化界面创建,重要的就是先创建一个新的 .ui 文件出来,如下:

这个操作是创建一个 ui 文件和对应的类,也可以指定创建的模板,选定好类名后直接下一步即可

然后双击这个 ui 文件,就可以和前面一样创建控件了,同时右键按钮转到槽,就可以像前面那样编写槽函数了,如下:

然后就可以直接在 mainwindow.cpp 的槽函数里创建 Dialog 对象然后显示了:

效果和上面纯代码的一致

6.3 模态对话框

在上面 6.1 我们直接创建的对话框项目的 ui 界面,右下角属性有一个这个:

表示 模态 / 非模态(true / false),这个我们也很常见,就是如果为 true,表示模态,此时用户无法操作父窗口,必须先完成对话框内容并关闭对话框之后,我们才可以继续操作;非模态就是是相反

这个模态用于非常关键的,必须要让用户做出决策的场合;非模态就是用于不受特别关键的场景

要使我们的对话框变成模态对话框也很简单,只要把我们前面的 .show 方法换成 .exec 方法即可:

6.4 内置对话框

6.4.1 QMessageBox

消息对话框是应用程序中最常见的界面元素,我们还是通过一个按钮显示对话框,槽函数如下:

void MainWindow::on_pushButton_clicked()
{// 创建消息对话框QMessageBox* m = new QMessageBox(this);m->setWindowTitle("你好");m->setText("这是对话框文本");m->setIcon(QMessageBox::Warning); //设置图标m->setAttribute(Qt::WA_DeleteOnClose);m->setStandardButtons(QMessageBox::Ok | QMessageBox::Save); //添加内置按钮//我们也可以使用自定义按钮//QPushButton* b = new QPushButton("按钮", m); /也可以使用 connect 连接信号槽//m->addButton(b, QMessageBox::AcceptRole); //第一个参数是 QAbstractButton,第二个是 ButtonRole,负责返回点击按钮的一些情况int result = m->exec();if(result == QMessageBox::Ok) qDebug() << "ok";else if(result == QMessageBox::Save) qDebug() << "Save";//上面的内置按钮,没办法进行信号槽的连接,因为按钮是 QMessageBox 自己生成的//所以为了解决这个问题,用户点击按钮使对话框关闭之后,能通过 exec 的返回值,来获取用户点击的是哪个按钮了
}


除了上面的方式,QMessageBox 类定义了静态成员函数,可以直接调用并创建不同内容的消息对话框,包括:

 

void MainWindow::on_pushButton_clicked()
{// 创建消息对话框int result = QMessageBox::warning(this, "对话框标题", "对话框文本", QMessageBox::Ok | QMessageBox::Cancel);if(result == QMessageBox::Ok) qDebug() << "Ok";else if(result == QMessageBox::Cancel) qDebug() << "Cancel";
}

 

6.4.2 QColorDialog

这个是颜色对话框,继承自 QDialog 类, 可以让用户来选择一个颜色,而且 QColorDialog 内置了“调色板”,常用函数如下:

函数说明
QColorDialog(QWidget*parent=nullptr)创建对象的同时设置父对象
QColorDialog(const QColor &initial, QWidget *parent = nullptr)创建对象的同时通过QColor 对象设置默认颜色和父对象
voidsetCurrentColor(const QColor &color)设置当前颜色对话框
QColorcurrentColor() const获取当前颜色对话框
QColorgetColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions())打开颜色 选择对话框,并返回⼀个QColor对象
voidopen(QObject* receiver, constchar* member)打开颜色对话框

部分参数: 

  • initial:设置默认颜色
  • parent:设置父对象
  • title:设置对话框标题
  • options:设置选项

下面直接用代码演示一下:

void MainWindow::on_pushButton_clicked()
{//getColor 能弹出一个模态的对话框,用户选择颜色后,确定关闭,getColor 就可以返回一个QColor 对象,包含一些颜色信息//并且是一个静态的,不需要创建对象就能使用QColor c = QColorDialog::getColor(QColor(255, 0, 0), this, "选择颜色");qDebug() << c; //打印QColor(ARGB 1, 1, 0, 0) 第一个数表示不透明度,后面三个就是颜色的RGB数值,1表示255,0 就是 整数0,是百分比的形式//可以基于颜色,修改其它控件的颜色,比如下面是设置背景颜色//QString s = "background-color: rgb(" + QString::number(c.red()) + ", " + QString::number(c.green()) + ", " + QString::number(c.blue()) + ")";char s[1024] = { 0 };sprintf(s, "background-color: rgb(%d, %d, %d)", c.red(), c.green(), c.blue()); //上面的太长,也可以这样搞,以格式化方式设置this->setStyleSheet(s); //可以通过 QSS 的方式设置背景色
};

6.4.3 QFileDialog

通过 QFileDialog 可以选择一个文件,能够获取到这个文件的路径,然后对指定文件进行一些操作,常用函数如下:

函数说明
QString getOpenFileName(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())打开文件(一次只能打开一个)
QStringList getOpenFileNames(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())打开文件(能打开多个)
QString getSaveFileName(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())保存文件

参数说明:

  • parent:父控件
  • caption:对话框标题
  • dir:默认打开的路径
  • filter:文件过滤器

下面我们来演示一下,我们搞两个按钮,左边的用来弹出打开文件,右边的用来弹出保存文件,如下代码:

//注意这里仅仅只是获取文件路径,真正打开/保存文件的操作需要我们实现额外的逻辑,后面会详细介绍
void MainWindow::on_pushButton_clicked()
{QString filePath = QFileDialog::getOpenFileName(this); //返回文件路径,此时右下角显示“打开”qDebug() << filePath; //打印文件路径
};void MainWindow::on_pushButton_2_clicked()
{QString filePath = QFileDialog::getSaveFileName(this); //此时右下角显示“返回”,并且需要输入文件名qDebug() << filePath; //打印文件路径
}

6.4.4 QfontDialog

这个表示字体对话框,用于提供选择字体的对话框部件,如下代码:

void MainWindow::on_pushButton_clicked()
{bool ok = false; //作为输出型参数,当用户选择确定时设置为true,选择取消时设置为falseQFont font = QFontDialog::getFont(&ok); //返回字体信息ui->pushButton->setFont(font); //设置按钮字体
};

6.4.5 QInputDialog

表示一个输入对话框,用于进行临时数据输入的场合,常用函数如下:

函数说明
double getDouble(QWidget*parent,constQString&title, const QString&label, double value =0,doublemin=-2147483647,doublemax=2147483647,intdecimals=1,bool*ok =nullptr, Qt::WindowFlags flags = Qt::WindowFlags());双精度浮点型输入数据对话框
int getInt (QWidget *parent, const QString &title, const QString &label, int value = 0, int min=-2147483647,intmax=2147483647,intstep=1,bool*ok=nullptr,Qt::WindowFlags flags = Qt::WindowFlags());整型输入数据对话框
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) ;选择条目输入数据框

下面是输入数字的代码:

void MainWindow::on_pushButton_clicked()
{double result = QInputDialog::getDouble(this, "这是标题", "浮点数");//getInt就是输入整数qDebug() << result;
};

可以看到他是自带微调框的,我们也可以自己去设置

第三个是条目框,顾名思义就是将上面的输入框换成了条目按钮输入,如下代码:

void MainWindow::on_pushButton_clicked()
{QStringList items; //可以当成是 QList<QString>,字符串数组items << tr("你好") << tr("hello world") <<tr("Qt Creator");QString s = QInputDialog::getItem(this, "条目输入对话框", "请输入条目", items);qDebug() << s;
};

效果如下:

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

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

相关文章

git从本地仓库添加到远程仓库

先创建&#xff0c;然后配置 Git 的全局用户名和邮箱git config --global user.name "不吃糖o" git config --global user.email "1523944556qq.com" git config --global -l 查看设置的用户名和邮箱如何生成SSH公钥&#xff1f;ssh-keygen 生成sshkeyls ~…

锁步核,为什么叫锁步核?

“锁步核”&#xff08;Lockstep Cores&#xff09;这一名称源于其工作原理与军事队列行进中的“锁步”&#xff08;Lockstep&#xff09;动作的类比。以下是详细的说明整理&#xff1a;1. 军事起源&#xff1a;什么是“锁步”&#xff1f; 在传统军事训练中&#xff0c;“锁步…

python学智能算法(二十二)|SVM-点与超平面的距离

引言 前序学习进程中&#xff0c;了解了向量、向量点积运算、超平面、感知机等知识点。 SVM算法最核心的目标是通过规划租号的分割超平面&#xff0c;来使得超平面附近的点到超平面的距离和达到最大值。 那点和超平面的距离如何计算&#xff0c;就是今天学习的重点。 点与超平…

参会邀请!2025世界人工智能大会合合信息技术交流日报名启动!

2025世界人工智能大会即将开幕&#xff0c;合合信息邀请您一起参与KOL深度技术交流活动。本次活动不仅可以带您逛展2025世界人工智能大会&#xff0c;在合合信息展台体验AI黑科技&#xff0c;还可以与行业顶尖技术专家面对面交流&#xff0c;共同探讨当下热门AI安全话题。 详细…

零基础入门:用C++从零实现TCP Socket网络小工具

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 网络编程中的套接字&#xff08;Socket&#xff09;是通信的基本接口&#xff0c;允许不同计算机之间通过网络交换数据。套接字是计算机网络中通信的“端点”&#xff0c;通过它&#xff0c;应用程序可以与…

SOES:软实现EtherCAT从站协议栈项目介绍及从站开发案例

在现代工业自动化领域&#xff0c;EtherCAT&#xff08;Ethernet for Control Automation Technology&#xff09;以其高速、实时和开放的特性&#xff0c;成为现场总线通信的主流协议之一。EtherCAT网络中&#xff0c;主站&#xff08;Master&#xff09;负责调度和管理&#…

[simdjson] 填充字符串 | `document` 对象 | on-demand 模式

第二章&#xff1a;填充字符串 在第一章解析器中&#xff0c;我们学习了simdjson::dom::parser和simdjson::ondemand::parser作为可复用内存的JSON解析工具。 本章将深入解析JSON数据输入的核心要求——“填充字符串”。 为何需要填充&#xff1f; simdjson通过SIMD&#x…

扭蛋机小程序开发:开启线上娱乐新风尚

在当今数字化浪潮席卷的时代&#xff0c;娱乐方式正经历着前所未有的变革。传统的扭蛋机&#xff0c;那充满惊喜与期待的实体装置&#xff0c;曾是无数人童年回忆中的欢乐源泉。如今&#xff0c;随着科技的飞速发展&#xff0c;扭蛋机小程序开发应运而生&#xff0c;将这份经典…

【React Native】布局和 Stack 、Slot

布局和Stack 点击链接后&#xff0c;页面切换时最好是有动画效果。页面一般都有头部&#xff0c;里面有页面的标题之类的东西。 在app目录里&#xff0c;新建一个_layout.js文件&#xff0c;这是项目的布局文件。 这个名字是固定的&#xff0c;前面必须有一个_ 。 布局的意…

3C电子产品蓝光三维扫描检测方案-中科米堆CASAIM

随着3C电子产品向轻薄化、精密化方向发展&#xff0c;传统的二维检测技术已难以满足现代制造业对产品精度的高标准要求。特别是在智能手机、平板电脑等消费电子领域&#xff0c;微小的结构偏差都可能导致产品组装困难或性能下降。当前行业内普遍面临检测效率低、数据采集不完整…

Docker 镜像原理

Union FS(联合文件系统) Union File System 是一种分层、轻量级并且高性能的文件系统&#xff0c;它支持对文件系统的修改作为一次提交来一层层的叠加&#xff0c;同时可以将不同目录挂载到同一个虚拟文件系统下。UnionFS 是一种为 Linux&#xff0c;FreeBSD 和 NetBSD 操作系统…

为什么IoTDB成为物联网场景的技术优选?

在物联网、工业监控等领域&#xff0c;时序数据的高效管理成为技术架构设计的关键环节。时序数据库作为专门处理带时间戳数据的系统&#xff0c;其选型需兼顾性能、兼容性与场景适配性。本文将从技术角度解析 IoTDB 的设计理念与实践方法&#xff0c;为时序数据库选型提供参考。…

js中的微任务和宏任务的理解

在JavaScript中&#xff0c;微任务&#xff08;Microtask&#xff09;和宏任务&#xff08;Macrotask&#xff09;是异步任务执行机制的重要组成部分&#xff0c;它们共同构成了JavaScript事件循环&#xff08;Event Loop&#xff09;的核心逻辑。理解这两个概念对于编写高性能…

Spring-AI系列-AI模型-Model

原文-知识库&#xff0c;欢迎大家评论互动 AI Model API Portable ModelAPI across AI providers for Chat, Text to Image, Audio Transcription, Text to Speech, and Embedding models. Both synchronous and stream API options are supported. Dropping down to access mo…

MySQL查询今天、昨天、上周、近30天、去年等的数据的方法

目录 常用的MySQL查询今天、昨天、上周、近30天、去年等数据的方法 0、Sql server中DateDiff()用法 1、MySQL的DATE_SUB()函数 定义和用法 语法 实例 2、MySQL的TO_DAYS(date) 3、MySQL的DATE() 函数 定义和用法 4、MySQL NOW() 函数 定义和用法 语法 实例 例子 …

Linux —— B / 基础开发工具

一、软件包管理器1.1什么是软件包1.2 Linux软件生态1.3 yum具体操作1.3.1 查看软件包1.3.2 安装软件1.3.3 卸载软件1.3.4 注意事项1.4 安装源二、编辑器Vim2-1 Linux编辑器-vim使用2-2 vim的基本概念2-3 vim的基本操作2-4 vim正常模式命令集2-5 vim末行模式命令集2-6 vim操作总…

SQL,在join中,on和where的区别

0.结论 两个表在&#xff0c;join时&#xff0c;首先做一个笛卡尔积&#xff0c;on后面的条件是对这个笛卡尔积做一个过滤形成一张临时表&#xff0c;如果没有where就直接返回结果&#xff0c;如果有where就对上一步的临时表再进行过滤。 先on&#xff0c;再join&#xff0c;再…

SD-WAN在储能网络中的应用,传统方案如何借力智能化升级?(附网络架构图)

一、储能网络的建设挑战在储能项目中&#xff0c;网络系统通常需要实现以下目标&#xff1a;高可靠性&#xff1a;实时采集和传输储能设备状态数据&#xff0c;链路中断可能导致系统故障。灵活扩展&#xff1a;分布式站点部署广泛&#xff0c;传统网络扩展需重新铺设线路&#…

Oracle11.2.0.4 RAC迁移升级Oracle19.3 RAC

问题描述 填写问题的基础信息。 系统名称 Oracle11.2.0.4迁移升级Oracle19.3 IP地址 操作系统 Centos7.5 数据库 Oracle11.2.0.4迁移升级Oracle19.3 症状表现 问题的症状表现如下 需要将单机的Oracle11.2.0.4环境升级到Oracle19.3.0RAC环境&#xff0c;采用迁移升级的…

SAP-ABAP:SAP的‘cl_http_utility=>escape_url‘对URL进行安全编码方法详解

SAP的’cl_http_utility>escape_url’对URL进行安全编码方法详解 核心作用&#xff1a;对 URL 进行安全编码&#xff0c;将特殊字符转换为 %XX 格式&#xff0c;确保符合 HTTP 传输规范。1. 功能与作用 ✅ URL 安全编码 将非安全字符转换为十六进制 ASCII 码&#xff08;%XX…