【Qt常用控件】—— 布局管理器

目录

前言 

(一)垂直布局 

(二)水平布局

(三)网格布局

(四)表单布局

(五)分组布局

(六)Spacer

总结


前言 

之前使⽤Qt在界⾯上创建的控件,都是通过"绝对定位"的⽅式来设定的.

  • 也就是每个控件所在的位置,都需要计算坐标,最终通过 setGeometry 或者 move ⽅式摆放过去.这种设定⽅式其实并不方便.尤其是界⾯如果内容⽐较多,不好计算.而且⼀个窗口大小往往是可以调整的,按照绝对定位的⽅式,也⽆法⾃适应窗口⼤⼩.

因此Qt引⼊"布局管理器"(Layout)机制,来解决上述问题.

Qt的布局管理器(Layout Manager)是一种用于自动排列和调整窗口或容器中的控件的工具。它们可以完成以下两件事:

  1. 自动调整控件的位置,包括控件之间的间距、对齐等。
  2. 当用户调整窗口大小时,位于布局管理器内的控件也会随之调整大小,从而保持整个界面的美观。

Qt共提供了5种布局管理器,每种布局管理器对应一个类,分别是:

  1. QVBoxLayout(垂直布局):将所有控件从上到下(或者从下到上)依次摆放。
  2. QHBoxLayout(水平布局):包含的对象都横向排列开。
  3. QGridLayout(网格布局):将控件放置到网格中布局,它本身会从父窗口或父布局中占据尽可能多的界面空间,然后把自己的空间划分为行和列,再把每个控件塞到设置好的一个或多个单元格中。
  4. QFormLayout(表单布局):通常用于创建表单界面,其中控件成对出现,例如标签和输入框。
  5. QStackedLayout(分组布局):可以将多个控件堆叠在一起,但一次只能显示一个控件。这通常用于实现多页面的用户界面。

这些布局管理器都继承自QLayout类,这是Qt布局管理器的抽象基类。通过继承QLayout,Qt实现了功能各异且互补的布局管理器。

与绝对位置定位相比,布局管理器具有更高的灵活性和适应性。它们可以根据窗口的大小自动调整控件的大小和位置,而无需手动调整每个控件的位置和大小。这使得在开发用户界面时更加高效和方便。

🔥 当然,布局管理器并⾮Qt独有.其他的GUI开发框架,像Android,前端等也有类似的机制.


(一)垂直布局

使用 VBoxLayout 表示垂直的布局管理器.V是 vertical 的缩写.

在Qt中,垂直布局(QVBoxLayout)是一种常用的布局管理器,它可以将控件按照垂直方向进行排列。这种布局方式非常适用于需要从上到下依次排列控件的界面设计。

核心属性:

属性说明
layoutLeftMargin左侧边距
layoutRightMargin右侧边距
layoutTopMargin上方边距
layoutBottomMargin下方边距
layoutSpacing相邻元素之间的间距

🔥 注意Layout只是⽤于界⾯布局,并没有提供信号.

QVBoxLayout是一种布局管理器,具有以下特点:

  1. 垂直排列:控件会按照从上到下的顺序进行排列。

  2. 自动调整:当父窗口或容器的大小发生变化时,QVBoxLayout会自动调整其内部控件的大小和位置,以保持布局的整齐和美观。

  3. 可嵌套:QVBoxLayout可以嵌套在其他布局管理器中,如QHBoxLayout或QGridLayout,以实现更复杂的界面布局。

使用方法如下:

  1. 创建QVBoxLayout对象:首先,需要创建一个QVBoxLayout对象。这可以通过在代码中直接创建或使用Qt Designer进行设计后生成。

  2. 添加控件:然后,将需要排列的控件添加到QVBoxLayout中。这可以通过调用QVBoxLayout的addWidget()方法来实现。

  3. 设置布局:最后,将QVBoxLayout设置为某个窗口或容器的布局。这可以通过调用窗口或容器的setLayout()方法来实现。

代码示例:使用 QVBoxLayout 管理多个控件.

