【Qt】深入探索Qt窗口与对话框:从创建到管理:QDockWidget(浮动窗口)、QDialog(对话框)

文章目录

  • 前言:
  • 1. 浮动窗口
  • 2. 对话框介绍
    • 2.1. 示例:主窗口中,通过点击按钮,弹出一个新的对话框。
    • 2.2. 创建自定义对话框
      • 2.2.1. 纯代码的方式
      • 2.2.2. 图形化界面的方式
  • 3. 模态对话框 和 非模态对话框
  • 4. Qt 内置对话框
    • 4.1. 消息对话框 QMessageBox
    • 4.2. 颜色对话框 QColorDialog
    • 4.3. 文件对话框 QFileDialog
    • 4.4. 字体对话框 QFontDialog
    • 4.5. 输入对话框 QInputDialog
  • 总结:

前言:

在现代软件开发中,图形用户界面(GUI)的设计和实现是至关重要的一环。Qt,作为一个功能强大且跨平台的C++图形用户界面库,提供了丰富的组件和工具,使得开发者能够快速构建具有专业外观和感觉的应用程序。本文将深入探讨Qt中窗口和对话框的创建与管理,包括浮动窗口、对话框的介绍、模态与非模态对话框的区别,以及Qt内置的多种对话框类型。通过详细的代码示例和解释,本文旨在帮助Qt开发者更好地理解和应用这些GUI组件,以提升应用程序的用户体验和交互性。

1. 浮动窗口

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

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDockWidget>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>

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); // 由于 dockWidget 中只能包含一个 QWidget,
                                     // 要想添加更多的控件就只能往 QWidget 中进行添加了。(多套一层)
                                    // 为啥要这么设定,也有点不可考了,按理说,直接让 dockWidget 能添加更多的元素是合适的设定

    // 创建布局管理器,把布局管理器 设置到 QWidget 中
    QVBoxLayout* layout = new QVBoxLayout;
    container->setLayout(layout);

    // 创建其它控件添加到 layout 中
    QLabel* label = new QLabel("这是一个 QLabel");
    QPushButton* button = new QPushButton("这是一个按钮");
    layout->addWidget(label);
    layout->addWidget(button);

    // 设置浮动窗口允许停靠的位置
    dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::TopDockWidgetArea);
}

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

Qt::LeftDockWidgetArea 停靠在左侧
Qt::RightDockWidgetArea 停靠在右侧
Qt::TopDockWidgetArea 停靠在顶部
Qt::BottomDockWidgetArea 停靠在底部
Qt::AllDockWidgetAreas 以上四个位置都可停靠
在这里插入图片描述

2. 对话框介绍

对话框是 GUI 程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框
中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt常
用的内置对话框有:QFiledialog(文件对话框)、QColorDialog(颜色对话框)、QFontDialog
(字体对话框)、QInputDialog (输入对话框)和 QMessageBox(消息框) 。
在这里插入图片描述
Qt 中使用 QDailog 表示对话框
针对一个已有的项目,也可以创建一些类,继承自 QDialog 实现咱们一些自定义的对话框!

总体来时,基于 QDialog 作为父类创建出来的程序窗口和之前通过 QWidget 创建出来的窗口时非常相似的。

实际开发中,更多的情况,往往不是直接在创建的时候继承自 QDialog, 而是在代码中,创建额外的类,让额外的类继承自 QDailog

2.1. 示例:主窗口中,通过点击按钮,弹出一个新的对话框。

QDialog 其实也是 QWidget 的子类, QWidget 的各种属性方法, QDialog 也能使用。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDialog>

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

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


void MainWindow::on_pushButton_clicked()
{
    QDialog* dialog = new QDialog(this);
    dialog->setWindowTitle("对话框的标题");
    // 设置对话框尺寸
    dialog->resize(400, 300);
    // 通过 show 方法就能显示出对话框
    dialog->show();
}

在这里插入图片描述

注意:不同界面上的其它控件,此处 QDialog 每次按下按钮,都会创建一个新的 QDialog 对象,并进行显示。
每次点击都会创建新的对话框对象!

QDialog* dialog = new QDialog(this); 

一个程序运行过程中,可以有无数次点击这个按钮,进一步的就产生了无数个这样的对象了!(内存泄漏。)
确实,是把父元素 this, QMainWindow 被销毁的时候,此时 QDialog 是会随之销毁 ,但是架不住QDialog 会再 QMainWindow 之前就存在很多个(就怕你这一个对象占用内存很多,或者你的机器本身剩余的内存很少呢(嵌入式系统))

