Qt窗⼝的学习(一)

        Qt窗⼝是通过QMainWindow类来实现的。 QMainWindow是⼀个为⽤⼾提供主窗⼝程序的类,继承⾃QWidget类,并且提供了⼀个预定义的 布局。QMainWindow包含⼀个菜单栏(menubar)、多个⼯具栏(toolbars)、多个浮动窗⼝(铆 接部件)(dockwidgets)、⼀个状态栏(statusbar)和⼀个中⼼部件(centralwidget),它是许多应 ⽤程序的基础,如⽂本编辑器,图⽚编辑器等。如下图为QMainwindow中各组件所处的位置:

 1. 菜单栏

        Qt 中的菜单栏是通过QMenuBar这个类来实现的。⼀个主窗⼝最多只有⼀个菜单栏。位于主窗⼝顶部、主窗⼝标题栏下⾯。 菜单栏中包含菜单.菜单中包含菜单项

 菜单栏(QMenuBar)->菜单(QMenu)->菜单项(QAction)

1.1使用代码创建菜单结构:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 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("保存");QAction* action4 = new QAction("另存为");QAction* action5 = new QAction("退出");menu1->addAction(action1);menu1->addAction(action2);menu1->addAction(action3);menu1->addAction(action4);menu1->addAction(action5);// 4. 给 action 添加信号槽//点击菜单的时候,会处理响应connect(action1, &QAction::triggered, this, &MainWindow::handle);connect(action5, &QAction::triggered, this, &MainWindow::close);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handle()
{qDebug() << "触发新建操作!";
}

执行效果如下:

1.2 给菜单配置快捷键

        给菜单和菜单项设置快捷键,设置好的快捷键就可以搭配alt来进行使用了。

(文件(&F));通过给文本中添加&F这样的操作,就是添加了快捷键alt+F

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建菜单栏QMenuBar* menuBar = new QMenuBar();this->setMenuBar(menuBar);// 创建菜单QMenu* menu1 = new QMenu("文件 (&F)");QMenu* menu2 = new QMenu("编辑 (&E)");QMenu* menu3 = new QMenu("视图 (&V)");QMenu* menu4 = new QMenu("关于 (&A)");menuBar->addMenu(menu1);menuBar->addMenu(menu2);menuBar->addMenu(menu3);menuBar->addMenu(menu4);// 创建菜单项QAction* action1 = new QAction("菜单项1");QAction* action2 = new QAction("菜单项2");QAction* action3 = new QAction("菜单项3");QAction* action4 = new QAction("菜单项4");menu1->addAction(action1);menu2->addAction(action2);menu3->addAction(action3);menu4->addAction(action4);
}MainWindow::~MainWindow()
{delete ui;
}

 

1.3 给qaction创建快捷键

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenuBar* menuBar = new QMenuBar();this->setMenuBar(menuBar);QMenu* menu1 = new QMenu("文件(&F)");QMenu* menu2 = new QMenu("视图(&V)");menuBar->addMenu(menu1);menuBar->addMenu(menu2);// 创建四个菜单项QAction* action1 = new QAction("action1 (&Q)");QAction* action2 = new QAction("action2 (&W)");QAction* action3 = new QAction("action3 (&E)");QAction* action4 = new QAction("action4 (&R)");menu1->addAction(action1);menu1->addAction(action2);menu2->addAction(action3);menu2->addAction(action4);// 不绑定槽函数, 通过快捷键选中也没啥反应~~connect(action1, &QAction::triggered, this, &MainWindow::handle1);connect(action2, &QAction::triggered, this, &MainWindow::handle2);connect(action3, &QAction::triggered, this, &MainWindow::handle3);connect(action4, &QAction::triggered, this, &MainWindow::handle4);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handle1()
{qDebug() << "handle1";
}void MainWindow::handle2()
{qDebug() << "handle2";
}void MainWindow::handle3()
{qDebug() << "handle3";
}void MainWindow::handle4()
{qDebug() << "handle4";
}

1.4 菜单栏中添加子菜单

        菜单栏->菜单->子菜单->子菜单->菜单项

        通过Qmenu提供的addMenu给某个菜单添加子菜单;

