Qt学习:界面布局_qtl界面-程序员宅基地

技术标签: Qt  界面布局  

1.绝对位置定位(absolute positioning):控件布局是固定位置,没有自适应功能。
例子如下:

QWidget *pWidget = new QWidget;
QLabel label(pWidget);
label.setText(QObject::tr("姓名:"));
label.setGeometry(10,10,20,20);
QLineEdit namedLineEdit("小王",pWidget);
namedLineEdit.setGeometry(35,10,50,20);
 QPushButton *btn = new QPushButton(QObject::tr("关闭"),pWidget);
 btn->setGeometry(90,10,40,20);

2、布局管理器

(1)解决方案:布局管理器

–提供相关的类对界面组件进行布局管理

@1:能够自动排列窗口中的界面组件

@2:窗口变化后自动更新界面组件的大小

(2)QLayout是Qt中布局管理器的抽象基类

(3)通过继承QLayout实现了功能各异且互补的布局管理器

(4)Qt中可以根据需要自定义布局管理器

(5)布局管理器不是界面组件,而是界面部件的定位策略
QLayout 是Qt布局管理器中抽象的基类
QBoxLayout QGridLayout QFormLayout QStackedLayout这几个类都继承自QLayout。

(6)QBoxLayout布局管理器
–以水平或者垂直的方式管理界面组件
QBoxLayout有两个子类,
一个是垂直管理界面组件的类,QVBoxLayout
一个是水平管理界面组件的类, QHBoxLayout

(7)QVBoxLayout的使用(假设已经创建了四个按钮对象,test1,test2,test3,test4)

		QVBoxLayout *layout = new QVBoxLayout();	//创建一个布局管理器对象
		test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);	//函数有两个参数,前一个参数是关于垂直的,后一个是关于水平的,这里设置的是垂直和
																				//水平的大小都会随着窗口的变化而变化
		test1.setMinimumSize(160, 30);	//设置这个按钮最小是160, 30
			
		layout->setSpaceing(30);	//调用布局管理器中的这个成员函数,可以设置部件的空间,间隔,部件之间的距离是30个像素
																																							
		
		layout->addWidget(&test1);	//将test1这个按钮部件添加到布局管理器,意思是让这个垂直的布局管理器进行管理
		layout->addWidget(&test2);	//将test2这个按钮部件添加到布局管理器,意思是让这个垂直的布局管理器进行管理
		layout->addWidget(&test3);	//将test3这个按钮部件添加到布局管理器,意思是让这个垂直的布局管理器进行管理
		layout->addWidget(&test4);	//将test4这个按钮部件添加到布局管理器,意思是让这个垂直的布局管理器进行管理
		
		setLayout(layout);		//调用setLayout函数设置布局管理器为这个layout

但是经过这几部的操作,我们发现界面跟着变大的时候,这几个按钮也会随着变化,但仅仅只是宽度的变化,而按钮的高度却没有随着主窗口的变化而变化,解决的方法有。

这时就用到了这个QSizePolicy类,继承自QWidget,因为QWidget是基类,这个类我们可以在Qt的帮助文档中详细的看,大概的意思就是一个大小的策略,是当有布局管理器存在的时候起作用。当布局管理器时
这个QSizePolicy类的大小的策略,就会被布局管理器所使用。大小策略的函数是setSizePolicy();

(8)水平管理器QHBoxLayout的使用和垂直管理器QVBoxLayout的使用方式一样

(9)布局管理器可以相互嵌套,形成更加复杂的布局方式。所以Qt中提供的四个布局管理器,可以相互的配合,完成几乎所有的常用的界面布局。

–布局嵌套几乎可以完成所有常用的界面布局

–自定义布局管理类可以达到个性化界面布局的效果

如:

#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent), Test1(this), Test2(this), Test3(this), Test4(this)
{

   // testQVBoxLayout();
   // testQHBoxLayout();
    qiantao_QV_QHlayout();
}

void Widget::testQVBoxLayout()  //垂直管理器的布局
{
    Test1.setText("Test1Button");
    Test2.setText("Test2Button");
    Test3.setText("Test3Button");
    Test4.setText("Test4Button");

    Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    //设置大小策略,当有布局管理器时起作用,窗口变化
                                                                            //按钮垂直和水平大小都会有扩展,不会只宽度变
    Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    Test1.setMinimumSize(160, 30);  //设置按钮最小的宽度和高度为160和30,不能在小了
    Test2.setMinimumSize(160, 30);
    Test3.setMinimumSize(160, 30);
    Test4.setMinimumSize(160, 30);


    QVBoxLayout *vlayout = new QVBoxLayout();   //创建一个垂直管理器的对象

    vlayout->setSpacing(30);    //设置这个布局管理器中的组件间间隔是30个像素

    vlayout->addWidget(&Test1); //将这个按钮组件添加到vlayout这个垂直布局管理器中
    vlayout->addWidget(&Test2);
    vlayout->addWidget(&Test3);
    vlayout->addWidget(&Test4);

    setLayout(vlayout); //设置布局管理器为这个

}