1)编写代码,创建布局管理器和三个按钮.并且把按钮添加到布局管理器中.

  • 使⽤ addWidget 把控件添加到布局管理器中.
  • 使⽤ setLayout 设置该布局管理器到widget中.
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建三个按钮QPushButton* btn1 = new QPushButton("按钮1");QPushButton* btn2 = new QPushButton("按钮2");QPushButton* btn3 = new QPushButton("按钮3");// 创建布局管理器, 并且把按钮添加进去// 如果创建的时候指定⽗元素为 this, 则后⾯不需要 setLayout ⽅法了.QVBoxLayout* layout = new QVBoxLayout();layout->addWidget(btn1);layout->addWidget(btn2);layout->addWidget(btn3);// 把布局管理器设置到 widget 中this->setLayout(layout);
}

2)运⾏程序,可以看到此时界⾯上的按钮就存在于布局管理器中.随着窗口尺寸变化而发⽣改变.

  •  此时三个按钮的尺⼨和位置,都是⾃动计算出来的.

  • 通过上述代码的方式,只能给这个widget设定⼀个布局管理器.实际上也可以过Qt Design在⼀个窗⼝中创建多个布局管理器.

代码示例:创建两个 QVBoxLayout

1)在界⾯上创建两个 QVBoxLayout ,每个 QVBoxLayout 各放三个按钮.

2)运行程序,可以看到这些按钮已经⾃动排列好.只不过当前这些按钮的位置不能随着窗⼝⼤⼩⾃动变化.


(二)水平布局

使⽤ QHBoxLayout 表⽰垂直的布局管理器.H是 horizontal 的缩写.

在Qt中,水平布局(Horizontal Layout)是一种常用的布局管理方式,它允许你将多个控件(如按钮、文本框等)水平地排列在一起。

核心属性(和QVBoxLayout 属性是⼀致的)

属性说明
layoutLeftMargin左侧边距
layoutRightMargin右侧边距
layoutTopMargin上方边距
layoutBottomMargin下方边距
layoutSpacing相邻元素之间的间距

代码示例:使用 QHBoxLayout 管理控件

1)编写代码,创建布局管理器和三个按钮.并且把按钮添加到布局管理器中.

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建三个按钮QPushButton* btn1 = new QPushButton("按钮1");QPushButton* btn2 = new QPushButton("按钮2");QPushButton* btn3 = new QPushButton("按钮3");// 创建布局管理器QHBoxLayout* layout = new QHBoxLayout();layout->addWidget(btn1);layout->addWidget(btn2);layout->addWidget(btn3);// 设置 layout 到 widget 上this->setLayout(layout);
}

2)运⾏程序,可以看到此时界⾯上的按钮就存在于布局管理器中.随着窗⼝尺⼨变化⽽发⽣改变.

  • 此时三个按钮的尺⼨和位置,都是⾃动计算出来的.

  • 注意:Layout⾥⾯可以再嵌套上其他的layout,从而达到更复杂的布局效果.

代码示例: 嵌套的layout

1)在代码中创建以下内容

  • 使⽤addLayout 给layout中添加⼦layout.
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建顶层 layoutQVBoxLayout* layoutParent = new QVBoxLayout();this->setLayout(layoutParent);// 添加两个按钮进去QPushButton* btn1 = new QPushButton("按钮1");QPushButton* btn2 = new QPushButton("按钮2");layoutParent->addWidget(btn1);layoutParent->addWidget(btn2);// 创建⼦ layoutQHBoxLayout* layoutChild = new QHBoxLayout();// 添加两个按钮进去QPushButton* btn3 = new QPushButton("按钮3");QPushButton* btn4 = new QPushButton("按钮4");layoutChild->addWidget(btn3);layoutChild->addWidget(btn4);// 把这个⼦ layout 添加到 ⽗ layout 中layoutParent->addLayout(layoutChild);
}

2)执行程序,观察结果

  • 结合 QHBoxLayout 和 QVBoxLayout ,就可以做出各种复杂的界⾯了。

(三)网格布局

Qt中还提供了QGridLayout ⽤来实现⽹格布局的效果.可以达到M*N的这种⽹格的效果

核心属性

  • 整体和 QVBoxLayout 以及 QHBoxLayout 相似.但是设置spacing的时候是按照垂直⽔平两个⽅向来设置的
