Qt - 窗口

目录

1. 前言

2. 菜单栏(QMenuBar)

2.1. 创建菜单栏

2.1.1. 方式一

2.1.2. 方式二

2.2. 在菜单栏中添加菜单和创建菜单项

2.3. 在菜单项之间添加分割线

2.4. 综合示例

3. 工具栏(QToolBar)

3.1. 创建工具栏

3.2. 设置停靠位置

3.2.1. 方式一

3.2.2. 方式二

3.3. 设置浮动属性

3.4. 设置移动属性

4. 状态栏(QStatusBar)

4.1. 状态栏的创建

4.2. 在状态栏中显示实时消息

5. 浮动窗口(QDocWidget)

5.1. 浮动窗口的创建

5.2. 设置停靠的位置

6. 对话框(QFiledialog,QColorDialog,QFontDialog,QInputDialog,QMessageBox)

6.1. 模态对话框

6.1.1. 示例1:创建对话框

6.2. 非模态对话框

6.2.1. 示例1:

6.3. 消息对话框(QMessageBox)

6.3.1. 示例1:问题提示消息对话框

6.4. 颜色对话框(QColorDialog)

6.4.1. 示例1:

6.5. 文件对话框(QFileDialog)

6.5.1. 示例1:打开文件

6.6. 字体对话框(QFontDialog)

6.6.1. 示例1:

6.7. 输入对话框(QInputDialog)

6.7.1. 示例1:浮点型数据输入对话框

7. 小结


1. 前言

Qt窗口时通过QMainWindow类来实现的。

QMainWindow是一个为用户提供主窗口程序的类,继承自QWidget类,并且提供了一个预定义的布局。QMainWindow包含一个菜单栏(menu bar),多个工具栏(tool bars), 多个浮动窗口(dock widgets),一个状态栏(status bar)和一个中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为QMainWindow中各组件所处的位置

2. 菜单栏(QMenuBar)

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

菜单栏包含菜单,菜单中包含菜单项

2.1. 创建菜单栏

2.1.1. 方式一

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

2.1.2. 方式二

在堆上动态创建

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenuBar* menu = new QMenuBar(this);menu->addAction("菜单");menu->addAction("编辑");menu->addAction("视图");menu->addAction("关于");this->setMenuBar(menu);
}

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

2.2. 在菜单栏中添加菜单和创建菜单项

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

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenuBar* menu = new QMenuBar(this);// 创建菜单QMenu* m1 = new QMenu("文件");QMenu* m2 = new QMenu("编辑");// 将菜单添加到菜单栏上menu->addMenu(m1);menu->addMenu(m2);// 创建菜单项QAction* action = new QAction("打开文件夹");QAction* action1 = new QAction("save");// 将菜单项添加到菜单上m1->addAction(action);m2->addAction(action1);this->setMenuBar(menu);
}

2.3. 在菜单项之间添加分割线

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

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenuBar* menu = new QMenuBar(this);QMenu* m1 = new QMenu("文件");QMenu* m2 = new QMenu("编辑");menu->addMenu(m1);menu->addMenu(m2);QAction* action = new QAction("打开文件夹");QAction* action1 = new QAction("save");m1->addAction(action);m1->addSeparator(); // 在action和action1中间添加分割线m1->addAction(action1);this->setMenuBar(menu);
}

2.4. 综合示例

  1. 新建Qt项目(基类选择QMainWindow)

  2. 在mainwindow.cpp文件中创建菜单和中央空间
    创建一个菜单栏,一个菜单。两个菜单项:保存和加载。创建一个QTextEdit作为窗口的中央空间
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);// 创建中央控件QTextEdit* edit = new QTextEdit(this);this->setCentralWidget(edit);edit->setPlaceholderText("此处编写文本内容...");}
  1. 给action添加一些动作
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QTextEdit>
#include <QFileDialog>
#include <QDebug>
#include <fstream>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("此处编写文本内容...");connect(action1, &QAction::triggered, this, &MainWindow::save);connect(action2, &QAction::triggered, this, &MainWindow::load);
}MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::save() {QFileDialog* dialog = new QFileDialog(this);QString fileName = dialog->getSaveFileName(this, "保存文件","C:/User/1/");qDebug() << "file name" <<  fileName;std::ofstream file(fileName.toStdString().c_str());if (!file.is_open()) {qDebug() << "save file";return;}const QString& text = edit->toPlainText();file << text.toStdString();file.close();
}void MainWindow::load() {QFileDialog* dialog = new QFileDialog(this);QString fileName = dialog->getOpenFileName(this, "load file", "C:/Users/1/");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);}