void Widget::testQHBoxLayout()  //水平管理器的布局
{
    Test1.setText("Test1Button");
    Test2.setText("Test2Button");
    Test3.setText("Test3Button");
    Test4.setText("Test4Button");

    Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    //设置大小策略,当有布局管理器时起作用,窗口变化
                                                                            //按钮垂直和水平大小都会有扩展,不会只宽度变
    Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    Test1.setMinimumSize(160, 30);  //设置按钮最小的宽度和高度为160和30,不能在小了
    Test2.setMinimumSize(160, 30);
    Test3.setMinimumSize(160, 30);
    Test4.setMinimumSize(160, 30);


    QHBoxLayout *hlayout = new QHBoxLayout();   //创建一个水平管理器的对象

    hlayout->setSpacing(30);    //设置这个布局管理器中的组件间间隔是30个像素

    hlayout->addWidget(&Test1); //将这个按钮组件添加到vlayout这个垂直布局管理器中
    hlayout->addWidget(&Test2);
    hlayout->addWidget(&Test3);
    hlayout->addWidget(&Test4);

    setLayout(hlayout); //设置布局管理器为这个
}

void Widget::qiantao_QV_QHlayout()  //嵌套的布局管理器,水平和垂直的嵌套
{
    Test1.setText("Test1Button");
    Test2.setText("Test2Button");
    Test3.setText("Test3Button");
    Test4.setText("Test4Button");

    Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    //设置大小策略,当有布局管理器时起作用,窗口变化
                                                                            //按钮垂直和水平大小都会有扩展,不会只宽度变
    Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    Test1.setMinimumSize(160, 30);  //设置按钮最小的宽度和高度为160和30,不能在小了
    Test2.setMinimumSize(160, 30);
    Test3.setMinimumSize(160, 30);
    Test4.setMinimumSize(160, 30);

    QVBoxLayout *vlayout = new QVBoxLayout();

    QHBoxLayout *hlayout1 = new QHBoxLayout();
    QHBoxLayout *hlayout2 = new QHBoxLayout();
    hlayout1->setSpacing(20);   //设置水平布局管理器1中的组件间隔是20个像素
    hlayout2->setSpacing(20);   //设置水平布局管理器2中的组件间隔是20个像素

    hlayout1->addWidget(&Test1);
    hlayout1->addWidget(&Test2);
    hlayout2->addWidget(&Test3);
    hlayout2->addWidget(&Test4);

    vlayout->setSpacing(20);    //设置垂直布局管理器中的两个布局管理器的间隔是20个像素
    vlayout->addLayout(hlayout1);   //添加管理布局时,要用addLayout,不能用addWidget了
    vlayout->addLayout(hlayout2);

    setLayout(vlayout); //告诉当前的窗口,有vlayout这个布局管理器来帮忙管理

}

Widget::~Widget()
{
    
}


3、布局管理器中的比例系数

(1)默认情况下以等比例的方式更新组件的大小(就是在窗口大小变化的时候,布局管理器管理的组件的大小变化是等比例的)

(2)可以自定义组件大小更新时的比例系数(就是在窗口大小进行变化的时候,布局管理器管理的组件其大小的变化可以自定义)

(3)QBoxLayout中的比例系数设置

–void setStretch(int index, int stretch) //第一个参数是当前布局管理器中(QBoxLayout)格子的下标,第二个参数是比例系数

–bool setStretchFactor(QWidget *Widget, int stretch) //第一个参数是当前QBoxLayout中的具体的组件,第二参数是比例系数

–bool setStretchFactor(QLayout *Layout, int stretch) //第一个参数是被嵌套的具体的布局管理器,第二个参数是比例系数

(4)void setStretch(int index, int stretch)函数的使用,通过下标(格子)来指定。

QVBoxLayout *layout = new QVBoxLayout();

layout->setStretch(0, 1);	//设置布局管理器QVBoxLayout中的第0个格子的比例系数为1	
layout->setStretch(1, 1);
layout->setStretch(2, 2);
layout->setStretch(3, 2);

layout->addWidget(&Test1); //将这个按钮组件添加到layout这个垂直布局管理器中
layout->addWidget(&Test2);
layout->addWidget(&Test3);
layout->addWidget(&Test4);

setLayout(layout); //设置布局管理器为这个

当窗口进行变化的时候,QVBoxLayout布局管理器中的四个test,大小的变化是1122的变化,比例系数是1:1:2:2

(5)bool setStretchFactor(QWidget *Widget, int stretch)函数的使用,指定具体的布局管理器中的组件

	QVBoxLayout *layout = new QVBoxLayout();

	layout->setStretchFactor(&Test1, 1);	//设置布局管理器QVBoxLayout中的Test1这个组件的比例系数为1	
	layout->setStretchFactor(&Test2, 1);
	layout->setStretchFactor(&Test3, 2);
	layout->setStretchFactor(&Test4, 2);
	
	layout->addWidget(&Test1); //将这个按钮组件添加到layout这个垂直布局管理器中
	layout->addWidget(&Test2);
	layout->addWidget(&Test3);
	layout->addWidget(&Test4);

	setLayout(layout); //设置布局管理器为这个