void MainWindow::on_pushButton_clicked()
{
    QDialog* dialog = new QDialog(this);
    dialog->setWindowTitle("对话框的标题");
    // 设置对话框尺寸
    dialog->resize(400, 300);
    // 通过 show 方法就能显示出对话框
    dialog->show();

    delete dialog;
}

如果把 delete 放到这里,很明显,对话框就会一闪而过。

正确的做法,应该是让用户点击 对话框 关闭按钮的时候,再来触发 delete 操作。

dialog->setAttribute(Qt::WA_DeleteOnClose);

只要给 dialog 设置上上述属性,此时就会在关闭的时候自动进行 delete, Qt 内置的功能。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>

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

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


void MainWindow::on_pushButton_clicked()
{
    QDialog* dialog = new QDialog(this);
    dialog->setWindowTitle("对话框的标题");
    // 设置对话框尺寸
    dialog->resize(400, 300);
    // 通过 show 方法就能显示出对话框
    dialog->show();

    // delete dialog; //窗口只会一闪而过
    // 正确做法应该式把 delet 和关闭按钮的信号给关联起来
    // 在用户点击关闭的时候, 触发 delete
    // Qt 为了让咱们写的方便,直接给 QDialog 设置了一个属性,可以通过属性,完成上述效果
    dialog->setAttribute(Qt::WA_DeleteOnClose);
}

2.2. 创建自定义对话框

要想自定义对话框,就需要继承自 QDialog 创建类。
1)纯代码的方式来自定义 QDialog 界面
2)通过图形化界面的方式

2.2.1. 纯代码的方式

创建一个C++类:
在这里插入图片描述
指定QDialog 为父类:
在这里插入图片描述
Add Q_OBJECT,让其可以使用信号槽。

// dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QWidget>
#include <QDialog>

class Dialog : public QDialog
{
    Q_OBJECT
public:
    Dialog(QWidget* parent); // QWidget* parent:加到对象树上

    void handle();
};

#endif // DIALOG_H
// dialog.cpp
#include "dialog.h"
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>

Dialog::Dialog(QWidget* parent) : QDialog(parent)
{
    // 创建一些控件,加入到 Dialog 中。(以 Dialog 作为父窗口)

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

    QLabel* label = new QLabel("这是一个对话框", this);
    QPushButton* button = new QPushButton("关闭", this);

    layout->addWidget(label);
    layout->addWidget(button);

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

void Dialog::handle()
{
    this->close();
}
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"

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

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


void MainWindow::on_pushButton_clicked()
{
    Dialog* dialog = new Dialog(this);
    dialog->resize(400, 300);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->show();
}

在这里插入图片描述

2.2.2. 图形化界面的方式

关键操作,是创建出一个新的 ui 文件出来
在这里插入图片描述
这个操作是,创建出一个 ui文件及其对应的类
在这里插入图片描述
在这里插入图片描述

// dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"

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

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

void Dialog::on_pushButton_clicked()
{
    this->close();
}
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"

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

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


void MainWindow::on_pushButton_clicked()
{
    // 弹出一个自定义对话框了
    Dialog* dialog = new Dialog(this);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->show();
}

3. 模态对话框 和 非模态对话框

model bool
模态 / 非模态

模态:弹出对话框中的时候,此时用户无法操作父窗口,必须得完成对话框内部的操作,关闭对话框之后,才能操作父窗口。(用于特别关键的场合,用户必须做出决策)
非模态:弹出对话框的时候,用户可以操作父窗口。(其它不是特别重要的场景)
在这里插入图片描述

非模块可以点击出很多的窗口。
前面几个代码,都是“非模态”对话框。
如何产生模态对话框?
dialog->show(); 换成 dialog->exec(); 即可

4. Qt 内置对话框

Qt 提供了多种可复用的对话框类型,即 Qt 标准对话框。Qt 标准对话框全部继承于 QDialog。常用标准对话框如下:
在这里插入图片描述

4.1. 消息对话框 QMessageBox

QMessageBox 用来显示一个消息给用户,并且让用户进行一个简单的选则

Qt 内置的图标类型:

enum Icon {
    // keep this in sync with QMessageDialogOptions::Icon
    NoIcon = 0,
    Information = 1,
    Warning = 2,
    Critical = 3,
    Question = 4
};

Qt 内置的按钮类型:

enum StandardButton {
    // keep this in sync with QDialogButtonBox::StandardButton and QPlatformDialogHelper::StandardButton
    NoButton           = 0x00000000,
    Ok                 = 0x00000400,
    Save               = 0x00000800,
    SaveAll            = 0x00001000,
    Open               = 0x00002000,
    Yes                = 0x00004000,
    YesToAll           = 0x00008000,
    No                 = 0x00010000,
    NoToAll            = 0x00020000,
    Abort              = 0x00040000,
    Retry              = 0x00080000,
    Ignore             = 0x00100000,
    Close              = 0x00200000,
    Cancel             = 0x00400000,
    Discard            = 0x00800000,
    Help               = 0x01000000,
    Apply              = 0x02000000,
    Reset              = 0x04000000,
    RestoreDefaults    = 0x08000000,

    FirstButton        = Ok,                // internal
    LastButton         = RestoreDefaults,   // internal

    YesAll             = YesToAll,          // obsolete
    NoAll              = NoToAll,           // obsolete

    Default            = 0x00000100,        // obsolete
    Escape             = 0x00000200,        // obsolete
    FlagMask           = 0x00000300,        // obsolete
    ButtonMask         = ~FlagMask          // obsolete
};
void MainWindow::on_pushButton_clicked()
{
    // 创建 QMessageBox
    QMessageBox* messageBox = new QMessageBox(this);
    messageBox->setWindowTitle("对话框窗口标题");
    messageBox->setText("这是对话框的文本");
    messageBox->setIcon(QMessageBox::Warning);
    messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);

    // 非模态的弹窗, QMessageBox 使用场景更多是模态的
    // messageBox->show(); // 非模态的
    // 弹出模态对话框, 当对话框处于弹出状态的时候,代码就会在 exec 这一直阻塞,只到对话框被关闭
    messageBox->exec(); // 模态的

    // delete messageBox; //因为模态的被阻塞住了,所以可以使用delete 而不会一闪而过
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
}