属性说明
layoutLeftMargin左侧边距
layoutRightMargin右侧边距
layoutTopMargin上⽅边距
layoutBottomMargin下⽅边距
layoutHorizontalSpacing相邻元素之间⽔平⽅向的间距
layoutVerticalSpacing相邻元素之间垂直⽅向的间距
layoutRowStretch⾏⽅向的拉伸系数
layoutColumnStretch列⽅向的拉伸系数

代码示例:使用 QGridLayout 管理元素

1)代码中创建 QGridLayout 和4个按钮.

  • 使⽤ addWidget 添加控件到布局管理器中.但是添加的同时会指定两个坐标.表⽰放在第⼏⾏,第⼏列.
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建 4 个按钮QPushButton* btn1 = new QPushButton("按钮1");QPushButton* btn2 = new QPushButton("按钮2");QPushButton* btn3 = new QPushButton("按钮3");QPushButton* btn4 = new QPushButton("按钮4");// 创建⽹格布局管理器, 并且添加元素QGridLayout* layout = new QGridLayout();layout->addWidget(btn1, 0, 0);layout->addWidget(btn2, 0, 1);layout->addWidget(btn3, 1, 0);layout->addWidget(btn4, 1, 1);// 设置 layout 到窗⼝中.this->setLayout(layout);
}

2)执⾏代码,观察效果.可以看到当前的这⼏个按钮是按照2⾏2列的⽅式排列的.
 

3)如果调整⾏列坐标为下列代码

// 创建⽹格布局管理器, 并且添加元素
QGridLayout* layout = new QGridLayout();
layout->addWidget(btn1, 0, 0);
layout->addWidget(btn2, 0, 1);
layout->addWidget(btn3, 0, 2);
layout->addWidget(btn4, 0, 3);

执行代码,可以看到这⼏个按钮都在同⼀⾏了.相当于 QHBoxLayout

4)如果调整⾏列坐标为下列代码

QGridLayout* layout = new QGridLayout();
layout->addWidget(btn1, 1, 0);
layout->addWidget(btn2, 2, 0);
layout->addWidget(btn3, 3, 0);
layout->addWidget(btn4, 4, 0);

执行代码,可以看到这⼏个按钮都在同⼀列了.相当于 QVBoxLayout

5)任意调整⾏列,即可看到不同的效果.

// 创建⽹格布局管理器, 并且添加元素
QGridLayout* layout = new QGridLayout();
layout->addWidget(btn1, 0, 0);
layout->addWidget(btn2, 1, 1);
layout->addWidget(btn3, 2, 2);
layout->addWidget(btn4, 3, 3);

 代码示例:设置 QGridLayout 中元素的大小⽐例

1)创建6个按钮,按照2⾏3列的⽅式排列

  • 使用 setColumnStretch 设置每⼀列的拉伸系数.
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建 6 个按钮QPushButton* btn1 = new QPushButton("按钮1");QPushButton* btn2 = new QPushButton("按钮2");QPushButton* btn3 = new QPushButton("按钮3");QPushButton* btn4 = new QPushButton("按钮4");QPushButton* btn5 = new QPushButton("按钮5");QPushButton* btn6 = new QPushButton("按钮6");// 创建⽹格布局管理器, 并且添加元素QGridLayout* layout = new QGridLayout();layout->addWidget(btn1, 0, 0);layout->addWidget(btn2, 0, 1);layout->addWidget(btn3, 0, 2);layout->addWidget(btn4, 1, 0);layout->addWidget(btn5, 1, 1);layout->addWidget(btn6, 1, 2);// 设置拉伸⽐例// 第 0 列拉伸⽐例设为 1;layout->setColumnStretch(0, 1);// 第 1 列拉伸⽐例设为 0, 即为固定⼤⼩, 不参与拉伸layout->setColumnStretch(1, 0);// 第 2 列拉伸⽐例设为 3, 即为第 2 列的宽度是第 0 列的 3 倍layout->setColumnStretch(2, 3);// 设置 layout 到窗⼝中.this->setLayout(layout);
}