(6)bool setStretchFactor(QLayout *Layout, int stretch)函数的使用,指定布局管理器中嵌套的布局管理器,设置其的比例系数

	QVBoxLayout *vlayout = new QVBoxLayout();

	QHBoxLayout *hlayout1 = new QHBoxLayout();
	QHBoxLayout *hlayout2 = new QHBoxLayout();
	hlayout1->setSpacing(20);   //设置水平布局管理器1中的组件间隔是20个像素
	hlayout2->setSpacing(20);   //设置水平布局管理器2中的组件间隔是20个像素

	hlayout1->addWidget(&Test1);
	hlayout1->addWidget(&Test2);
	hlayout2->addWidget(&Test3);
	hlayout2->addWidget(&Test4);

	vlayout->setSpacing(20);    //设置垂直布局管理器中的两个布局管理器的间隔是20个像素
	vlayout->addLayout(hlayout1);   //添加管理布局时,要用addLayout,不能用addWidget了
	vlayout->addLayout(hlayout2);
	
	vlayout->setStretchFactor(hlayout1, 1);	//设置vlayout这个垂直的布局管理器中的hlayout1这个嵌套的水平管理器的比例系数为1
	vlayout->setStretchFactor(hlayout2, 2);	//设置vlayout这个垂直的布局管理器中的hlayout2这个嵌套的水平管理器的比例系数为2

	setLayout(vlayout); //告诉当前的窗口,有vlayout这个布局管理器来帮忙管理

(7)组件的初始大小是独立于布局管理器设置的,因此不能保证组件的大小始终符合比例系数的设置(比如,开始的时候,设置了按钮的最小的大小,但是后面布局管理器接手管理这几个按钮
后,设置了按钮的变化的比例系数,但这样并不会让开始的时候,按钮的大小就是按照比例系数设置的那样的大小,而是我们开始时设置的按钮的最小的大小)

例:布局管理器的比例系数的设置,详细代码

#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent), Test1(this), Test2(this), Test3(this), Test4(this)
{

    //testQVBoxLayout();
   // testQHBoxLayout();
    qiantao_QV_QHlayout();
}

void Widget::testQVBoxLayout()  //垂直管理器的布局
{
    Test1.setText("Test1Button");
    Test2.setText("Test2Button");
    Test3.setText("Test3Button");
    Test4.setText("Test4Button");

    Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    //设置大小策略,当有布局管理器时起作用,窗口变化
                                                                            //按钮垂直和水平大小都会有扩展,不会只宽度变
    Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    Test1.setMinimumSize(160, 30);  //设置按钮最小的宽度和高度为160和30,不能在小了
    Test2.setMinimumSize(160, 30);
    Test3.setMinimumSize(160, 30);
    Test4.setMinimumSize(160, 30);


    QVBoxLayout *vlayout = new QVBoxLayout();   //创建一个垂直管理器的对象

    vlayout->setSpacing(30);    //设置这个布局管理器中的组件间间隔是30个像素

    vlayout->addWidget(&Test1); //将这个按钮组件添加到vlayout这个垂直布局管理器中
    vlayout->addWidget(&Test2);
    vlayout->addWidget(&Test3);
    vlayout->addWidget(&Test4);

    vlayout->setStretch(0, 1);  //设置vlayout这个布局管理器中的第0个格子的比例系数为1
    vlayout->setStretch(1, 1);
    vlayout->setStretch(2, 3);
    vlayout->setStretch(3, 3);

    setLayout(vlayout); //设置布局管理器为这个

}

void Widget::testQHBoxLayout()  //水平管理器的布局
{
    Test1.setText("Test1Button");
    Test2.setText("Test2Button");
    Test3.setText("Test3Button");
    Test4.setText("Test4Button");

    Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    //设置大小策略,当有布局管理器时起作用,窗口变化
                                                                            //按钮垂直和水平大小都会有扩展,不会只宽度变
    Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    Test1.setMinimumSize(160, 30);  //设置按钮最小的宽度和高度为160和30,不能在小了
    Test2.setMinimumSize(160, 30);
    Test3.setMinimumSize(160, 30);
    Test4.setMinimumSize(160, 30);


    QHBoxLayout *hlayout = new QHBoxLayout();   //创建一个水平管理器的对象

    hlayout->setSpacing(30);    //设置这个布局管理器中的组件间间隔是30个像素

    hlayout->addWidget(&Test1); //将这个按钮组件添加到vlayout这个垂直布局管理器中
    hlayout->addWidget(&Test2);
    hlayout->addWidget(&Test3);
    hlayout->addWidget(&Test4);

    hlayout->setStretchFactor(&Test1, 1);   //设置这个hlayout布局管理器中的Test1这个按钮组件的比例系数变化是1
    hlayout->setStretchFactor(&Test2, 2);
    hlayout->setStretchFactor(&Test3, 1);
    hlayout->setStretchFactor(&Test4, 2);


    setLayout(hlayout); //设置布局管理器为这个
}

