【QT】窗口MainWindow

目录

窗口的组成

菜单栏

图形化创建菜单栏

代码创建菜单栏

给菜单设置快捷键 

添加子菜单

添加分割线 

添加图标 

创建menuBar的细节

工具栏

设置工具栏出现的初始位置(上下左右) 

设置工具栏允许停靠的位置

设置不允许浮动

设置不允许移动

状态栏

创建状态栏

显示实时消息

给状态栏添加子控件

浮动窗口 

1. 给主窗口添加一个浮动窗口(子窗口)

2. 给浮动窗户设置标题

3.给浮动窗口内部,添加一些其他控件

4. 设置浮动窗口的停靠位置 

对话框

对话框介绍

分类 

内存释放问题

创建对话框

自定义对话框

通过代码实现自定义

通过图形化自定义

模态对话框

 消息对话框

1. 创建消息对话框

2. 设置对话框窗口标题和文本

3.设置对话框风格

 4.设置对话框包含的按钮

5. 获取用户点击哪个按钮

简便写法

颜色对话框

常用方法

使用示例:基于用户选择的颜色,修改窗口的背景色 

文件对话框

常用方法

字体对话框

使用示例:基于用户选择的font属性,设置button的字体

输入对话框


窗口的组成

        Qt中窗口是通过QMainWindow类来实现的,QMainWindow是一个为用户提供主程序的类,继承自QWidget类,并且提供了⼀个预定义的 布局。QMainWindow 包含 ⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝(铆接部件)(dock widgets 也就是子窗口)、⼀个状态栏(status bar) 和⼀个 中⼼部件(central widget)

菜单栏跟工具栏的区别 :
菜单栏如下:

工具栏如下:

 工具栏中本质上就是菜单栏中一些选项的快捷方式。

菜单栏

一个主窗口最多只能有一个菜单栏。

菜单项通过QAction类实现。

图形化创建菜单栏

在 这里的 “在这里输入” 是新建一个菜单页

在文件下拉选项中的 是新建一个菜单项 

代码创建菜单栏

1. 创建菜单栏

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

2. 创建菜单

    QMenu* menu1 = new QMenu("文件");
    QMenu* menu2 = new QMenu("编辑");
    QMenu* menu3 = new QMenu("视图");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);

3. 给菜单添加菜单项

    QAction* action1 = new QAction("新建");
    QAction* action2 = new QAction("打开");
    QAction* action3 = new QAction("保存");
    menu1->addAction(action1);
    menu1->addAction(action2);
    menu1->addAction(action3);

4. 给action添加信号槽

connect(action1,&QAction::triggered,this,&MainWindow::handle);

5. 效果如下:

给菜单设置快捷键 

设置好的快捷键搭配alt就可以进行使用了

QMenu* menu1 = new QMenu("文件(&F)");

通过给文本设置 “ (&F)” 即可设置快捷键,与QLabel设置伙伴类似。

菜单项的快捷键与这一样。

添加子菜单

菜单栏通过 addMenu 添加菜单,菜单也是通过addMenu 添加子菜单。

示例:

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

    QMenu* menuParent = new QMenu("父菜单");
    QMenu* menuChild = new QMenu("子菜单");
    QAction* action1 = new QAction("菜单项1");
    QAction* action2 = new QAction("菜单项2");;


    menuBar->addMenu(menuParent);
    menuParent->addMenu(menuChild);

    menuParent->addAction(action1);
    menuParent->addAction(action2);

效果如下: 

添加分割线 

菜单里菜单项特别多,就可以通过分割线,进行分组。

QMenu中提供了 addSeparator 函数。

这是添加分割线之前的效果:

添加之后: 

代码如下:

    menuParent->addAction(action1);

    menuParent->addSeparator();

    menuParent->addAction(action2);

通过这个分割线,可以把菜单中若干个菜单项分成几个部分,以达到更好的用户体验效果。

添加图标 

这里涉及到之前所介绍的QIcon类和qrc机制。

代码如下:

    QAction* action1 = new QAction("编辑");
    action1->setIcon(QIcon(":/edit.png"));

效果如下:

菜单也可以设置图标,但是如果给QMenu设置图标 ,当前的QMenu是长在QMenuBar上的,此时文本就不显示,图标覆盖了文本,如果当前的QMenu是子菜单,图标和文本是都能显示的。