2)执行程序,可以看到每⼀列的宽度是不同的.并且随着窗⼝调整动态变化

  • 另外, QGridLayout 也提供了 setRowStretch 设置⾏之间的拉伸系数.
  • 上述案例中,直接设置 setRowStretch 效果不明显,因为每个按钮的⾼度是固定的.需要把按钮的垂直⽅向的 sizePolicy 属性设置为 QSizePolicy::Expanding 尽可能填充满布局管理器,才能看到效果.

 使⽤ setSizePolicy 设置按钮的尺⼨策略.可选的值如下:

  • QSizePolicy::Ignored :忽略控件的尺⼨,不对布局产⽣影响。
  • QSizePolicy::Minimum :控件的最⼩尺⼨为固定值,布局时不会超过该值。
  • QSizePolicy::Maximum :控件的最⼤尺⼨为固定值,布局时不会⼩于该值。
  • QSizePolicy::Preferred :控件的理想尺⼨为固定值,布局时会尽量接近该值。
  • QSizePolicy::Expanding :控件的尺⼨可以根据空间调整,尽可能占据更多空间。
  • QSizePolicy::Shrinking :控件的尺⼨可以根据空间调整,尽可能缩⼩以适应空间。
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建 6 个按钮QPushButton* btn1 = new QPushButton("按钮1");QPushButton* btn2 = new QPushButton("按钮2");QPushButton* btn3 = new QPushButton("按钮3");QPushButton* btn4 = new QPushButton("按钮4");QPushButton* btn5 = new QPushButton("按钮5");QPushButton* btn6 = new QPushButton("按钮6");// 设置按钮的 sizePolicy, 此时按钮的⽔平⽅向和垂直⽅向都会尽量舒展开btn1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn4->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn5->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn6->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);// 创建⽹格布局管理器, 并且添加元素QGridLayout* layout = new QGridLayout();layout->addWidget(btn1, 0, 0);layout->addWidget(btn2, 0, 1);layout->addWidget(btn3, 1, 0);layout->addWidget(btn4, 1, 1);layout->addWidget(btn5, 2, 0);layout->addWidget(btn6, 2, 1);// 设置拉伸⽐例// 第 0 ⾏拉伸⽐例设为 1;layout->setRowStretch(0, 1);// 第 1 ⾏拉伸⽐例设为 0, 即为固定⼤⼩, 不参与拉伸layout->setRowStretch(1, 0);// 第 2 ⾏拉伸⽐例设为 3, 即为第 2 ⾏的宽度是第 0 ⾏的 3 倍layout->setRowStretch(2, 3);// 设置 layout 到窗⼝中.this->setLayout(layout);
}

 此时的按钮垂直⽅向都舒展开了.并且调整窗⼝尺⼨,也会按照设定的⽐例同步变化

  • 总的来说,使⽤ QGridLayout 能够代替很多 QHBoxLayout 和 QVBoxLayout 嵌套的场景.毕竟嵌套的代码写起来是⽐较⿇烦的.
  • 另外不要忘了, QGridLayout ⾥⾯也能嵌套 QHBoxLayout 和 QVBoxLayout ,QHBoxLayout和QVBoxLayout ⾥⾯也能嵌套 QGridLayout

(四)表单布局

除了上述的布局管理器之外,Qt还提供了 QFormLayout ,属于是 QGridLayout 的特殊情况,专门用于实现两列表单的布局.

  • 这种表单布局多⽤于让⽤⼾填写信息的场景.左侧列为提⽰,右侧列为输⼊框.

代码示例:使⽤ QFormLayout 创建表单.

1)编写代码,创建 QFormLayout ,以及三个label和三个lineEdit

  • 使⽤ addRow ⽅法来添加⼀⾏.每⾏包含两个控件.第⼀个控件固定是QLabel/⽂本,第⼆个控件则可以是任意控件.
  • 如果把第⼀个参数填写为NULL,则什么都不显示.
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建 layoutQFormLayout* layout = new QFormLayout();this->setLayout(layout);// 创建三个 labelQLabel* label1 = new QLabel("姓名");QLabel* label2 = new QLabel("年龄");QLabel* label3 = new QLabel("电话");// 创建三个 lineEditQLineEdit* lineEdit1 = new QLineEdit();QLineEdit* lineEdit2 = new QLineEdit();QLineEdit* lineEdit3 = new QLineEdit();// 创建⼀个提交按钮QPushButton* btn = new QPushButton("提交");// 把上述元素添加到 layout 中layout->addRow(label1, lineEdit1);layout->addRow(label2, lineEdit2);layout->addRow(label3, lineEdit3);layout->addRow(NULL, btn);
}