void Widget::qiantao_QV_QHlayout()  //嵌套的布局管理器,水平和垂直的嵌套
{
    Test1.setText("Test1Button");
    Test2.setText("Test2Button");
    Test3.setText("Test3Button");
    Test4.setText("Test4Button");

    Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    //设置大小策略,当有布局管理器时起作用,窗口变化
                                                                            //按钮垂直和水平大小都会有扩展,不会只宽度变
    Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    Test1.setMinimumSize(160, 30);  //设置按钮最小的宽度和高度为160和30,不能在小了
    Test2.setMinimumSize(160, 30);
    Test3.setMinimumSize(160, 30);
    Test4.setMinimumSize(160, 30);

    QVBoxLayout *vlayout = new QVBoxLayout();

    QHBoxLayout *hlayout1 = new QHBoxLayout();
    QHBoxLayout *hlayout2 = new QHBoxLayout();
    hlayout1->setSpacing(20);   //设置水平布局管理器1中的组件间隔是20个像素
    hlayout2->setSpacing(20);   //设置水平布局管理器2中的组件间隔是20个像素

    hlayout1->addWidget(&Test1);
    hlayout1->addWidget(&Test2);
    hlayout2->addWidget(&Test3);
    hlayout2->addWidget(&Test4);

    vlayout->setSpacing(20);    //设置垂直布局管理器中的两个布局管理器的间隔是20个像素
    vlayout->addLayout(hlayout1);   //添加管理布局时,要用addLayout,不能用addWidget了
    vlayout->addLayout(hlayout2);

    vlayout->setStretchFactor(hlayout1, 1); //设置vlayout这个布局管理器中的hlayout1嵌套布局管理器变化时的比例系数为1
    vlayout->setStretchFactor(hlayout2, 5);//设置vlayout这个布局管理器中的hlayout1嵌套布局管理器变化时的比例系数为5

    setLayout(vlayout); //告诉当前的窗口,有vlayout这个布局管理器来帮忙管理

}

Widget::~Widget()
{
    
}

4、QGridLayout布局管理器,网格的布局管理利器

(1)以网格(二维)的方式管理界面组件

(2)QGridLayout中的比例系数设置(是针对行和列的比例系数)

–void setColumnStretch(int column, int stretch) //设置哪一列的比例系数。第一个参数就是布局管理器的哪一列,第二参数就是比例系数

–void setRowStretch(int row, int stretch) //设置哪一个行的比例系数,第一个参数就是布局管理器的哪一行,第二个参数就是比例系数

(3)QGridLayout布局管理器的使用方法

		QGridLayout *layout = new QGridLayout();

		layout->setSpacing(10);	//设置组件的间隔为10像素
		layout->addWidget(&Test1, 0, 0);	//将Test1这个按钮,放在二维网络的0,0这个位置,也就是左上角的位置
		layout->addWidget(&Test2, 0, 1);	//将Test2这个按钮,放在二维网络的0,1这个位置,也就是右上角的位置
		layout->addWidget(&Test3, 1, 0);
		layout->addWidget(&Test4, 1, 1);

		layout->setRowStretch(0, 1);	//设置第0行的比例系数为1
		layout->setRowStretch(1, 3);	//设置第1行的比例系数为3

		layout->setColumnStretch(0, 1);	//设置第0列的比例系数为1
		layout->setColumnStretch(1, 3);	//设置第1列的比例系数为3

		setLayout(layout);

(4)QGridLayout布局管理器的使用方法(跨行和跨列的使用,就是占用多行多列的使用)

		QGridLayout *layout = new QGridLayout();

		layout->setSpacing(10);	//设置组件的间隔为10像素
		layout->addWidget(&Test1, 0, 0, 2, 1);	//将Test1这个按钮,放在二维网络的0,0这个位置,也就是左上角的位置,并且占两行一列的空间,这就是第四个参数和第五个参数
		layout->addWidget(&Test2, 0, 1, 2, 1);	//将Test2这个按钮,放在二维网络的0,1这个位置,也就是右上角的位置,并且占两行一列的
		layout->addWidget(&Test3, 2, 0, 1, 2);	//将Test3按钮,放在第2行0列的位置,并且占1行2列的位置空间。
		layout->addWidget(&Test4, 3, 0, 1, 2);	//将Test4按钮,放在第3行0列的位置,并且占用1行2列的位置空间

		layout->setRowStretch(0, 1);	//设置第0行的比例系数为1
		layout->setRowStretch(1, 3);	//设置第1行的比例系数为3

		layout->setColumnStretch(0, 1);	//设置第0列的比例系数为1
		layout->setColumnStretch(1, 3);	//设置第1列的比例系数为3

		setLayout(layout);

(5)QGridLayout布局管理器也支持嵌套其他布局管理器

(6)QGridLayout布局管理器的使用方法,代码

#include "widget.h"
#include <QGridLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent), Test1(this), Test2(this), Test3(this), Test4(this)
{
   // testQGridLayout1();
    testQGridLayout2();
}


void Widget::testQGridLayout1()
{
    Test1.setText("Test1button");
    Test2.setText("Test2button");
    Test3.setText("Test3button");
    Test4.setText("Test4button");


    //设置大小策略,当有布局管理器时起作用,窗口变化
    //按钮垂直和水平大小都会有扩展,不会只宽度变
    Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    Test1.setMinimumSize(160, 30);
    Test2.setMinimumSize(160, 30);
    Test3.setMinimumSize(160, 30);
    Test4.setMinimumSize(160, 30);

    QGridLayout *Layout = new QGridLayout();

    Layout->setSpacing(10);
    Layout->addWidget(&Test1, 0, 0);
    Layout->addWidget(&Test2, 0, 1);
    Layout->addWidget(&Test3, 1, 0);
    Layout->addWidget(&Test4, 1, 1);

    Layout->setRowStretch(0, 1);    //设置第0行的比例系数为1
    Layout->setRowStretch(1, 3);    //设置第1行的比例系数为3
    Layout->setColumnStretch(0, 1); //设置第0列的比例系数为1
    Layout->setColumnStretch(1, 3); //设置第1列的比例系数为3

    setLayout(Layout);

}