执行程序就可以保存文件和加载文件了。

3. 工具栏(QToolBar)

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

3.1. 创建工具栏

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

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

3.2. 设置停靠位置

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

3.2.1. 方式一

创建工具栏的同时指定停靠的位置。

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

Qt::LeftToolBarArea

停靠在左侧

Qt::RightToolBarArea

停靠在右侧

Qt::TopToolBarArea

停靠在顶部

Qt::BottomToolBarArea

停靠在底部

Qt::AllToolToolBarArea

以上四个位置都可以停靠

    QToolBar* toolBar1 = new QToolBar(this);QToolBar* toolBar2 = new QToolBar(this);this->addToolBar(Qt::LeftToolBarArea,toolBar1);this->addToolBar(Qt::RightToolBarArea,toolBar2);

3.2.2. 方式二

使用QToolBar类提供的setAllowedAreas()函数设置停靠位置

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

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

3.3. 设置浮动属性

⼯具栏的浮动属性可以通过 QToolBar类 提供的setFloatable()函数来设置。setFloatable()函数原型为:
void setFloatable(boolfloatable)
参数:true:浮动
false:不浮动

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

3.4. 设置移动属性

设置⼯具栏的移动属性可以通过QToolBar类提供的setMovable()函数来设置。setMovable()函数
原型为:
void setMovable(boolmovable)
参数:true:移动
false:不移动

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

QToolBar* toolBar1 = new QToolBar(this);QToolBar* toolBar2 = new QToolBar(this);this->addToolBar(Qt::LeftToolBarArea, toolBar1);this->addToolBar(Qt::RightToolBarArea,toolBar2);//    toolBar1->setAllowedAreas();
//    toolBar2->setAllowedAreas();toolBar1->setMovable(true);toolBar2->setMovable(false);

4. 状态栏(QStatusBar)

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

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

4.1. 状态栏的创建

状态栏的创建是通过QMainWindow类提供的statusBar()函数来创建的。

4.2. 在状态栏中显示实时消息

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

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QStatusBar *status = this->statusBar();setStatusBar(status);QLabel *label = new QLabel("提示信息", this);status->addWidget(label);}


调整显示消息的位置

    QLabel *label2 = new QLabel("右侧提示信息", this);status->addPermanentWidget(label2);

5. 浮动窗口(QDocWidget)

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

5.1. 浮动窗口的创建

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

    // 浮动窗口QDockWidget* dockwidget = new QDockWidget("浮动窗口", this);// 将浮动窗口置于当前窗口中addDockWidget(Qt::BottomDockWidgetArea, dockwidget);


MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 浮动窗口QDockWidget* dockwidget = new QDockWidget("浮动窗口", this);// 将浮动窗口置于当前窗口中addDockWidget(Qt::BottomDockWidgetArea, dockwidget);// 浮动窗口也是可以设置标题的dockwidget->setWindowTitle("这是浮动窗口");// 给浮动窗口内部,添加一些其他的控件// 不能直接给这个浮动窗口添加子控件,而是需要创建出一个单独的QWidget,把要添加的控件加入到QWidget中。// 然后再把这个QWidget设置到dockWidget中QWidget* container = new QWidget();dockwidget->setWidget(container);// 创建布局管理器,把布局管理器设置到QWidget中QVBoxLayout* layout = new QVBoxLayout;container->setLayout(layout);// 创建其他控件添加到layout中QLabel* label = new QLabel("这是一个QLabel");QPushButton* btn = new QPushButton("这是按钮");layout->addWidget(label);layout->addWidget(btn);
}

5.2. 设置停靠的位置

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

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

6. 对话框(QFiledialog,QColorDialog,QFontDialog,QInputDialog,QMessageBox)

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

6.1. 模态对话框

模态对话框是指:显示后无法与父窗口进行交互,是一种阻塞式的对话框。使用QDialog::exec()函数调用。

模态对话框适用于必须依赖用户选择的场合,比如消息显示,文件选择,打印设置等。

6.1.1. 示例1:创建对话框

要想自定义对话框,就需要继承自QDialog创建类(对话框的内存泄漏问题)

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton(this);btn->setText("点击创建对话框");connect(btn,&QPushButton::clicked, this, &MainWindow::push_btn);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::push_btn() {QDialog* dialog = new QDialog(this);dialog->setWindowTitle("对话框标题");// 设置对话框的尺寸dialog->resize(400, 300);dialog->exec();
}