#include "mainwindow.h"
#include "ui_mainwindow.h"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("子菜单1");menuBar->addMenu(menuParent);menuParent->addMenu(menuChild);QAction* action1 = new QAction("菜单项1");QAction* action2 = new QAction("菜单项2");menuChild->addAction(action1);menuChild->addAction(action2);QMenu* menuChild2 = new QMenu("子菜单2");menuChild->addMenu(menuChild2);
}MainWindow::~MainWindow()
{delete ui;
}

执行效果如下所示:

1.5 添加分割线

 菜单里菜单项特别多,就可以通过分割线,进行分组,QMenu中提供了addseparator这样的函数。

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenuBar* menuBar = new QMenuBar();this->setMenuBar(menuBar);QMenu* menu = new QMenu("菜单");menuBar->addMenu(menu);QAction* action1 = new QAction("菜单项1");QAction* action2 = new QAction("菜单项2");menu->addAction(action1);menu->addSeparator();menu->addAction(action2);
}

1.6 添加图标

        使用qrc文件引入icon图片:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// QMenuBar* menuBar = new QMenuBar();QMenuBar* menuBar = this->menuBar();this->setMenuBar(menuBar);QMenu* menu = new QMenu("菜单");menu->setIcon(QIcon(":/open.png"));menuBar->addMenu(menu);QAction* action1 = new QAction("菜单项1");action1->setIcon(QIcon(":/open.png"));QAction* action2 = new QAction("菜单项2");action2->setIcon(QIcon(":/save.png"));menu->addAction(action1);menu->addAction(action2);
}MainWindow::~MainWindow()
{delete ui;
}

        如果给QMenu设置图标,当前QMenu是长在QMenuBar上的,此时文本就不显示图标覆盖了文本。

        QMenu是子菜单,图标和文本是都能显示的

1.7 内存泄漏问题


// QMenuBar* menuBar = new QMenuBar();
如果咱们创建的项目,没有勾选自动生成ui文件,此时上述代码是ok的
如果勾选了自动生成ui文件,上述代码则会引起内存泄露
因为Qt已经给你生成了一个QMenuBar了;之前程序自己已经创建好了一个QMenuBar
当设置新的QMenuBar进来的时候,就会导致旧的
QMenuBar脱离了Qt的对象树了.意味着后续就无法对这个对象进行释放了;上述程序如果窗口关闭,对象树释放,此时进程也就结束了.
进程结束,自然所有内存都回收给系统,上述内存泄露也不会造成影响
但是如果这样的代码是出现在一个多窗口的程序中:
如果涉及到窗口的频繁跳转切换(窗口的频繁创建销毁),上述内存泄露就会更严重一些所以为了防止内存泄漏,修改为如下代码:
QMenuBar* menuBar = this->menuBar();
1.如果QMenuBar已经存在,直接获取并返回
2.如果QMenuBar不存在,就先创建一个新的,再返回
如果是获取到已经存在的QMenuBar,这里的设置就是自己替换自己,
仍然在对象树上

2. ⼯具栏

        更用QTooBar表示工具栏对象,一个窗口可以有多个工具栏,也可以没有。工具栏往往也可以手动移动位置。

 Action如果出现在工具栏上,也会产生图标覆盖文本这样的情况。

如果一个QAction既是QMenu的子元素,又是QToolBar的子元素,释放的时候,只会释放一次,不会重复delete。

代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>
#include <QDebug>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(":/open.png"));// 菜单项还可以放到菜单中menu->addAction(action1);menu->addAction(action2);// 菜单项放到工具栏中toolBar->addAction(action1);toolBar->addAction(action2);connect(action1, &QAction::triggered, this, &MainWindow::handle1);connect(action2, &QAction::triggered, this, &MainWindow::handle2);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handle1()
{qDebug() << "handle1";
}void MainWindow::handle2()
{qDebug() << "handle2";
}

3.状态栏

        状态栏是应⽤程序中输出简要信息的区域。。⼀般位于主窗⼝的最底部,⼀个窗⼝中最多只能有⼀个状 态栏。