void Widget::testQGridLayout2()
{
    Test1.setText("Test1button");
    Test2.setText("Test2button");
    Test3.setText("Test3button");
    Test4.setText("Test4button");

    //设置大小策略,当有布局管理器时起作用,窗口变化
    //按钮垂直和水平大小都会有扩展,不会只宽度变
    Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    Test1.setMinimumSize(160, 30);
    Test2.setMinimumSize(160, 30);
    Test3.setMinimumSize(160, 30);
    Test4.setMinimumSize(160, 30);

    QGridLayout *Layout = new QGridLayout();

    Layout->setSpacing(10);
	Layout->addWidget(&Test1, 0, 0, 2, 1); 	 	//设置按钮1在0,0位置,占用2行1列
	Layout->addWidget(&Test2, 0, 1, 2, 1); 		//设置按钮2在0,1位置,占用2行1列
    Layout->addWidget(&Test3, 3, 0, 1, 2);      //设置按钮3在3,0位置,占用1行2列
    Layout->addWidget(&Test4, 4, 0, 1, 2);      //设置按钮4在4,0位置,占用1行2列

    Layout->setRowStretch(0, 1);    //设置第0行的比例系数为1
    Layout->setRowStretch(1, 3);    //设置第1行的比例系数为3
    Layout->setColumnStretch(0, 1); //设置第0列的比例系数为1
    Layout->setColumnStretch(1, 3); //设置第1列的比例系数为3

    setLayout(Layout);
}

Widget::~Widget()
{
    
}

小结:QGridLayout一以网格的方式对组件进行管理,QGridLayout中的组件可以根据需要跨越多个网格,QBoxLayout和QGridLayout支持比例系数的概念,比例系数决定了组件大小的相对变化

5、QFormLayout布局管理器

(1)以表单(Form)的方式管理界面组件(就是标签和组件是一起的,之间是相互对应的关系,一个标签一个组件,一个标签一个组件这样的)

(2)表单布局中的标签和组件是相互对应的关系

(3)QFormLayout的用法概要

–void addRow(QWidget *label, QWidget *field)

–void addRow(QWidget *label, QLayout *field)

–void addRow(const QString& LabelText, QWidget *field)

–void addRow(const QString& labelText, QLayout *field)

表单布局支持嵌套,其他布局管理器可以作为子布局被其管理

(4)例,QFormLayout表单布局管理器的使用

#include "widget.h"
#include <QLineEdit>
#include <QFormLayout>  //包含表单形式的布局管理器,标签和组件相互对应

Widget::Widget(QWidget *parent)
	: QWidget(parent, Qt::WindowCloseButtonHint)    //加上后面的属性,就只有关闭的按钮在窗口上
{
	QLineEdit *NameEdit = new QLineEdit();  //创建一个文本框组件
	QLineEdit *Email = new QLineEdit();
	QLineEdit *Address = new QLineEdit();

	QFormLayout *Layout = new QFormLayout();    //创建一个表单形式管理的布局管理器对象


	Layout->addRow("Name: ", NameEdit); //第一个参数就是标签,第二个参数就是组件,这两者是相互对应的关系,在窗口变化时,两者的距离不会改变
	Layout->addRow("Email: ", Email);
	Layout->addRow("Address", Address);

	this->setLayout(Layout);
	this->setWindowTitle("FTP");    //设置主窗口的标题
}

Widget::~Widget()
{
	
}

(5)QFormLayout的样式函数

–void setRowWrapPolicy(RowWrapPolicy policy) //这个函数用来设置每一行的排布方式

–void setLabelAlignment(Qt::Alignment alignment) //这个函数是用设置标签是如何对齐的,左对齐还是右对齐

@1:Layout->setRowWrapPolicy(QFormLayout::WrapAllRows); //WrapAllRows这个常量,这样的就会使得,将来显示出来的标签在上面,组件在下面,这是嵌入式中最常用的样式
@2:Layout->setLabelAlignment(Qt::AlignRight); //这样就会使得,将来显示的标签是向右对齐的

(6)QFormLayout这个表单形式的布局管理器也具备支持嵌套布局管理器的能力

小结:QFormLayout以表单的方式管理界面组件的,它的样式简洁明了,支持布局管理器的相互嵌套,是嵌入式产品中最常用的布局方式