在这里插入图片描述

  • 如果想自定义按钮呢?
    在这里插入图片描述
    在这里插入图片描述
    标准按钮可以用 exec() 返回值来进行操作,自定义按钮就只能使用 connect 来连接信号槽了!
void MainWindow::on_pushButton_clicked()
{
    // 创建 QMessageBox
    QMessageBox* messageBox = new QMessageBox(this);
    messageBox->setWindowTitle("对话框窗口标题");
    messageBox->setText("这是对话框的文本");
    messageBox->setIcon(QMessageBox::Warning);

    // 在标准按钮中,根本没有办法进行信号槽的连接(按钮是 QMessageBox 自己生成的)
    messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);

    // 自定义按钮
    QPushButton* button = new QPushButton("按钮", messageBox);
    messageBox->addButton(button, QMessageBox::AcceptRole);
    // connect 连接信号槽,来针对当前点击的按钮来进行一些相关操作


    // 非模态的弹窗, QMessageBox 使用场景更多是模态的
    // messageBox->show(); // 非模态的
    // 弹出模态对话框, 当对话框处于弹出状态的时候,代码就会在 exec 这一直阻塞,只到对话框被关闭
    // 用户点击按钮,使对话框关闭之后,此时就能通过 exec 的返回值,来知道用户点击的哪个按钮,从而执行一些对应的逻辑了
    int result = messageBox->exec(); // 模态的
    if (result == QMessageBox::Ok) {
        qDebug() << "Ok";
    } else if (result == QMessageBox::Save) {
        qDebug() << "Save";
    } else if (result == QMessageBox::Cancel) {
        qDebug() << "Cancel";
    }

    // delete messageBox; //因为模态的被阻塞住了,所以可以使用delete 而不会一闪而过
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
}

其实还有更便捷的方法:

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";
    }
}

在这里插入图片描述

下面这些类型都可以用:

NoIcon = 0,
Information = 1,
Warning = 2,
Critical = 3,
Question = 4

4.2. 颜色对话框 QColorDialog

颜色对话框的功能是允许用户选择颜色。继承自 QDialog 类。颜色对话框如下图示:
Qt内置了颜色板的功能
getColor() 这个函数就能弹出一个模态框,用户选择颜色之后,点击确定后,对话框关闭,getColor 返回的值就是用户选择的颜色!
getColor(): 它是一个静态函数,static, QMessageBox::warning, 不必创建对话框对象,就可以直接使用!