创建menuBar的细节

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

上述代码中,在一些多线程之类的情况下,可能会出现原本窗口已经有了菜单栏,我们在进行设置菜单栏的话,会导致原本的菜单栏脱离对象树,从而导致后续内存泄漏。

因此我们可以规范一下创建菜单栏的写法:

    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);

上述代码写法的好处:

  1. 如果QMenuBar已经存在,直接获取并返回。
  2. 如果QMenubar不存在,就先创建一个新的,再返回。

如果是获取到已经存在的QMenuBar,后面的设置就是自己替换自己,还在对象树上。

工具栏

qt中使用QToolBar表示工具栏对象,一个窗口可以有多个工具栏,也可以没有,同时工具栏往往可以手动移动位置。
使用示例:

    QToolBar* toolBar = new QToolBar();

    this->addToolBar(toolBar);

    QAction* action1 = new QAction("保存");
    action1->setIcon(QIcon(":/edit.png"));

    toolBar->addAction(action1);

效果:

可以从上述效果中看出,文本被图标所覆盖,但是我们设置的文本并没有消失 ,而是变成tooltip存在。

设置工具栏出现的初始位置(上下左右) 

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

示例:

    QToolBar* toolBar = new QToolBar();

    this->addToolBar(Qt::LeftToolBarArea,toolBar);

设置工具栏允许停靠的位置

示例:允许左侧和右侧停靠

toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea)

设置不允许浮动

    toolBar->setFloatable(false);

设置不允许移动

    toolBar->setMovable(false);

状态栏

状态栏是应⽤程序中输出简要信息的区域。⼀般位于主窗⼝的最底部,⼀个窗⼝中最多只能有⼀个状态栏。在 Qt 中,状态栏是通过 QStatusBar类 来实现的。 在状态栏中可以显⽰的消息类型有:
  • 实时消息:如当前程序状态
  • 永久消息:如程序版本号,机构名称
  • 进度消息:如进度条提⽰,百分百提⽰

创建状态栏

用如下的方式创建状态栏,若原本状态来就存在就获取即可,不存在就创建一个。

    QStatusBar* statusBar = this->statusBar();
    this->setStatusBar(statusBar);

显示实时消息

第二个参数为显示的时间,如下是显示2秒,如果为0或者不填,则消息永久存在。

statusBar->showMessage("hello",2000);

给状态栏添加子控件

addWidget( ) 在状态栏左侧添加控件

addPermanentWidget( ) 在状态栏右侧添加控件

    statusBar->addWidget(label1);
    statusBar->addPermanentWidget(label2);

效果如下:

浮动窗口 

浮动窗口也就是子窗口。

Qt中使用QDockWidget 来实现的。

1. 给主窗口添加一个浮动窗口(子窗口)

    QDockWidget* dockWidget = new QDockWidget();
    this->addDockWidget(Qt::LeftDockWidgetArea,dockWidget);

2. 给浮动窗户设置标题

dockWidget->setWindowTitle("这是浮动窗口");

3.给浮动窗口内部,添加一些其他控件

        不能直接给这个浮动窗口添加子控件,而是需要创建出一个单独的QWidget,把要添加的控件加入到QWidget中。,然后再把这个QWidget设置到dockWidget中。

        由于dockWidget中只能包含一个QWidget,想要添加更多控件只能往这个QWidget中进行添加了。

    QWidget* container = new QWidget();
    dockWidget->setWidget(container);

    QVBoxLayout* layout = new QVBoxLayout();
    container->setLayout(layout);

    QLabel* label = new QLabel("标签1");
    QPushButton* btn = new QPushButton("按钮");
    layout->addWidget(label);
    layout->addWidget(btn);

效果如下:

 

4. 设置浮动窗口的停靠位置 

浮动窗⼝是位于中⼼部件的周围。可以通过 QDockWidget类 中提供 setAllowedAreas() 函数设置其
允许停靠的位置。其中可以设置允许停靠的位置有:
  • Qt::LeftDockWidgetArea 停靠在左侧
  • Qt::RightDockWidgetArea 停靠在右侧
  • Qt::TopDockWidgetArea 停靠在顶部
  • Qt::BottomDockWidgetArea 停靠在底部
  • Qt::AllDockWidgetAreas 以上四个位置都可停靠

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

dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);

对话框

对话框介绍

        对话框是 GUI 程序中不可或缺的组成部分。⼀些不适合在主窗⼝实现的功能组件可以设置在对话框中。对话框通常是⼀个顶层窗⼝,出现在程序最上层,⽤于实现短期任务或者简洁的⽤⼾交互。Qt⽤的内置对话框有:QFiledialog(⽂件对话框)QColorDialog(颜⾊对话框)QFontDialog (字体对话框)QInputDialog (输⼊对话框)QMessageBox(消息框) 。  

分类 

对话框分为模态对话框和非模态对话框。

内存释放问题

因为dialog可以存在多个,可能会存在内存泄漏的问题,所以我们应该让用户点击 对话框关闭按钮的时候,触发delete操作。

 dialog->setAttribute(Qt::WA_DeleteOnClose);

创建对话框

1. 创建对话框

QDialog* dialog = new QDialog(this);

2. 设置对话框标题 

dialog->setWindowTitle("对话框的标题");

3. 设置对话框尺寸 

dialog->resize(400,300);

4. 显示对话框

dialog->show();

5. 设置delete属性

dialog->setAttribute(Qt::WA_DeleteOnClose);

自定义对话框

        要想自定义对话框,就需要继承QDialog创建类。

通过代码实现自定义

这里我们新建一个类,如下:

 1. Dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QWidget>
#include <QDialog>
class Dialog : public QDialog
{
    Q_OBJECT
public:
    Dialog(QWidget* parent);
    void handle();
};

#endif // DIALOG_H

 2. Dialog.cpp

#include "dialog.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>
Dialog::Dialog(QWidget* parent):QDialog(parent)
{
    QVBoxLayout* layout = new QVBoxLayout();
    this->setLayout(layout);

    QLabel* label = new QLabel("这是一个对话框",this);
    QPushButton* btn = new QPushButton("关闭",this);
    layout->addWidget(label);
    layout->addWidget(btn);

    connect(btn,&QPushButton::clicked,this,&Dialog::handle);

}

void Dialog::handle()
{
    this->close();
}

3. 调用

void MainWindow::on_pushButton_clicked()
{
    Dialog* dialog = new Dialog(this);

    dialog->setWindowTitle("这是自定义对话框");
    dialog->resize(400,300);

    dialog->show();
}

4. 效果 

通过图形化自定义

1. 新建一个Qt设计师界面

2.选择模板 

3.这样会多出来一个ui文件

4. 在dialog 的ui文件中设计自定义对话框即可 

模态对话框

模态:弹出对话框的时候,此时用户无法操作父窗口,必须得完成对话框内部出的操作,关闭对话框之后,才可操作父窗口。

非模态:弹出对话框的时候,用户可以操作父窗口。

那么我们如何产生模态对话框呢?

把前面 .show方法换成exec即可。

dialog->exec();

 消息对话框

消息对话框 QMessageBox,消息对话框是应⽤程序中最常⽤的界⾯元素。消息对话框主要⽤于为⽤⼾提⽰重要信息,强制⽤⼾进⾏选择操作。

1. 创建消息对话框

QMessageBox* message = new QMessageBox(this);

2. 设置对话框窗口标题和文本

   message->setWindowTitle("对话框窗口标题");
   message->setText("这是对话框文本");

3.设置对话框风格

QMessageBox类 中定义了静态成员函数,可以直接调⽤创建不同⻛格的消息对话框,其中包括:
Question
⽤于正常操作过程中的提问
Information
⽤于报告正常运⾏信息
Warning
⽤于报告⾮关键错误
Critical
⽤于报告严重错误
 message->setIcon(QMessageBox::Warning);

 4.设置对话框包含的按钮

message->setStandardButtons(QMessageBox::Ok | QMessageBox::Save);

除了使用系统提供按钮,我们也可以添加自己的按钮 ,在添加按钮的时候,可以设置按钮的角色

代码如下:

    QPushButton* btn = new QPushButton("按钮",messageBox);
    messageBox->addButton(btn,QMessageBox::AcceptRole);

也可以给这个按钮绑定信号槽来使用。 