例:QFormLayout的样式函数使用方法

	#include "widget.h"
	#include <QLineEdit>
	#include <QFormLayout>  //包含表单形式的布局管理器,标签和组件相互对应

	Widget::Widget(QWidget *parent)
		: QWidget(parent, Qt::WindowCloseButtonHint)    //加上后面的属性,就只有关闭的按钮在窗口上
	{
		QLineEdit *NameEdit = new QLineEdit();  //创建一个文本框组件
		QLineEdit *Email = new QLineEdit();
		QLineEdit *Address = new QLineEdit();

		QFormLayout *Layout = new QFormLayout();    //创建一个表单形式管理的布局管理器对象


		Layout->addRow("Name: ", NameEdit); //第一个参数就是标签,第二个参数就是组件,这两者是相互对应的关系,在窗口变化时,两者的距离不会改变
		Layout->addRow("Email: ", Email);
		Layout->addRow("Address", Address);

		Layout->setRowWrapPolicy(QFormLayout::WrapAllRows); //设置表单布局的样式,这个常量,表示设置为上面是标签下面是组件的形式
	   // Layout->setRowWrapPolicy(QFormLayout::WrapLongRows);    //设置为如果标签不管多长都能显示出来,屏幕如果不够,会将组件弄到下面
		//Layout->setLabelAlignment(Qt::AlignRight);  //设置标签为向右对齐

		this->setLayout(Layout);
		this->setWindowTitle("FTP");    //设置主窗口的标题
	}

	Widget::~Widget()
	{
		
	}

6、最特别的布局管理器

(1)栈式布局管理器(QStackedLayout),就是所有组件是垂直于屏幕的,以栈的形式堆叠在一起的,我们的视线只能看到在栈顶的组件,并且只能看到一个组件。

–所有组件在垂直于屏幕的方向上被管理

–每次只有一个组件会显示在屏幕上

–只有最顶层的组件会被最终显示

(2)栈式布局管理器的特点

–组件大小一致且充满父组件的显示区

–不能直接嵌套其他布局管理器(成员函数只接受管理组件,但可以通过间接的方式管理其他布局管理器,也就是嵌套)

–能够自由切换需要显示的组件

–每次能且仅能显示一个组件

(3)QStackedLayout栈式布局管理器的用法概要

–int addWidget(QWidget *widget) //向这个栈式布局管理器中,加入它要管理的组件,每次加入一个组件的时候,这些组件都会有一个下标

–QWidget* currentWidget() //得到当前显示在屏幕上的组件是哪一个(也就是返回当前栈式布局管理器中最顶层的那一个组件)

–void setCurrentIndex(int index) //设置哪个下标的组件为当前的顶层组件,也就是要显示的组件。在每一个组件添加到这个栈式布局管理器中的时候,都会有一个下标(从0开始)

–int currentIndex() //得到当前组件的下标

例:栈式布局管理器的使用

#include "widget.h"
#include <QStackedLayout>


Widget::Widget(QWidget *parent)
    : QWidget(parent), TestButton1(this), TestButton2(this), TestButton3(this), TestButton4(this)
{
    QStackedLayout *slayout = new QStackedLayout(); //创建一个栈式布局管理器对象

    TestButton1.setText("Button 1");
    TestButton2.setText("Button 2");
    TestButton3.setText("Button 3");
    TestButton4.setText("Button 4");



    slayout->addWidget(&TestButton1);   //将button1加入到这个栈式布局管理器中 0
    slayout->addWidget(&TestButton2);   //1
    slayout->addWidget(&TestButton3);   //2
    slayout->addWidget(&TestButton4);   //3

    slayout->setCurrentIndex(1);    //设置当前显示的组件是第二个组件,0是第一个

    setLayout(slayout);
}

Widget::~Widget()
{
    
}

例://栈式布局管理器的间接嵌套其他的布局管理器

#include "widget.h"
#include <QStackedLayout>   //栈式布局管理器
#include <QHBoxLayout>  //水平布局管理器

Widget::Widget(QWidget *parent)
    : QWidget(parent), TestButton1(this), TestButton2(this), TestButton3(this), TestButton4(this)
{
    //testQStackedLayout();
    testQStacked_QH_Layout();
}

void Widget::testQStackedLayout()
{
    QStackedLayout *slayout = new QStackedLayout(); //创建一个栈式布局管理器对象

    TestButton1.setText("Button 1");
    TestButton2.setText("Button 2");
    TestButton3.setText("Button 3");
    TestButton4.setText("Button 4");



    slayout->addWidget(&TestButton1);   //将button1加入到这个栈式布局管理器中 0
    slayout->addWidget(&TestButton2);   //1
    slayout->addWidget(&TestButton3);   //2
    slayout->addWidget(&TestButton4);   //3

    slayout->setCurrentIndex(1);    //设置当前显示的组件是第二个组件,0是第一个

    setLayout(slayout);
}

//用栈式布局管理器,间接地嵌套了水平布局管理器,依赖一个中间组件widget,这个组件中有布局管理器,这个中间组件中的布局管理器管理的组件的父组件为
//这个中间组件。之后将这个中间组件加入到栈式的布局管理器中,这样就达到了栈式布局管理器间接的嵌套了其他布局管理器,因为栈式布局管理器中的成员函数
//addWidget().这个添加组件的成员函数,只接受QWidget类型的指针对象。所以只能接受组件,不能接受布局管理器