void MainWindow::on_pushButton_clicked()
{
//    QColorDialog* dialog = new QColorDialog(this);
//    dialog->exec(); // 不常用
//    delete dialog;

    // 函数的返回值就是用户的颜色
    QColor color = QColorDialog::getColor(QColor(0, 255, 0), this, "选择颜色");
    qDebug() << color;

    // 可以基于用户选择的颜色,修改窗口的背景色
    // 可以通过 QSS 的方式设置背景色
    QString style = "background-color: rgb(" + QString::number(color.red()) + ", " + QString::number(color.green())
                + ", " + QString::number(color.blue()) + ");";
    // 或者使用 sprintf() 进行拼接
    char style2[1024] = {0};
    sprintf(style2, "background-color: rgb(%d, %d, %d)", color.red(), color.green(), color.blue());

    this->setStyleSheet(style2);
}

在这里插入图片描述
在这里插入图片描述
这里的ARGB,中的A标示的是不透明度,后面的RGB值用小数表示。

4.3. 文件对话框 QFileDialog

通过 QFileDialog 可以选择一个文件,能够获取到这个文件的路径。
打开文件 / 保存文件
getOpenFileName / getSaveFileName

void MainWindow::on_pushButton_clicked()
{
    QString filePath = QFileDialog::getOpenFileName(this);
    qDebug() << filePath;
}

void MainWindow::on_pushButton_2_clicked()
{
    QString filePath = QFileDialog::getOpenFileName(this);
    qDebug() << filePath;
}

在这里插入图片描述

在这里插入图片描述
还可以设置过滤器的。

在此处,仅仅只是将文件的地址打印出来,但是实际上此处的 打开 / 保存 这里这里的功能是需要额外去实现的!并不是说直接一按保存就真的保存了。

4.4. 字体对话框 QFontDialog

Qt 中提供了预定义的字体对话框类 QFontDialog,⽤于提供选择字体的对话框部件。

void MainWindow::on_pushButton_clicked()
{
    bool ok = false;
    QFont font = QFontDialog::getFont(&ok);
    qDebug() << "ok = " << ok;
    qDebug() << font;
    qDebug() << font.family();
    qDebug() << font.pointSize();
    qDebug() << font.bold();
    qDebug() << font.italic();

    // 把选择的字体设置到按钮上
    ui->pushButton->setFont(font);
}

在这里插入图片描述

当用户这里设置好了属性并且点击 OK 的时候,函数就返回一个 QFont 对象。
在这里插入图片描述

4.5. 输入对话框 QInputDialog

Qt 中提供了预定义的输入对话框类:QInputDialog,用于进行临时数据输入的场合。
这个数据可以是整数,可以是浮点数,还可以字符串。(以类似于下拉框的方式让用户选择)
QInputDialog 提供了几个静态函数:
getDoublegetIntgetItem

void MainWindow::on_pushButton_clicked()
{
    int result =  QInputDialog::getInt(this, "整数输入对话框:", "请输入一个整数:");
    qDebug() << result;
}

void MainWindow::on_pushButton_2_clicked()
{
    double result = QInputDialog::getDouble(this, "浮点数输入对话框", "请输入一个浮点数");
    qDebug() << result;
}

void MainWindow::on_pushButton_3_clicked()
{
    QStringList items;
    items.push_back("111");
    items.push_back("222");
    items.push_back("333");
    items.push_back("444");
    QString item = QInputDialog::getItem(this, "条目输入:", "请输入条目", items);
    qDebug() << item;
}

在这里插入图片描述

总结:

本文详细介绍了Qt中窗口和对话框的创建和管理方法。首先,我们探讨了浮动窗口的创建,通过QDockWidget类动态生成,并展示了如何添加控件和设置停靠位置。接着,文章深入介绍了对话框的概念和使用,包括如何通过QPushButton触发对话框的弹出,以及如何创建自定义对话框,无论是通过纯代码方式还是图形化界面的方式。此外,文章还区分了模态对话框和非模态对话框,并解释了它们适用的不同场景。

在Qt内置对话框的部分,文章逐一介绍了QMessageBox、QColorDialog、QFileDialog、QFontDialog和QInputDialog等对话框的用途和实现方法。每个对话框都提供了特定的功能,如消息提示、颜色选择、文件操作、字体选择和数据输入,极大地丰富了应用程序的交互性。通过使用这些内置对话框,开发者可以避免重复造轮子,同时确保应用程序的用户界面保持一致性和专业性。