5. 获取用户点击哪个按钮

        用户点击按钮,使对话框关闭之后,此时就能通过exec的返回值,来知道用户点击的是哪个按钮,从而执行一些对应的逻辑。

        以下是系统自带的按钮:

代码示例:

    int result = messageBox->exec();
    if(result == QMessageBox::Ok){
        qDebug()<<"ok"<<endl;
    }

因为QMessageBox的使用场景一般是模态的,所以我们使用exec方法

简便写法

通过warning这个静态函数,可以快速的构造出一个消息对话框。 

    int result = QMessageBox::warning(this,"对话框标题","对话框文本",QMessageBox::Ok | QMessageBox::No);
    if(result == QMessageBox::Ok){
        qDebug()<<"ok"<<endl;
    }

另外三种也可以通过上述的方法。

颜色对话框

QColorDialog颜⾊对话框的功能是允许用户选择颜⾊。继承⾃ QDialog 类。颜⾊对话框如下图示:

常用方法

1、 QColorDialog (QWidget *parent = nullptr) //创建对象的同时设置⽗对象
2、 QColorDialog(const QColor &initial, QWidget *parent = nullptr) //创建对象的同时通过QColor
对象设置默认颜⾊和⽗对象
3、 void setCurrentColor(const QColor &color) //设置当前颜⾊对话框
4、 QColor currentColor() const //获取当前颜⾊对话框
5、 QColor getColor(const QColor &initial = Qt::white,
                                 QWidget *parent = nullptr,
                                 const QString &title = QString(),
                                 QColorDialog::ColorDialogOptions options = ColorDialogOptions()) //打开颜⾊选择对话框,并返回⼀个QColor对象
参数说明:
                initial:设置默认颜⾊
                parent:设置⽗对象
                title:设置对话框标题
                options:设置选项
           
6、 void open(QObject *receiver, const char *member) //打开颜⾊对话框

使用示例:基于用户选择的颜色,修改窗口的背景色 

QColor(ARGB 1, 0.541176, 0.27451, 1) 

第一个参数为不透明度,1 为不透明 ,接下去的参数为red 、green 、blue

    QColor color =  QColorDialog::getColor(QColor(0,255,0),this,"选择颜色");
    qDebug()<<color;

    QString style = "background-color: rgb(" + QString::number(color.red()) + "," +
                    QString::number(color.green()) + "," +QString::number(color.blue()) + ");";
    this->setStyleSheet(style);

文件对话框

QFileDialog⽂件对话框⽤于应⽤程序中需要打开⼀个外部⽂件或需要将当前内容存储到指定的外部⽂件。

常用方法