6.2. 非模态对话框

非模态对话框显示后独立存在,可以同时与父窗口进行交互,是一种非阻塞式对话框,使用QDialog::show()函数调用。

非模态对话框一般在堆上创建,这是因为如果创建在栈上时,弹出的非模态对话框就会一闪而过。同时还需要设置Qt::WA_DeleteOnClose属性,目的是:当创建多个非模态对话框时,为了避免内存泄漏要设置此属性。

非模态对话框适用于特殊功能设置的场合,比如查找操作,属性设置等。

6.2.1. 示例1:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QTextEdit>
#include <QFileDialog>
#include <QDebug>
#include <fstream>
#include <QToolBar>
#include <QStatusBar>
#include <QLabel>
#include <QDockWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QDialog>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton(this);btn->setText("点击创建对话框");connect(btn,&QPushButton::clicked, this, &MainWindow::push_btn);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::push_btn() {QDialog* dialog = new QDialog(this);dialog->setWindowTitle("对话框标题");// 设置对话框的尺寸dialog->resize(400, 300);// 通过show党法就可以显示出来对话框dialog->show();/*每次点击都会创建出来一个新的对话框对象,这也就意味着多次点击会产生多个对象,进一步就会产生无数个这样的对象了。这就会产生内存泄漏。虽然吧QDialog的父元素设为this了,在进程退出的时候,会由对象树来释放整个对象,但是如果此时在窗口中点击的多了,(你的机器剩的内存不多了,或者是嵌入式)这就不行了。需要我们手动的把点开的dialog对象给释放了。*/// delete dialog; delete放在这里会一闪而过。// 正确的做法应该是把delete和关闭按钮的点击信号关联起来// 在用户点击关闭的时候,触发delete// Qt给QDialog设置了一个属性,可以通过设置属性,来完成上述效果dialog->setAttribute(Qt::WA_DeleteOnClose);
}

6.3. 消息对话框(QMessageBox)

消息对话框是应用程序中最常用的界面元素。消息对话框主要用于为用户提示重要信息,强制用户进行选择操作。

QMessageBox类中定义了静态成员函数,可以直接调用创建不同风格的消息对话框,其中包括:

Question

⽤于正常操作过程中的提问

Information

⽤于报告正常运⾏信息

Warning

⽤于报告⾮关键错误

Critical

⽤于报告严重错误

6.3.1. 示例1:问题提示消息对话框

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton("消息对话框", this);QMessageBox* msg = new QMessageBox(this);msg->setWindowTitle("Warning Message"); // 设置消息对话框的标题msg->setText("Error Message!"); // 设置消息对话框的内容msg->setIcon(QMessageBox::Question); // 设置消息对话框的类型msg->setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); // 在消息对话框上设置按钮connect(btn, &QPushButton::clicked, [=]() {msg->show();});
}

其中可以设置的按钮的类型如下

6.4. 颜色对话框(QColorDialog)

颜色对话框的功能是允许用户选择颜色。继承自QDialog类。

常用方法介绍

QColorDialog(QWidget* parent = nullptr)

创建对象的同时设置父对象

QColorDialog(const QColor &initial, QWidget *parent = nullptr)

创建对象的同时通过QColor对象设置默认颜⾊和⽗对象

void setCurrentColor(const QColor &color)

设置当前颜⾊对话框

QColor currentColor() const

获取当前颜⾊对话框

QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions())

参数说明:
initial:设置默认颜⾊
parent:设置⽗对象
title:设置对话框标题
options:设置选项

打开颜⾊选择对话框,并返回⼀个QColor对象

void open(QObject *receiver, const char *member)

打开颜⾊对话框

6.4.1. 示例1:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton("颜色对话框", this);QColorDialog* dialog = new QColorDialog(this);connect(btn, &QPushButton::clicked, [=] {QColor color = dialog->getColor(QColor(255, 0, 0));qDebug() << color;});
}

6.5. 文件对话框(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()
)
参数说明:
参数1:parent ⽗亲
参数2:caption 对话框标题
参数3:dir 默认打开的路径
参数4:filter ⽂件过滤器

6.5.1. 示例1:打开文件

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton("文件", this);QFileDialog* file = new QFileDialog(this);connect(btn, &QPushButton::clicked, [=] {QString str = file->getOpenFileName(this,"file","C:\\Users\\Lenovo\\Desktop\\2024-03-26");});
}