void Widget::testQStacked_QH_Layout()
{
    QStackedLayout *slayout = new QStackedLayout(); //创建一个栈式布局管理器对象
    QHBoxLayout *hlayout = new QHBoxLayout();   //创建一个水平布局管理器对象
    QWidget *widget = new QWidget();    //创建一个组件对象
    TestButton1.setText("Button 1");
    TestButton2.setText("Button 2");
    TestButton3.setText("Button 3");
    TestButton4.setText("Button 4");

    TestButton2.setParent(widget);      //设置按钮2的父组件为新创建的widget对象
    TestButton3.setParent(widget);      //设置按钮3的父组件为新创建的widget对象

    hlayout->addWidget(&TestButton2);   //将按钮2添加到水平布局管理器中
    hlayout->addWidget(&TestButton3);   //将按钮3添加到水平布局管理器中

    widget->setLayout(hlayout);         //设置widget这个组件的窗口为hlayout这个布局管理器管理

    slayout->addWidget(&TestButton1);   //将按钮1添加到这个栈式布局管理器中 0
    slayout->addWidget(widget);         //将widget这个窗口组件添加到这个栈式布局管理器中,这个窗口组件中用水平管理器管理了两个按钮 1
    slayout->addWidget(&TestButton4);   //将按钮4添加到这个栈式布局管理器中 2

    slayout->setCurrentIndex(1);

    setLayout(slayout);    //设置当前窗口组件是用的栈式布局管理器


}

Widget::~Widget()
{


}

(4)当时上面的栈式布局管理器,我们是用代码的方式,来指定显示在顶层的组件是哪一个,并不能达到动态的效果,所以接下来我们就要解决这个问题了

7、计时器的概念

(1)计时器是工程开发中非常重要的角色

(2)计时器用于每个一定的时间触发一个消息的

(3)计时器消息最终会被转化为函数调用

(4)宏观上:计时器在每个时间间隔会调用指定的函数

8、Qt中的计时器(QTimer)在QtCore这个头文件中

(1)计时器(QTimer)的使用方法

	@1:编写计时器消息处理函数		
	@2:在程序中创建计时器对象		
	@3:连接计时器消息和消息处理函数(信号和槽,信号就是计时器的消息,槽就是消息处理函数。用connect函数连接)		
	@4:设置计时器时间间隔并启动计时

(2)在类中声明这个槽(消息处理函数),将来用来计时器时间到了的时候发消息所触发的消息处理函数。创建QTimer这个计时器对象,在QtCore这个头文件中。用connect函数进行信号消息和槽
消息处理函数连接,发消息的对象是刚创建的QTimer的对象,信号是timerout()信号,this,槽就是刚才编写的消息处理函数。最后启动计时器,调用start成员函数启动(start(2000),2S发
计时器时间到发一次消息)

(3)例:计时器的使用

//类中要声明槽函数
private slots:  //声明槽函数
    void timetimerout();
	
//计时器的使用测试
void Widget::testtimer()
{
    QTimer *timer = new QTimer();   //创建一个计时器对象

    connect(timer, SIGNAL(timeout()), this, SLOT(timetimerout())); //timeout()为计时器的信号

    timer->start(2000); //启动计时,并设置2S计时时间到
}

//计时器的消息处理函数
void Widget::timetimerout()
{
    qDebug() << "timetimerout";
}

(4)用计时器来完成栈式布局管理器中的组件的逐个显示,布局管理器中的coutn()成员函数可以获取当前布局管理器中管理的组件个数

void Widget::timetimerout()
{
    //layout()函数会将当前组件中的布局管理器直接返回,当时返回的布局管理器类型是Layout的指针类型,所以我们要给装换成我们的布局管理器类型
    QStackedLayout *slayout = dynamic_cast<QStackedLayout*>(layout());

}

(5)例:栈式布局管理器,和计时器的方式循环显示栈式布局管理器中的各个组件

#include "widget.h"
#include <QStackedLayout>   //栈式布局管理器
#include <QHBoxLayout>  //水平布局管理器
#include <QtCore>   //使用计时器要包含这个
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent), TestButton1(this), TestButton2(this), TestButton3(this), TestButton4(this)
{
    //testQStackedLayout();
    //testQStacked_QH_Layout();
    //testtimer();
    test_Timer_QStacked_QH_Layout();
}

void Widget::testQStackedLayout()
{
    QStackedLayout *slayout = new QStackedLayout(); //创建一个栈式布局管理器对象

    TestButton1.setText("Button 1");
    TestButton2.setText("Button 2");
    TestButton3.setText("Button 3");
    TestButton4.setText("Button 4");



    slayout->addWidget(&TestButton1);   //将button1加入到这个栈式布局管理器中 0
    slayout->addWidget(&TestButton2);   //1
    slayout->addWidget(&TestButton3);   //2
    slayout->addWidget(&TestButton4);   //3

    slayout->setCurrentIndex(1);    //设置当前显示的组件是第二个组件,0是第一个

    setLayout(slayout);
}
//用栈式布局管理器,间接地嵌套了水平布局管理器,依赖一个中间组件widget,这个组件中有布局管理器,这个中间组件中的布局管理器管理的组件的父组件为
//这个中间组件。之后将这个中间组件加入到栈式的布局管理器中,这样就达到了栈式布局管理器间接的嵌套了其他布局管理器,因为栈式布局管理器中的成员函数
//addWidget().这个添加组件的成员函数,只接受QWidget类型的指针对象。所以只能接受组件,不能接受布局管理器
void Widget::testQStacked_QH_Layout()
{
    QStackedLayout *slayout = new QStackedLayout(); //创建一个栈式布局管理器对象
    QHBoxLayout *hlayout = new QHBoxLayout();   //创建一个水平布局管理器对象
    QWidget *widget = new QWidget();    //创建一个组件对象

    TestButton1.setText("Button 1");
    TestButton2.setText("Button 2");
    TestButton3.setText("Button 3");
    TestButton4.setText("Button 4");

    TestButton2.setParent(widget);      //设置按钮2的父组件为新创建的widget对象
    TestButton3.setParent(widget);      //设置按钮3的父组件为新创建的widget对象

    hlayout->addWidget(&TestButton2);   //将按钮2添加到水平布局管理器中
    hlayout->addWidget(&TestButton3);   //将按钮3添加到水平布局管理器中

    widget->setLayout(hlayout);         //设置widget这个组件的窗口为hlayout这个布局管理器管理

    slayout->addWidget(&TestButton1);   //将按钮1添加到这个栈式布局管理器中 0
    slayout->addWidget(widget);         //将widget这个窗口组件添加到这个栈式布局管理器中,这个窗口组件中用水平管理器管理了两个按钮 1
    slayout->addWidget(&TestButton4);   //将按钮4添加到这个栈式布局管理器中 2

    slayout->setCurrentIndex(1);

    setLayout(slayout);    //设置当前窗口组件是用的栈式布局管理器


}