2)执行程序,可以看到以下结果.


(五)分组布局

在Qt中,分组布局(Stacked Layout)通常通过QStackedLayoutQStackedWidget来实现。这种布局方式允许你将多个控件或窗口部件堆叠在一起,但每次只显示其中一个。这对于需要动态切换界面的应用程序特别有用。

举个简单的例子,下图中的界面就使用了 QStackedLayout 布局管理器:

【解释说明】 

  • 整个窗口被一分为二,左侧是 QListWidget 列表控件,右侧是 QStackedLayout 布局管理器。QStackedLayout 中包含 QPushButonn、QLabel 和 QLineEdit 这 3 个控件,但每次只能 3 个控件中的一个。 

常用方法

成员方法功 能
int QStackedLayout::addWidget(QWidget *widget)将 widget 控件添加到 QStackedLayout 控件中。
int QStackedLayout::insertWidget(int index, QWidget *widget)将 widget 控件插入到 QStackedLayout 控件指定的位置处。
信号函数功 能
void QStackedLayout::currentChanged(int index)切换当前显示的控件时,会触发此信号,index 为显示的新控件的索引。
void QStackedLayout::widgetRemoved(int index)移除某个控件时,会触发此信号,index 为被移除控件的索引。
槽函数功 能
void setCurrentIndex(int index)将第 index 个控件作为要显示的控件。
void QStackedLayout::setCurrentWidget(QWidget *widget)设置 widget 作为当前要实现的控件。注意,必须保证 widget 存储在 QStackedLayout 控件中。

(六)Spacer

使⽤布局管理器的时候,可能需要在控件之间,添加⼀段空⽩.就可以使⽤ QSpacerItem 来表示.

核心属性

属性说明
width宽度
height⾼度
hData⽔平⽅向的sizePolicy
• QSizePolicy::Ignored :忽略控件的尺⼨,不对布局产⽣影响。
• QSizePolicy::Minimum :控件的最⼩尺⼨为固定值,布局时不会超过该值。
• QSizePolicy::Maximum :控件的最⼤尺⼨为固定值,布局时不会⼩于该值。
• QSizePolicy::Preferred :控件的理想尺⼨为固定值,布局时会尽量接近。
值。
• QSizePolicy::Expanding :控件的尺⼨可以根据空间调整,尽可能占据更多空
间。
• QSizePolicy::Shrinking :控件的尺⼨可以根据空间调整,尽可能缩⼩以适应
空间。
vData垂直⽅向的sizePolicy
选项同上.

代码示例:创建⼀组左右排列的按钮.

1)在界⾯上创建⼀个 QVBoxLayout ,并添加两个按钮.

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QHBoxLayout* layout = new QHBoxLayout();this->setLayout(layout);QPushButton* btn1 = new QPushButton("按钮1");QPushButton* btn2 = new QPushButton("按钮2");layout->addWidget(btn1);layout->addWidget(btn2);
}

2)直接运行程序,可以看到两个按钮是紧挨着的.

3)在两个按钮中间添加⼀个spacer

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QHBoxLayout* layout = new QHBoxLayout();this->setLayout(layout);QPushButton* btn1 = new QPushButton("按钮1");QPushButton* btn2 = new QPushButton("按钮2");// 创建 SpacerQSpacerItem* spacer = new QSpacerItem(200, 20);layout->addWidget(btn1);// 在两个 widget 中间添加空⽩layout->addSpacerItem(spacer);layout->addWidget(btn2);
}

4)运行程序,观察代码效果.可以看到两个按钮之间已经存在了间隔了.

  • 调整QSpacerItem不同的尺⼨,即可看到不同的间距.