6.6. 字体对话框(QFontDialog)

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

6.6.1. 示例1:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton("文件", this);connect(btn, &QPushButton::clicked, [=] {bool flag;QFont font = QFontDialog::getFont(&flag, QFont("华文行楷", 36));// 将char* 转换为QString 的方法, toUtf8().data();qDebug() << "字体:"  << font.family().toUtf8().data();// pointSize() 获取字号qDebug() << "字号:" << font.pointSize();// bold() --- 判断字体是否加粗qDebug() << "是否加粗:" << font.bold();// italic() ---- 判断字体是否倾斜qDebug() << "是否倾斜:" << font.italic();});
}MainWindow::~MainWindow()
{delete ui;
}

6.7. 输入对话框(QInputDialog)

Qt中提供了预定义的输入对话框类:QInputDialog,用于进行临时数据输入的场合

双精度浮点型输⼊数据对话框

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());

整型输⼊数据对话框

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());

选择条⽬型输⼊数据框

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:可供选择的条⽬

6.7.1. 示例1:浮点型数据输入对话框

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton("输入框", this);QInputDialog* input = new QInputDialog(this);connect(btn, &QPushButton::clicked, [=] {double d = input->getDouble(this, "输入框", "浮点型");qDebug() << d;});
}MainWindow::~MainWindow()
{delete ui;
}

7. 小结

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

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

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

相关文章

桥接模式【结构型模式C++】

1.概述 桥接模式是一种结构型设计模式&#xff0c;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。这种类型的设计模式属于结构型模式&#xff0c;它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&am…

go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控

Linux中的tail命令 tail 命令是一个在 Unix/Linux 操作系统上用来显示文件末尾内容的命令。它可以显示文件的最后几行内容&#xff0c;默认情况下显示文件的最后 10 行。tail 命令 非常有用&#xff0c;特别是在我们查看日志文件或者监视文件变化时。 基本用法如下&#xff1a…

Flume在大数据集群下的配置以及监控工具Ganglia的部署安装

前提&#xff1a;需要有三台虚拟机&#xff08;hadoop102,103,104&#xff09;配置好相关基础环境 安装 将安装包上传到/opt/software中 tar -zxf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/修改 apache-flume-1.9.0-bin 的名称为 flume mv /opt/module/…

element table加减列

// 有个特别注意的地方,下面这行代码,key一定绑的是item,千万不要绑定index,不然就会出现异常 //<el-table-column v-for"(item,index) in titleList" :key"item" min-width"150" align"center"><el-table fit :data"d…

从智能家居到智能城市:物联网中的隐私和安全风险

随着科技的不断进步&#xff0c;智能设备和物联网&#xff08;IoT&#xff09;技术已经逐渐渗透到我们的生活中。从智能家居设备到智能城市的实现&#xff0c;这些设备和技术可以让我们的生活变得更加便捷和高效。但是&#xff0c;这些设备也带来了不可忽视的隐私和安全风险。 …

【QT进阶】Qt Web混合编程之html、 js的简单交互

往期回顾 【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用&#xff08;图文并茂超详细介绍&#xff09;-CSDN博客【QT进阶】Qt Web混合编程之QWebEngineView基本用法-CSDN博客【QT进阶】Qt Web混合编程之CMake VS2019编译并使用QCefView&#xff08;图文并茂超详细版本&…

奇怪的 NRST 管脚异常复位问题

1. 引言 本文探讨一个奇怪的 MCU NRST 管脚异常复位现象。 2. 复位问题及排查 这个问题是客户对开发的平台做 EMS 浪涌测试的时候发生的&#xff0c; 平台上使用了一个STM32G474 RCT6 MCU 。在某个等级的 EMS 测试中&#xff0c; 客户发现 MCU 有时候会异常复位而影响平台的…

Linux驱动开发笔记(一)字符驱动

文章目录 前言一、字符设备驱动程序框架二、基本原理1. 设备号的申请与归还2. 保存file_operations接口3. 设备节点的创建和销毁4. 创建文件设备4.1 mknod4.2 init_special_incode( )函数 5. 查找file_operation接口函数速查表 三、程序编写1. 模块初始化及关闭2. 文件操作方式…

Pytorch 学习路程

目录 下载Pytorch 入门尝试 几种常见的Tensor Scalar Vector Matrix AutoGrad机制 线性回归尝试 使用hub模块 Pytorch是重要的人工智能深度学习框架。既然已经点进来&#xff0c;我们就详细的介绍一下啥是Pytorch PyTorch 希望将其代替 Numpy 来利用 GPUs 的威力&…