//计时器的方法,每隔2S来逐个显示栈式布局管理器中的组件
void Widget::test_Timer_QStacked_QH_Layout()
{
    QStackedLayout *slayout = new QStackedLayout(); //创建一个栈式布局管理器对象
    QHBoxLayout *hlayout = new QHBoxLayout();   //创建一个水平布局管理器对象
    QWidget *widget = new QWidget();    //创建一个组件对象
    QTimer *timer = new QTimer();   //创建一个计时器对象

    TestButton1.setText("Button 1");
    TestButton2.setText("Button 2");
    TestButton3.setText("Button 3");
    TestButton4.setText("Button 4");

    TestButton2.setParent(widget);      //设置按钮2的父组件为新创建的widget对象
    TestButton3.setParent(widget);      //设置按钮3的父组件为新创建的widget对象

    hlayout->addWidget(&TestButton2);   //将按钮2添加到水平布局管理器中
    hlayout->addWidget(&TestButton3);   //将按钮3添加到水平布局管理器中

    widget->setLayout(hlayout);         //设置widget这个组件的窗口为hlayout这个布局管理器管理

    slayout->addWidget(&TestButton1);   //将按钮1添加到这个栈式布局管理器中 0
    slayout->addWidget(widget);         //将widget这个窗口组件添加到这个栈式布局管理器中,这个窗口组件中用水平管理器管理了两个按钮 1
    slayout->addWidget(&TestButton4);   //将按钮4添加到这个栈式布局管理器中 2

    slayout->setCurrentIndex(1);

    setLayout(slayout);    //设置当前窗口组件是用的栈式布局管理器

    connect(timer, SIGNAL(timeout()), this, SLOT(timetimerout()));  //连接计时器的信号与槽

    timer->start(2000);     //启动计时器,并每个2S发一次消息

}

//计时器的使用测试
void Widget::testtimer()
{
    QTimer *timer = new QTimer();   //创建一个计时器对象

    connect(timer, SIGNAL(timeout()), this, SLOT(timetimerout())); //timeout()为计时器的信号

    timer->start(2000); //启动计时,并设置2S计时时间到
}
/*
//计时器的消息处理函数
void Widget::timetimerout()
{
    qDebug() << "timetimerout";
}
*/

//计时器的消息处理函数
void Widget::timetimerout()
{
    //进到计时器的消息处理函数中,因为要循环的显示栈式布局管理器中的组件,所以要先获取这个栈式布局管理,以达到操作这个栈式布局管理器
    //layout()函数会将当前组件中的布局管理器直接返回,但是返回的布局管理器类型是Layout的指针类型,所以我们要给装换成我们的布局管理器类型
    QStackedLayout *slayout = dynamic_cast<QStackedLayout*>(layout());

    if ( NULL != slayout )
    {
        //这时证明我们已经得到了栈式布局管理器
        //我们要取得布局管理器中的下一个顶层组件的下标
        int index = ((slayout->currentIndex() + 1) % slayout->count());  //前面获得当前的顶层组件下标,+1后为下一个要显示的组件下标
                                                                        //count是获取当前栈式布局管理器中的组件个数
                                                                        //取余是为了防止+1导致的溢出,可以让其一直循环
        slayout->setCurrentIndex(index);    //设置当前要显示的组件下标
    }
}

Widget::~Widget()
{


}

常用方法和属性:
(1)addItems
void addItems ( const QStringList & texts )
在QComboBox的最后添加一项。
(2)count
int count () const
返回列表项总数。
(3)currentIndex
int currentIndex () const
当前显示的列表项序号。
(4)currentText
QString currentText () const
返回当前显示的文本。
(5)insertItem
void insertItem ( int index, const QString & text, const QVariant & userData = QVariant() )
void insertItem ( int index, const QIcon & icon, const QString & text, const QVariant & userData = QVariant() )
void insertItems ( int index, const QStringList & list )
插入一项或多项至序号index处。

(6)insertSeparator
void insertSeparator ( int index )
在序号为index的项前插入分隔线

(7)setItemText
void setItemText ( int index, const QString & text )
改变序号为index项的文本。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_35260565/article/details/86623731

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文