最后,文章还提到了Qt窗口程序中的其他重要组件,如菜单栏、工具栏、子窗口和状态栏,这些都是构建一个完整应用程序不可或缺的部分。通过本文的学习,Qt开发者应该能够更加熟练地运用Qt提供的各种工具和组件,创建出既美观又实用的GUI应用程序。

Qt 窗口程序

  1. 菜单栏(QMenuBar) => 菜单(QMenu)=>菜单项(QAction)
  2. 工具栏(QToolBar)(具有多个) => 菜单项(QAction)
  3. 子窗口(QDockWidget)=> QWidget => 放置其它控件
  4. 状态栏(QStatusBar)=> QWidget
  5. 对话框(QDialog)=> 自己手动继承的方式,针对 QDialog 进行扩展 QMessageBox、QFileDialog、QColorDialog、QFontDialog、QInputDialog

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

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

相关文章

创新实训2024.05.26日志:落地基于硬盘的数据库服务

1. 需求任务列表 以下描述易学大模型软件的web应用的功能。 用户注册 用户邮箱&#xff0c;密码&#xff0c;验证码开启官方邮箱&#xff0c;用来发验证码&#xff08;QQ 网易都支持开启smtp协议&#xff0c;找教程&#xff0c;用邮箱不用手机号是为了省买发短信云服务的钱&a…

【软件设计师】先导

一、考试科目&#xff1a; 上午&#xff1a;计算机与软件工程知识&#xff0c;考试时间150min&#xff0c;75空单选题&#xff08;不一定一题一空&#xff09; 下午&#xff1a;软件设计&#xff0c;考试时间150分钟&#xff0c;问答题&#xff0c;6道只做5大题&#xff08;前四…

Nginx 的原理解析 worker 配置及相关问题 -细节狂魔

文章目录 前言Nginx 的最基本的执行过程&#xff08;master & worker&#xff09;worker 是如何进行工作的 一个 master 和 多个 woker 有哪些好处1、可以使用 nginx 热部署2、节省资源 && worker 进程之间互不影响 && nginx 服务不会中断 woker 设置多少才…

简单美观易上手的 Docker Compose 可视化管理器 Dockge

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 Dockge 是 Uptime Kuma 作者的新作品&#xff0c;因此 UI 风格与 Uptime Kuma 基本一致&#xff0c;如果你正在使用 Uptime Kuma 的话&#xff0c;那么 Dockge 的 UI 设计应该也不会让你失望。Dockge 主打…

java人口老龄化社区服务与管理平台源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的人口老龄化社区服务与管理平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 人口老龄化…

MySql基础(一)--最详细基础入门,看完就懂啦(辛苦整理,想要宝宝的赞和关注嘻嘻)

前言 希望你向太阳一样&#xff0c;有起有落&#xff0c;不失光彩~ 一、数据库概述 1. 什么是数据库 数据库就是存储数据的仓库&#xff0c;其本质是一个文件系统&#xff0c;数据按照特定的格式将数据存储起来&#xff0c;用户可以对数据库中的数据进行增加&#xff0c;修改&…

Spring中的Aware接口

Spring中的Aware接口 Aware接口介绍 Aware是Spring中的接口&#xff0c;它的作用是可以让Bean获取到运行环境的相关信息。比如获取到上下文、Bean在容器中的名称等。 Spring中提供了很多Aware接口的子类&#xff0c;具体如下&#xff1a; 常用接口的作用如下&#xff1a; …

制作电子画册速成攻略,快来试试

​当今社会&#xff0c;数字媒体日益普及&#xff0c;电子画册作为一种崭新的展示方式&#xff0c;受到了越来越多人的青睐。它不仅形式新颖&#xff0c;互动性强&#xff0c;而且制作起来也并不复杂。想知道如何快速掌握制作电子画册的技巧吗&#xff1f;我来教你吧。 接下来&…

YOLO 学习和使用 (重拾机器学习)

contents a nenrons 单层神经网络 多层神经网络 CNN (Convolutional Neural Network) YOLO 5.1. YOLO(you only look once) 5.2. predict stage: 置信度 * 类别条件概率 全概率非极大值抑制&#xff0c;通过IOU 指数进行实现每个 grid cell 生成两个预测 bounding box 无…