Python --- 在python中安装NumPy,SciPy,Matplotlib以及scikit-learn(Windows平台)

在python中安装NumPy&#xff0c;SciPy&#xff0c;Matplotlib以及scikit-learn(Windows平台) 本文是针对(像我一样的)python新用户所写的&#xff0c;刚刚在电脑上装好python之后&#xff0c;所需的一些常见/常用的python第三方库/软件包的快速安装指引。包括了这些常用安装包…

(mac)性能监控平台搭建JMeter+Grafana+Influxdb

【实现原理】 通过influxdb数据库存储jmeter的结果&#xff0c;再通过grafana采集influxdb数据库数据&#xff0c;完成监控平台展示 一、时间序列数据InfluxDB 1.InfluxDB下载安装 官网下载 https://portal.influxdata.com/downloads/ 官网最新版&#xff1a; &#xff0…

测试用例的编写评审

1、什么叫软件测试用例 什么是测试用例 测试用例(TestCase) 是为项目需求而编制的一组测试输入、执行条件 以及预期结果&#xff0c;以便测试某个程序是否满足客户需求。–测试依据 可以总结为:每一个测试点的数据设计和步骤设计。–测试用例 2、测试用例的重要性(了解) 2.1…

x-cmd mod | x whisper - 使用 whisper.cpp 进行本地 AI 语音识别

介绍 Whisper 模块通过 whisper.cpp 帮助用户快速将音频转换为文字。 INFO: whisper.cpp 是一个用 C/C 编写的轻量级智能语音识别库&#xff0c;是基于 OpenAI 的 Whisper 模型的移植版本&#xff0c;旨在通过深度学习模型实现音频转文字功能。 由于 whisper.cpp 目前只支持 1…

记录一下flume中因为taildir_position.json因位置不对导致数据无法从kafka被采到hdfs上的问题

【背景说明】 我需要用flume将kafka上的数据采集到hdfs上&#xff0c;发现数据怎么到不了hdfs。 【问题排查】 1.kafka上已有相应的数据 2.我的flume配置文档&#xff08;没问题&#xff09;&#xff0c; 3.时间拦截器&#xff08;没问题&#xff09;&#xff0c; 4.JSONObje…

《运营之光》3.0 读书笔记

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

HarmonyOS开发案例:【首选项】

介绍 本篇Codelab是基于HarmonyOS的首选项能力实现的一个简单示例。实现如下功能&#xff1a; 创建首选项数据文件。将用户输入的水果名称和数量&#xff0c;写入到首选项数据库。读取首选项数据库中的数据。删除首选项数据文件。 最终效果图如下&#xff1a; 相关概念 [首…

OpenHarmony鸿蒙南向开发案例:【智能门铃】

样例简介 智能门铃通过监控来访者信息&#xff0c;告诉主人门外是否有人按铃、有陌生人靠近或者无人状态。主人可以在数字管家中远程接收消息&#xff0c;并根据需要进行远程取消报警和一键开锁。同时&#xff0c;也可以通过室内屏幕获取门外状态。室内屏幕显示界面使用DevEco…

SQL增加主键约束的条件

结论 常见认为设为主键的条件为&#xff1a; 值唯一不含空值 具体实施中会出现各种问题 添加主键约束的条件细则&#xff1a; 值唯一数据中不含空值在定义时需要not null约束&#xff08;使用check约束不行&#xff09; 验证实验 接下来我做了关于这个细则的验证实验&am…

【MATLAB源码-第193期】基于matlab的网络覆盖率NOA优化算法仿真对比VFINOA,VFPSO,VFNGO,VFWOA等算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 NOA&#xff08;Network Optimization Algorithm&#xff0c;网络优化算法&#xff09;是一个针对网络覆盖率优化的算法&#xff0c;它主要通过优化网络中节点的分布和配置来提高网络的整体覆盖性能。网络覆盖率是衡量一个无…

【学习】软件压力测试对软件产品的作用

在信息化高速发展的今天&#xff0c;软件产品已经成为各行各业不可或缺的一部分。然而&#xff0c;随着软件功能的日益复杂和用户需求的不断增长&#xff0c;软件产品的稳定性和可靠性问题也愈发凸显。在这样的背景下&#xff0c;软件压力测试作为软件质量保障的重要手段之一&a…