代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel>
#include <QProgressBar>
#include <QPushButton>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 存在就获取, 不存在就创建QStatusBar* statusBar = this->statusBar();// 如果状态栏没有被创建, 这样的设置是必要的.// 如果状态栏已经在窗口中存在, 这样的设置其实意义不大, 但是也没副作用. 仍然保留.this->setStatusBar(statusBar);// 显示一个临时的信息.// statusBar->showMessage("这是一个状态消息");// 给状态栏中添加子控件QLabel* label = new QLabel("这是一个 QLabel");statusBar->addWidget(label);//    QLabel* label2 = new QLabel("这个是另一个 QLabel");
//    statusBar->addWidget(label2, 2);QProgressBar* progressBar = new QProgressBar();//这是进度条progressBar->setRange(0, 100);progressBar->setValue(50);statusBar->addWidget(progressBar);QPushButton* button = new QPushButton("按钮");statusBar->addPermanentWidget(button);
}MainWindow::~MainWindow()
{delete ui;
}

4. 浮动窗口

        在Qt中是使用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();// 使用 addDockWidget 方法, 把浮动窗口加入到子窗口中.this->addDockWidget(Qt::LeftDockWidgetArea, 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* button = new QPushButton("这是按钮");layout->addWidget(label);layout->addWidget(button);// 设置浮动窗口允许停靠的位置dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::TopDockWidgetArea);
}MainWindow::~MainWindow()
{delete ui;
}

执行效果如下:

5. 对话框

        Qt中使用QDialog类表示对话框,。Qt常 ⽤的内置对话框有:QFiledialog(⽂件对话框)、QColorDialog(颜⾊对话框)、QFontDialog (字体对话框)、QInputDialog(输⼊对话框)和QMessageBox(消息框)。

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

        实际开发中,往往不是直接在创建项目的时候继承自QDialog.而是在代码中,创建额外的类,让额外的类继承自QDialog。

        主窗口,一般不会作为一个对话框。主窗口可以再产生出一些其他的对话框。

一个简单的例子:
        主窗口中,通过点击按钮,弹出一个新的对话框。
        QDialog其实也是QWidget的子类.QWidget的各种属性方法,QDialog也能使用。不同于界面上的其他控件.此处QDialog每次按下按钮,都会创建一个新的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();// delete dialog;// 正确做法应该是把 delete 和关闭按钮的点击信号关联起来.// 在用户点击关闭的时候, 触发 delete.// Qt 为了让咱们写的方便, 直接给 QDialog 设置了一个属性, 可以通过设置属性, 完成上述效果.dialog->setAttribute(Qt::WA_DeleteOnClose);//通过设置属性,在进行关闭对话框操作的时候处罚delete内存的操作
}

5.1 自定义对话框

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

5.2 model(bool)

模态 / 非模态

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

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

5.3 Qt内置对话框

        Qt提供了多种可复⽤的对话框类型,即Qt标准对话框。Qt标准对话框全部继承于QDialog类。常⽤ 标准对话框如下:

消息对话框QMessageBox:

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

        借助静态函数构造消息对话框

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{int result = QMessageBox::information(this, "对话框标题", "对话框文本", QMessageBox::Ok | QMessageBox::Cancel);if (result == QMessageBox::Ok) {qDebug() << "Ok";} else if (result == QMessageBox::Cancel) {qDebug() << "Cancel";}
}

5.4 颜⾊对话框QColorDialog

        颜⾊对话框的功能是允许⽤⼾选择颜⾊。继承⾃QDialog类。

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;
//    getColor() 这个函数就能够弹出一个模态对话框.用户选择颜色之后,点击确定,
//    对话框关闭getcolor返回的值就是用户选择的颜色值!!
//    静态函数static.QMessageBoxwarning不必创建对话框对象,就可以直接使用// 可以基于用户选择的颜色, 修改窗口的背景色.// 可以通过 QSS 的方式设置背景色.
//    QString style = "background-color: rgb(" + QString::number(color.red()) + ", " + QString::number(color.green())
//            + ", " + QString::number(color.blue()) + ");";char style[1024] = { 0 };sprintf(style, "background-color: rgb(%d, %d, %d);", color.red(), color.green(), color.blue());this->setStyleSheet(style);
}

上述是对颜色框样式的设置。

5.5 ⽂件对话框QFileDialog

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

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

5.6 字体对话框QFontDialog

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