呆马科技----构建智能可信的踏勘云平台

近年来&#xff0c;随着信息技术的快速发展&#xff0c;各个行业都在积极探索信息化的路径&#xff0c;以提升工作效率和服务质量。智慧踏勘云平台是基于区块链和大数据技术构建的全流程智慧可信踏勘解决平台。平台集远程视频、数据显示、工作调度、过程记录为一体&#xff0c;…

【图解IO与Netty系列】IO多路复用

IO多路复用 为什么要使用IO多路复用Linux的IO多路复用接口selectpollepoll 为什么要使用IO多路复用 我们常用的IO模型是BIO&#xff0c;我们Java里的IO流大多数都是BIO&#xff0c;也就是同步阻塞式IO&#xff0c;这种IO操作的好处是简单方便&#xff0c;但是缺点也很明显——…

【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【00】补充

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【00】补充 WindowsCMD插件IDEAVsCode MavenvagrantDocker解决MySQL连接慢问题启动&#xff08;自动&#xff09;Docker注意切换到root用户远程访问MySQL MyBatisPlus代码地址参考 WindowsC…

vs2013使用qt Linguist以及tr不生效问题

一、qt Linguist&#xff08;语言家&#xff09;步骤流程 1、创建翻译文件,在qt选项中 2.选择对应所需的语言&#xff0c;得到.ts后缀的翻译文件 3.创建.pro文件&#xff0c;并将.ts配置在.pro文件中 3.使用qt Linguist 打开创建好的以.ts为后缀的翻译文件&#xff0c;按图所示…

YOLOv10 | 手把手教你利用yolov10训练自己数据集(含环境搭建 + 参数解析 + 数据集查找 + 模型训练、推理、导出)

一、前言 本文内含YOLOv10网络结构图 各个创新模块手撕结构图 训练教程 推理教程 参数解析 环境搭建 数据集获取等一些有关YOLOv10的内容&#xff01; 目录 一、 前言 二、整体网络结构图 三、空间-通道分离下采样 3.1 SCDown介绍 3.2 C2fUIB介绍 3.3 PSA介绍 …

Java核心: 脚本引擎和动态编译

静态语言和动态语言的在相互吸收对方的优秀特性&#xff0c;取人之长补己之短。脚本引擎和动态编译就是其中一个关键特性&#xff0c;扩展了Java的能力边界。这一篇我们主要讲两个东西: ScriptEngine&#xff0c;执行脚本语言代码&#xff0c;如JavaScript、Groovy JavaCompile…

P459 包装类Wrapper

包装类的分类 1&#xff09;针对八种基本数据类型相应的引用类型——包装类。 2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 Boolean包装类 Character包装类 其余六种Number类型的包装类 包装类和基本数据类型的相互转换 public class Integer01 {publi…

关于数据库和数据表的基础SQL

目录 一. 数据库的基础SQL 1. 创建数据库 2. 查看当前有哪些数据库 3. 选中数据库 4. 删除数据库 5. 小结 二. 数据表的基础SQL 1. 创建数据表 2. 查看当前数据库中有哪些表 3. 查看指定表的详细情况(查看表的结构) 4. 删除表 5. 小结 一. 数据库的基础SQL 1. 创建…

Redis篇 redis基本命令和定时器原理

基本命令和定时器原理 一. exists命令二. del命令三. Expire命令四. ttl命令五. redis的过期策略六. 定时器的两种设计方式七. type命令 一. exists命令 用来判断key的值是否存在 返回值是key的个数 这样写的话&#xff0c;有没有什么区别呢&#xff1f; 效率变低&#xff0c;消…

用例篇

弱网测试 弱网测试的目的是尽可能保证用户体验&#xff0c;关注的关键点包括&#xff1a; 页面响应时间是否可以接受&#xff0c;关注包括哦热启动、冷启动时间、页面切换、前后台切换、首字时间&#xff0c;首屏时间等。页面呈现是否完成一致。超时文案是否符合定义&#xf…

YoloV1模型

You Only Look Once 文章目录 You Only Look Once置信度定义类别条件概率NMSnp.maxmiumnp.argsort() Yolov1直接采用网络特征输出&#xff0c;实现置信度预测、分类、边界框回归&#xff1b; 核心内容总结&#xff1a; 输入图像划分为 S S 网格。如果对象的中心落入网格单元中…