其次在Qt Designer中,也可以直接给界⾯上添加spacer.


总结

Qt布局管理器是Qt框架中用于自动调整和管理界面组件位置和大小的重要工具。以下是关于Qt布局管理器的小结:

  1. 作用与功能
    • 解决组件位置和大小无法自适应父窗口变化的问题。
    • 自动调整控件的位置,包括控件之间的间距、对齐等。
    • 当用户调整窗口大小时,位于布局管理器内的控件也会随之调整大小,保持界面的美观。
    • 无需手动调整每个控件的位置和大小,简化界面设计流程。
  2. 核心类与继承
    • QLayout是Qt布局管理器的抽象基类。
    • Qt提供了多种继承自QLayout的布局管理器类,如水平布局(QHBoxLayout)、垂直布局(QVBoxLayout)、网格布局(QGridLayout)和表单布局(QFormLayout)等。
  3. 优势
    • 自适应窗口大小和屏幕分辨率:Qt布局管理器能够自动调整控件的位置和大小,以适应不同的窗口大小和屏幕分辨率,确保应用程序在不同设备上都能良好显示。
    • 简化界面设计:布局管理器使得控件的排列和布局变得更加简单和直观,开发者可以更快地完成用户界面的设计。
    • 管理控件之间的关系:布局管理器可以管理控件之间的关系,如控件的对齐方式、间距等,使界面的设计更加协调和美观。
  4. 使用方法
    • 在Qt Designer中,可以通过拖拽布局管理器到界面中,然后向其中添加控件来创建布局。
    • 在代码中,可以使用布局管理器的构造函数和成员函数来创建和管理布局。例如,可以使用addWidget()函数向布局中添加控件,使用setSpacing()函数设置控件之间的间距等。

总之,Qt布局管理器是Qt框架中用于创建和维护良好用户界面的重要工具。通过合理使用布局管理器,可以大大提高应用程序的用户体验。

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

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

相关文章

申请公众号数量达标

一般可以申请多少个公众号?目前企业主体只能申请2个公众号,这也意味着想做矩阵公众号的难度提升了。有些公司靠着诸多不同分工的公众号形成一个个矩阵,获取不同领域的粉丝。比如,目前主体为xx旗下公众号,共有30个&…

3.1 掌握RDD的创建

在Apache Spark中,RDD(Resilient Distributed Dataset)是一个基本的、不可变的、分布式的和可分区的数据集。它能够自动进行容错处理,并支持在大规模集群上的并行操作。RDD之间存在依赖关系,可以实现管道化&#xff0c…

Mysql-存储引擎、索引、SQL优化和视图

存储引擎 mysql体系结构 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层 第二层架构主要完成大多数的核心服务功能,如SQL接口&#…

倪海夏的思维逻辑总结

1《天纪》是自然法则,自然法则是个《真理》, 《真理》不需要再证实,《真理》没有二元对立。 《真理》没有例外。 2研究任何学问(事物),批判去看,假设--验证--结果。 以果决其行&#xff0…

10个顶级的论文降重指令,让你的论文降重至1.9%

10个顶级的论文降重指令,本硕博写论文必备! 在ChatGPT4o对话框中输入:写一个Spring BootVue实现的车位管理系统的论文大纲,并对其具体章节进行详细描述。 几小时即可完成一份1万字论文的编写 在GPTS中搜索论文降重,使…

Milvus 使用过程中的常见问题集锦

引言 在使用Milvus的过程中,可能会遇到一些常见问题。这些问题可能涉及到配置、查询、数据同步等方面。 常见问题 以下是一些可能遇到的常见问题及其解决方法: 查询结果不正确: 可能原因:Milvus内部缓存与数据不一致&#xff0…