5,7 输⼊对话框QInputDialog

        让用户输入一个具体的数据,可以是整数,可以是浮点数,还可以是字符串.(以类似于下拉框)

ps:谢谢观看!!!

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

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

相关文章

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

&#x1f4da; 本文主要总结了一些常见的C面试题&#xff0c;主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能&#xff0c;掌握这些内容&#xff0c;基本上就满足C的岗位技能&#xff08;红色标记为重点内容&#xff09;&#xff0c;欢迎大家前来学习指正&…

git提交的脚本无执行权限怎么办

问题描述 自己写的小项目&#xff0c;没有在服务器安装 Jenkins 进行项目部署&#xff0c;为了图方便&#xff0c;在项目中编写了一个 deploy.sh 脚本文件用来执行项目部署。但是在服务器上 pull 下来之后发现脚本文件没有执行权限&#xff0c;通过 chmod 命令进行赋权&#x…

004.chromium编译进阶-启动时传入cookies

一、目标&#xff1a; 实现传入参数--set-cookies[{"domain":"https://baidu.com","name":"AAAA","value":"111"},{"domain":"https://baidu.com","name":"BBB","…

【数据库复习】

数据库复习题 一、填空题1&#xff0e;数据库系统一般由&#xff08;数据库&#xff09;、应用系统、&#xff08;数据库管理系统&#xff09;、&#xff08;数据库管理员&#xff09;和用户构成。2&#xff0e;数据模型通常由&#xff08;数据结构&#xff09;、&#xff08;数…

微信小程序:选择页面单选实现(多页面均可选择)

一、效果展示 1、主页面 展示了两个选择行 2、选择页面 根据传递的参数决定员工展示的数据,并且单选,可将数据传递给主页面 二、主页面实现 1、视图层 写入了采购员和库管员的行选择信息 <view class="item flex flex-between"><view class="i…

使用docker-compose搭建redis-cluster集群

前言 如果你也因为centos的gcc版本落后导致redis编译安装不通过而烦恼&#xff0c;大可以试一试用docker去搭建redis集群。本文以单节点搭建redis-cluster三主三从为例。 ip&#xff1a;192.168.0.10redis信息&#xff1a; 客户端连接端口&#xff1a;7001 -7006集群间通信端…

【LLaMA-Factory 实战系列】二、WebUI 篇 - Qwen2.5-VL 多模态模型 LoRA 微调保姆级教程

【LLaMA-Factory 实战系列】二、WebUI 篇 - Qwen2.5-VL 多模态模型 LoRA 微调保姆级教程 1. 引言1.1 为什么选择 Qwen2.5-VL-3B-Instruct&#xff1f;1.2 环境要求 2. 环境搭建2.1 安装 LLaMA-Factory2.2 验证安装 3. 数据集准备与配置3.1 数据集结构3.2 数据格式3.3 数据集声明…

风险矩阵与灰色综合评价

一、风险矩阵&#xff08;Risk Matrix&#xff09; 1. 定义与原理 定义&#xff1a;风险矩阵是一种通过二维网格&#xff08;可能性 vs. 后果严重程度&#xff09;可视化展示风险等级的工具&#xff0c;用于优先级排序和决策支持。核心要素&#xff1a; 横轴&#xff08;X轴&…

谷歌浏览器电脑版官方下载- Google Chrome官方网页版入口

谷歌浏览器&#xff08;Google Chrome&#xff09;是一款由谷歌公司开发的免费网页浏览器&#xff0c;自2008年首次发布以来&#xff0c;迅速成为全球最受欢迎的浏览器之一。它以简洁的界面设计、快速的浏览速度和强大的安全性能而闻名。谷歌浏览器支持多种操作系统&#xff0c…

垂直电商供应链平台:重构产业生态,驱动数字化增长

垂直电商供应链平台&#xff1a;重构产业生态&#xff0c;驱动数字化增长 在电商行业竞争日益激烈的当下&#xff0c;垂直电商供应链平台凭借对细分领域的深度聚焦与数字化能力&#xff0c;成为产业升级的关键引擎。本文围绕垂直电商供应链平台的架构、价值及生态构建展开&…

VSCode 插件 Remote - SSH:开启高效远程开发之旅