1、打开⽂件(⼀次只能打开⼀个⽂件)
QString getOpenFileName (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
2、打开多个⽂件(⼀次可以打开多个⽂件)
QStringList getOpenFileNames (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
3、 保存⽂件
QString getSaveFileName (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
参数说明:
        参数1: parent ⽗亲
        参数2: caption 对话框标题
        参数3: dir 默认打开的路径
        参数4: filter ⽂件过滤器

此处的打开/保存功能需要额外去实现的,并不是说直接一按保存就真的保存了

代码示例:

返回文件路径

    QString filePath = QFileDialog::getOpenFileName(this);
    QString filePath = QFileDialog::getSaveFileName(this);

字体对话框

Qt 中提供了预定义的字体对话框类 QFontDialog,⽤于提供选择字体的对话框部件。
代码示例:
   bool ok = false;
   QFont font = QFontDialog::getFont(&ok);
   
   qDebug()<<font.family();
   qDebug()<<font.pointSize();
   qDebug()<<font.bold();
   qDebug()<<font.italic();

使用示例:基于用户选择的font属性,设置button的字体

ui->pushButton->setFont(font);

输入对话框

让用户输入一个具体的数据,可以是整数、浮点数,也可以是字符串。

1、双精度浮点型输⼊数据对话框
double getDouble (QWidget *parent, const QString &title, const QString &label, double
value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
2、整型输⼊数据对话框
int getInt (QWidget *parent, const QString &title, const QString &label, int value = 0, int
min = -2147483647, int max = 2147483647, int step = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
3、选择条⽬型输⼊数据框
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) ;
参数说明:
                parent:⽗亲
                title:对话框标题
                label:对话框标签
                items:可供选择的条⽬
返回值为用户输入的值
字符串数组 QStringList item

这里演示条目输入框的用法:

    QStringList items;
    items.push_back("111");
    items.push_back("222");
    items.push_back("333");
    QString item = QInputDialog::getItem(this,"条目输入对话框","请输入条目",items);

 效果如下:

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

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

相关文章

2024 CCF编程能力等级认证Python认证(GESP)一级介绍

目录 1. GESP概述1.1 CSP-J/S认证1.1.1 证书含金量&#xff1a; 2. GESP一级认证内容3. GESP一级认证形式4. 认证时间与报名5. 政策与福利6. 备考建议 1. GESP概述 CCF编程能力等级认证&#xff08;Grade Examination of Software Programming&#xff0c;简称GESP&#xff09…

第3章 Express 的请求与响应(一)

在本章中&#xff0c;我们将详细探讨如何在 Express 中处理 HTTP 请求与响应。这包括解析请求数据、设置响应数据、处理表单数据、使用查询参数等。理解这些内容是开发高效和功能丰富的 Web 应用程序的基础。 1 解析请求数据 在 Express 中&#xff0c;可以通过 req 对象访问…

如何搭建互联网医院系统源码?医疗陪诊APP开发实战详解

今天&#xff0c;小编将为大家讲解如何搭建一个完整的互联网医院系统源码&#xff0c;并介绍医疗陪诊APP的开发实战。 一、互联网医院系统的架构设计 搭建一个完整的互联网医院系统&#xff0c;需要从架构设计开始。一个典型的互联网医院系统通常包含以下几个核心模块&#xf…

iPhone 16 Pro系列将标配潜望镜头:已开始生产,支持5倍变焦

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 7月6日消息&#xff0c;据DigiTimes最新报道&#xff0c;苹果将在iPhone 16 Pro中引入iPhone 15 Pro Max同款5倍光学变焦四棱镜潜望镜头。 报道称&#xff0c;目前苹果已经将模组订单交至大立光电和玉…

fortran简单排序算法,对一维、二维矩阵进行正序或倒序排序

fortran简单排序算法&#xff0c;对一维、二维矩阵进行正序或倒序排序 0. 引言1. 算法实现1.1 一维数组排序1.2 二维数组排序1.2 module文件 2. 结语 0. 引言 排序算法是计算机科学中的一项重要技术&#xff0c;它将一组数据按照特定的顺序排列起来。排序算法有很多种&#xff…

【STM32项目】基于嵌入式智能网控微嵌式远距操控平台(完整工程资料源码)

基于嵌入式智能网控微嵌式远距操控平台 目录&#xff1a; 前言: 一、项目前景调研 1.1 研究背景及意义 1.2 国内外发展现状及趋势 1.2.1 国内现状 1.2.2 国外发展现状 1.2.3 发展趋势 二、什么是嵌入式&#xff1f; 2.1 嵌入式系统概述 2.2 嵌入式系统的组成 2.3 嵌入式操作系统…

二分查找和斐波那契查找

这里写自定义目录标题 二分查找斐波那契查找二分查找改进B二分查找改进C 二分查找 int binSearch(int* arr, int lo, int hi,int target) {while (lo < hi){int mid lo ((hi - lo) >> 1);if (arr[mid] > target) hi mid;else if (arr[mid] < target) lo mi…

链路追踪系列-02.演示zipkin

当本机启动docker es zipkinServer之后&#xff1a; 启动3个项目&#xff1a;先eureka-server&#xff0c;再 PaymentMain8001,… 浏览器打开&#xff1a;http://localhost:9001/consumer/payment/zipkin consumer代码 &#xff1a; provider: 此时查询es:

html5——列表、表格

目录 列表 无序列表 有序列表 自定义列表 表格 基本结构 示例 表格的跨列 表格的跨行 列表 无序列表 <ul>【声明无序列表】 <li>河间驴肉火烧</li>【声明列表项】 <li>唐山棋子烧饼</li> <li>邯郸豆沫</li> <l…

香橙派AIpro:体验强劲算力,运行ROS系统

文章目录 前言一、香橙派AIpro开箱及功能介绍1.1香橙派AIpro开箱1.2香橙派AIpro功能介绍 二、香橙派AIpro资料下载及环境搭建2.1资料下载2.2环境搭建2.3使用串口启动进入开发板2.4使用HDMI线接入屏幕启动 三、部署ROS系统四、香橙派AIpro的使用和体验感受 前言 本篇文章将带体…

升级到LVGL9的一些变化(后续发现再补充)

目录 一、主要内容 二、新增内容 三、常规API变化 四、Display API(显示API) 五、其他 最近在将LVGL8的demo代码升级到LVGL9,带来不小的变化 ,收集网上的一些内容,整理如下: 一、主要内容 二、新增内容 三、常规API变化 四、Display API(显示API)

3.4、matlab实现SGM/BM/SAD立体匹配算法计算视差图

1、matlab实现SGM/BM/SAD立体匹配算法计算视差图简介 SGM&#xff08;Semi-Global Matching&#xff09;、BM&#xff08;Block Matching&#xff09;和SAD&#xff08;Sum of Absolute Differences&#xff09;都是用于计算立体匹配&#xff08;Stereo Matching&#xff09;的…

python基础语法 005 函数1-2 函数作用域

1 函数续 1.7 函数作用域 1.7.1 全局变量 定义在函数外部的变量全局变量在函数内部和函数外部都可以访问使用 a 100 def run():print("a {}".format(a))print(a) print(run())1.7.2 局部变量 函数是一个黑盒子&#xff0c;外面看不到盒子里面的东西&#xff0…

vue-router history 模式下将所有资源文件js/css/img都存放在oss 利用 cdn 访问整体思路汇总

背景 我们有一个域名https://example.com&#xff0c;但是ssl证书很贵&#xff0c;搞子域名来承接新站点有点费钱&#xff0c;所以我们想用一个目录https://example.com/admin/ 来作为管理后台的站点&#xff0c;这个站点是单页面应用&#xff0c;我又想让其用history router的…

AI为ToB企业节省大量隐性成本

前些天&#xff0c;在向朋友介绍“客户在哪儿AI”时&#xff0c;我着重说了它效果最为显著的两个功能&#xff0c;即&#xff0c;为ToB企业指明在哪儿能准确的找到客户和该场景下的最佳营销策略&#xff0c;以及深入洞察竞争对手并找到最佳竞争策略。 当我说完这两个核心功能的…

各向异性含水层中地下水三维流基本微分方程的推导(二)

各向异性含水层中地下水三维流基本微分方程的推导 参考文献&#xff1a; [1] 刘欣怡,付小莉.论连续性方程的推导及几种形式转换的方法[J].力学与实践,2023,45(02):469-474. 书接上回&#xff1a; 我们能得到三个方向的流入流出平衡方程&#xff1a; ∂ ρ u x ∂ x d x d y d…

YOWOv2(yowov2)动作识别+Fastreid身份识别 详细安装与实现

首先yowov2是一款简单且实时的时空动作检测方案&#xff0c;fastreid是行人重识别&#xff08;身份识别&#xff09; yowov2介绍链接直达fastreid链接直达为时空动作检测任务设计实时框架仍然是一个挑战。YOWOv2 提出了一种新颖的实时动作检测框架&#xff0c;利用三维骨干和二…

[web]-sql注入-白云搜索引擎

ctrlu查看源代码&#xff0c;发现前端有js过滤 <script>function myFunction(){var xdocument.getElementById("number").value;var adocument.getElementById("word").value;var ba.replace(/[\ |\~|\|\!|\|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\|\…

如何写论文的讨论和结论部分,提升审稿通过率300%?(附例句模版)

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 关于论文讨论Discussion部分的撰写&#xff0c;娜姐之前写过几篇文章&#xff1a; 1 Discussion讨论部分被3个审稿人说没深度没逻辑&#xff0c;用这个AI工具三步拯救了我&am…

【ingress-nginx】安装配置及Helm工具安装

【ingress-nginx】安装配置及Helm工具安装 安装时候需要用到一个工具——Helm【相当于linux中的yum工具】。 一&#xff0c;Helm安装 官网&#xff1a;https://helm.sh/docs/intro/install # 下载 wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz# 解压 tar -zxv…