2024 电工杯高校数学建模竞赛(B题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的数学建模团队,我们将为你带来2024电工杯数学建模竞赛(B题)的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解…

Aware接口作用

介绍 Aware(感知)接口是一个标记,里面没有任何方法,实际方法定义都是子接口确定(相当于定义了一套规则,并建议子接口中应该只有一个无返回值的方法)。 我们知道spring已经定义好了很多对象,如…

2024 电工杯高校数学建模竞赛(A题)| 储能配置 |建模秘籍文章代码思路大全

铛铛!小秘籍来咯! 小秘籍团队独辟蹊径,运用负载均衡,多目标规划等强大工具,构建了这一题的详细解答哦! 为大家量身打造创新解决方案。小秘籍团队,始终引领着建模问题求解的风潮。 抓紧小秘籍&am…

微信小程序uniapp+django洗脚按摩足浴城消费系统springboot

原生wxml开发对Node、预编译器、webpack支持不好,影响开发效率和工程构建。所以都会用uniapp框架开发 前后端分离,后端给接口和API文档,注重前端,接近原生系统 使用Navicat或者其它工具,在mysql中创建对应名称的数据库&#xff0…

cn.hutool.poi.excel 实现excel导出效果 首行高度,行样式,颜色,合并单元格,例子样式

需求 接了需求,下载excel模版,本来看着还是简单的,然后实现起来一把泪,首先是使用poi,我查了好久,才实现,然后是我用easyexcel又实现了一遍,用了一个周多才实现。 这是需求&#x…

Python使用virtualenv创建虚拟环境

目录 第一步:安装virtualenv 第二步:选择一个文件夹用来放所创建的虚拟环境 第三步:创建虚拟环境 第四步:激活虚拟环境 第五步:退出虚拟环境 第六步:测试安装django 前提:你得有个python环…

【STL专题】深入探索C++之std::string:不止于字符串【万字详解】

欢迎来到CILMY23的博客 🏆本篇主题为:深入探索C之std::string:不止于字符串 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux &#x1f3…

aardio - godking.vlistEx虚表点击表头全选、排序

新版虚表内置了名称为 DefaultCheckedImg 和 DefaultUnCheckedImg 的两张图片,分别为 【选择框勾选状态默认图片】 和 【选择框未勾选状态默认图片】 以下代码调用了这两张图片,所以请将虚表库升级为最新版。 如果使用旧版库,可以自行添加这…

【Python自动化测试】:Unittest单元测试与HTMLTestRunner自动生成测试用例的好帮手

读者大大们好呀!!!☀️☀️☀️ 🔥 欢迎来到我的博客 👀期待大大的关注哦❗️❗️❗️ 🚀欢迎收看我的主页文章➡️寻至善的主页 文章目录 🔥前言🚀unittest编写测试用例🚀unittest测…

六种常用设计模式

单例设计模式 单例模式指在整个系统生命周期里,保证一个类只能产生一个实例,确保该类的唯一性。 单例模式分类 单例模式可以分为懒汉式和饿汉式,两者之间的区别在于创建实例的时间不同: 懒汉式:指系统运行中&#…

SpringBootWeb 篇-深入了解 Mybatis 删除、新增、更新、查询的基础操作与 SQL 预编译解决 SQL 注入问题

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Mybatis 的基础操作 2.0 基础操作 - 环境准备 3.0 基础操作 - 删除操作 3.1 SQL 预编译 3.2 SQL 预编译的优势 3.3 参数占位符 4.0 基础操作 - 新增 4.1 主键返回…

Python图像处理:从基础到高级的全方位指南

目录 第一部分:Python图像处理基础 1.1 图像处理概念 1.2 Python图像处理常用库 1.3 实战案例:图像显示与保存 1.4 注意事项 第二部分:Python图像处理高级技巧 2.1 图像变换 2.2 图像增强 2.3 图像复原 第三部分:Python…

20232802 黄千里 2023-2024-2 《网络攻防实践》实践十一报告

20232802 2023-2024-2 《网络攻防实践》实践十一报告 1.实践过程 1.1web浏览器渗透攻击 攻击机:kali172.20.10.10靶机:win2k172.20.10.3 首先在kali中启动msfconsole 输入命令search MS06-014,搜索渗透攻击模块 输入use exploit/window…

终于让我找到了,你也可以学会的人工智能-机器学习教程

给大家分享一套非常棒的python机器学习课程——《AI小天才:让小学生轻松掌握机器学习》,2024年5月完结新课,提供配套的代码笔记软件包下载!学完本课程,可以轻松掌握机器学习的全面应用,复杂特征工程&#x…