在当今的软件开发领域&#xff0c;远程开发已经成为了一种越来越流行的工作方式。无论是分布式团队协作&#xff0c;还是需要在不同环境中进行开发&#xff0c;远程开发都能为开发者带来极大的便利。而 VSCode 的 Remote - SSH 插件&#xff0c;就是一款能够帮助开发者实现高效…

亚矩阵云手机+Whatnot:直播电商的自动化增长引擎

在直播电商蓬勃发展的今天&#xff0c;Whatnot作为北美领先的收藏品和潮流商品拍卖平台&#xff0c;吸引了大量卖家和收藏爱好者。然而&#xff0c;高效运营多个账号、管理直播场次、优化出价策略等挑战&#xff0c;让许多商家难以规模化经营。​​亚矩阵云手机​​与​​Whatn…

关于vue.mixin与vue.use的用法分析

背景。源码不会读&#xff0c;不清楚的问大模型。特别是对平常开发太会用到的情形。 vue.mixin。是将每一个页面注入mixin的内容。会对页面中注入$uStore而不是方便获取状态信息。 vue.use。按装的插件。用于封装完整的功能&#xff0c;如UI库&#xff0c;路由拦截器等&…

MySQL 8.x配置MGR高可用+ProxySQL读写分离(二):ProxySQL配置MySQL代理及读写分离

#作者&#xff1a;stackofumbrella 文章目录 ProxySQL简介ProxySQL架构ProxySQL的安装与配置在不同层次间移动配置 ProxySQL简介 ProxySQL是基于MySQL的一款开源的中间件的产品&#xff0c;是一个灵活的MySQL代理层&#xff0c;可以实现读写分离&#xff0c;支持Query路由功能…

基于 Python Flask 的 B/S 架构项目的软件设计思路

文章目录 基于 Python Flask 的 B/S 架构项目的软件设计思路1. 引言2. B/S架构概述2.1 什么是B/S架构2.2 B/S架构的组成层次2.3 B/S vs C/S架构对比2.4 现代B/S架构的发展趋势 3. Flask在B/S架构中的定位3.1 Flask作为B/S架构的后端框架3.2 Flask的架构优势3.3 Flask在不同B/S架…

AntV F2入门教程

以下教程将系统地介绍 AntV F2&#xff08;移动端可视化引擎&#xff09;的核心 组件 API&#xff0c;包含安装与引入、画布与图表、数据映射、几何标记、坐标轴、图例、提示、标注和滚动条等&#xff0c;每个 API 都附带完整示例代码&#xff0c;帮助你快速掌握 F2 用法。 一…

退休时医疗保险补缴的基数影响什么

退休时医疗保险的补缴基数主要影响补缴金额、医保个人账户划入待遇、终身医保待遇的享受条件等关键方面。以下是具体分析&#xff1a; 1. 影响补缴金额的多少 补缴基数通常以退休时上年度全省/市职工月平均工资或本人退休前缴费基数为基准&#xff08;各地政策不同&#xff09…

conda导出环境文件requirements.txt

conda导出的几种方式 方式一&#xff1a;使用pip freeze&#xff08;推荐&#xff09; 如果你主要使用 pip 安装包&#xff0c;且环境中的包都兼容 PyPI&#xff0c;可以直接用 pip 导出&#xff1a; conda activate your_env_name # 激活环境&#xff08;若未激活&#xf…

华为云 Flexus+DeepSeek 征文|增值税发票智能提取小工具:基于大模型的自动化信息解析实践

华为云 FlexusDeepSeek 征文&#xff5c;增值税发票智能提取小工具&#xff1a;基于大模型的自动化信息解析实践 前言背景 企业财务处理中&#xff0c;增值税发票信息手动提取存在效率低、易出错等痛点&#xff0c;华为云 Flexus 弹性算力联合 DeepSeek 大模型&#xff0c;通过…

亚马逊选品 家具或艺术?指纹技术重构两者

58%毛利&#xff01;生物识别首饰盒代理 奢侈品零售的隐藏金矿&#xff1a;安防产品的毛利是普通家居的3倍&#xff01; 核心数据 零售价 4,900 | 代理价 1,990 → 毛利58% 零库存风险&#xff1a;90天寄售周期 72小时售罄&#xff1a;贝弗利山庄快闪店卖出47台 首批10家特权…