当前位置: 首页 > news >正文

QT常用控件

目录

1.控件概述

2. QWidget 核⼼属性

设置组件是否可用

获取组件当前位置和尺⼨

QWidget的图标

组件的透明度设置

QWidget光标的设置

字体的设置

组件提示

设置组件获取到焦点的策略

stylesheet样式表

3.常用组件

QPushButton

RadioButton

Check Box

QLabel

LCD Number

QProgessBar

Calender Widget

Line Edit

QTextEdit

QCombo Box

QDateTimeEdit

QDial

QverticalSlider

4.多元素控件

QListWidget

QTabelWidget

QTree Widget

5.容器类控件

Group Box

QTab Widget

布局管理器

垂直布局QVBoxLayout

⽔平布局QHBoxLayout

网格布局QGridLayout

表单布局

Spacer


1.控件概述

对于QT窗口的开发,QT本身已经为我们内置了许多控件,我们直接就可以拿来用,不过我们需要 对这些控件了解清除。   

Widget 是 Qt 中的核⼼概念. 英⽂原义是 "⼩部件", 我们此处也把它翻译为 "控件" . 控件是构成⼀个图形化界⾯的基本要素。按钮, 列表视图, 树形视图, 单⾏输⼊框, 多⾏输⼊框, 滚动条, 下拉框等, 都可以称为 "控件". Qt 作⼀个成熟的 GUI 开发框架, 内置了⼤量的常⽤控件. 这⼀点在 Qt Designer 中就可以看到端倪。

2. QWidget 核心属性

在 Qt 中, 使⽤ QWidget 类表⽰ "控件". 像按钮, 视图, 输⼊框, 滚动条等具体的控件类, 都是继承⾃
QWidget. 可以说, QWidget 中就包含了 Qt 整个控件体系中。
每一个控件都有许多属性,我们可以通过查询文档来了解控件的属性,一般我们在设置对应的属性使用set+属性名,就是对应得方法,这里我们简单的介绍一些属性。

设置组件是否可用

isEnabled()
获取当前组件状态是否为可用,返回值为bool
setEnabled()
设置控件是否可使⽤. true 表⽰可⽤, false 表⽰禁⽤.

获取组件当前位置和尺⼨

其实是四个属性的统称:
x 横坐标    y 纵坐标     width 宽度      height ⾼度
move移动部件的位置(x,y)
geometry
位置和尺⼨. 包含 x, y, width, height 四个部分.其中坐标是以左上角
为参考进⾏设置的.返回值为一个Qrect对象。
 FrameGometry与geometry作用一样,不过范围包括窗口标题,窗口栏额外区域
 WindowTile

设置窗口标题

对于Qrect对象,对于它的四个坐标进行加减:

加一个正数  x:向右移动      y:向下移动     width:向右延长    height:向下延长

加一个负数  x:向左移动      y:向上移动     width:向左缩小    height:向上缩小

move 移动以左上角为起点为当前给定的坐标。

    int width=ui->pushButton_refuse->width();int height=ui->pushButton_refuse->height();int x=rand()%width;int y=rand()%height;ui->pushButton_refuse->move(x,y);QRect rect1=ui->pushButton_accept->frameGeometry();//范围包括了window FrameQRect rect2=ui->pushButton_accept->geometry();//范围包括了window FrameqDebug()<<rect1;qDebug()<<rect2;

QWidget的图标

WindowIcon获取 widget 图标  返回QIcon,只针对顶层窗口
setWindowIcon设置 widget 图标  参数为QIcon对象,只针对顶层窗口

对于图片资源等使用,我们在开发中并不能保证用户的路径与我们这里的一致,并且确保用户不会搞没我们的图片,因此QT右提供了一种方法,我们可以在该项目中在引入一个xml文件-后缀为qrc文件,将你使用的资源导入该文件里即可,QT在编译时会自动提取相关数据并编译到程序当中。

不过无法导入资源较大的文件,文件名不要带中文与特殊符号。

qrc的本质是把图片二进制数据提取转为c++代码,之后再编译到exe中,所以我们需要把文件导入qrc文件中:

1.创建前缀profix

2.导入资源 --要求该资源的目录在与qrc的同级目录或者子目录。

 QIcon imag(":/R.jpg");//构建qrc文件进行资源导入this->setWindowIcon(imag);float opacity=this->windowOpacity();qDebug()<<opacity;

组件的透明度设置

WindowOpacity() 获取 widget 透明度,取值0.0-1.0,0是完全透明,1是完全不透明
setWindowOpacity() 设置 widget 透明度,取值0.0-1.0,0是完全透明,1是完全不透明

这里注意浮点数使用的是IEE754的标准,二进制表示有效数字,每一位是一个小数(0.5,0.25,0.125,,)最后按照权重相加,由于flaot与double长度有限,因有效数组表示范围有限,最后很难凑出0.1这样的数,因此平时写代码的时候,两个浮点数不能直接==,这样有概率两个数不是相等的,可以做差比较。

在进行模块交互的时候,我们一般获取用双重判定,使得在交互中即使出现了问题,也不会出现较大的问题。集体开发代码编写参考《代码大全》这本书。

QWidget光标的设置

cursor()

⿏标悬停时显⽰的图标形状. 是普通箭头, 还是沙漏, 还是⼗字等形状

 在 Qt Designer 界⾯中可以清楚看到可选项.

setCursor()设置光标形状,只有处于widget时才生效
QGuiApplication::setOverrideCursor(const Cursor& cursor)设置全局的光标形状

光标的设置,我们既可以手动设置,也可以进行ui设置找到Cursor属性进行设置,使用setShape方法,QT中内置了许多光标形状。

  除此之外还可以用多种对象构造光标:

 可以使用图像设置光标,除此之外我们还可以去阿里巴巴的iconfont网站寻找你的素材

 QPixmap pixmap(":/basketball.png");//该对象可表示一个照片pixmap=pixmap.scaled(20,20);//缩放或者设置大小后重新赋值QCursor sor(pixmap,10,10);//默认图片左上角作为实际光标点击,我们还可以设置为10,10

字体的设置

一般用来设置组件的文本文字

font()获取当前widget的字体信息,返回Qfont对象
setFont()设置字体

首先创建字体对象,进行属性设置,之后在创建Qpalette对象进行setcolor设置,最后将这两个对象设置到组件中。

  //文本设置,以标签为例QLabel * label =new QLabel (this);label->move(80,30);label->setText("修对故人思故国,且将新火试新茶,诗酒趁年华");QFont font;font.setFamily("仿宋");//字体font.setBold(true);//加粗font.setPixelSize(30);//字体大小font.setItalic(true);//倾斜font.setUnderline(true);//下划线label->setFont(font);QPalette green;            //设置字体颜色green.setColor(QPalette::WindowText,Qt::green);label->setPalette(green); // 设置QLabel的颜色

组件提示

setToolTip
设置 toolTip.
⿏标悬停在该 widget 上时会有提⽰说明.
setToolTipDuring
设置 toolTip 提⽰的时间. 单位 ms.
时间到后 toolTip ⾃动消失.
ui->pushButton_accept->setToolTip("按下则女神接受");
ui->pushButton_accept->setToolTipDuration(2000);

设置组件获取到焦点的策略

简单来说:假设有一个文本框,只有选中之后才能输入,此时就是获取该组件的焦点,一般对于键盘输入较为明显。

比如说选中文本框输入,判断是否跳出此页面都是聚焦实现的。

focusPolicy()
获取该 widget 的 focusPolicy, 返回 Qt::FocusPolicy
setFocusPolicy(Qt::FocusPolicy policy)
设置 widget 的 focusPolicy

返回的focusPolicy是一个枚举类型,包括如下:

 Qt::FocusPolicy 是⼀个枚举类型. 取值如下
Qt::NoFocus :控件不会接收键盘焦点   --键盘无法输入
Qt::TabFocus :控件可以通过Tab键接收焦点
Qt::ClickFocus :控件在⿏标点击时接收焦点
Qt::StrongFocus :控件可以通过Tab键和⿏标点击接收焦点 (默认值)
Qt::WheelFocus : 类似于 Qt::StrongFocus , 同时控件也通过⿏标滚轮获取到焦点 (新增
的选项, ⼀般很少使⽤).

 以LineEdit为例:创建两个文本框,按下table键就会自动跳到下一个文本框,或者使用鼠标点击选中,这都是通过鼠标或者键盘去获取组件的焦点,当然我们也可以修改它这个聚焦类型,如上面的设置TableFcous,就会使得只能使用table键进行选择聚焦。

stylesheet样式表

通过 CSS 设置 widget 的样式.
CSS (Cascading Style Sheets 层叠样式表) 本⾝属于⽹⻚前端技术. 主要就是⽤来描述界⾯的
样式. 所谓 "样式", 包括不限于 ⼤⼩, 位置, 颜⾊, 间距, 字体, 背景, 边框等.
我们平时看到的丰富多彩的⽹⻚, 就都会⽤到⼤量的 CSS. Qt 虽然是做 GUI 开发, 但实际上和 ⽹⻚前端 有很多异曲同⼯之处. 因此 Qt 也引⼊了对于 CSS的⽀持----- QSS.
我们还是以两种方式来实验:
以ui界面为例:
    或者右键有一个改变样式表

样式表内是以键值对的形式进行设置。

我们也可以通过代码的方式进行央视的设置。具体里面可以写的内容设置的样式我们都可以向官方文档。

官网的样式表链接:http://doc.qt.io/archives/qt-4.8/stylesheet.html

各种控件的样式:http://doc.qt.io/archives/qt-4.8/stylesheet-reference.html

QSS语法:http://www.w3school.com.cn/css/css_syntax.asp

这里建议具体内容参考CSS来看

    this->setStyleSheet("background-color:white;");ui->lineEdit->setStyleSheet("background-color:green;color:white; ");ui->pushButton->setStyleSheet("color:white;");ui->pushButton_2->setStyleSheet("color:white;");

当然对于颜色是有无数种的,计算机中使用RGB进行颜色设计,使用一个字节G,一个字节B,一个字节R,255则表示对应颜色拉满,一般我们使用取色器去获取其他颜色的字节表示。

3.常用组件

这些组件都继承子Qwidget.

QPushButton

QPushButton就是一个简单的按钮,也是我们最常用最熟悉的按钮,他是继承了QAbstrcatButton。

属性
说明
tex
按钮中的⽂本
icon
按钮中的图标
iconSize
按钮中图标的尺⼨
shortCut
按钮对应的快捷键
autoRepeat
按钮是否会重复触发. 当⿏标左键按住不放时,
如果设为 true, 则会持续产⽣⿏标点击事件;
如果设为 false, 则必须释放⿏标, 再次按下⿏标时才能产⽣点击事件.
(相当于游戏⼿柄上的 "连发" 效果)
autoRepeatDelay
重复触发的延时时间. 按住按钮多久之后, 开始重复触发.
autoRepeatInterval
重复触发的周期.
//设置按钮图标QRect rect=ui->pushButton_godess->geometry();ui->pushButton_godess->setGeometry(rect.x(),rect.y(),50,50);QIcon icon(QPixmap(":/start.png"));ui->pushButton_godess->setIcon(icon);ui->pushButton_godess->setIconSize(QSize(50,50));//设置图标的大小ui->pushButton_godess->setFlat(true);//设置边框不可见

RadioButton

单选按钮,使我们可以多个选项中选择一个,除了以上相同的属性外,radiobutton存在着与之不同的方法。

checkable是否能选中
checked是否已经被选中. checkable 是 checked 的前提条件.
autoExclusive
选中⼀个按钮之后是否会取消其他按钮的选中.
对于 QRadioButton 来说默认就是排他的
多个单选按钮,在选择的时候,默认来说是选择一个的。
可是如果我们在这么多单选按钮中,需求是分为几组,每组中只有一个才可以被选择,如何实现呢?
QT中引入了QButtonGroup,对按钮进行分组。
我们只需与将需要的按钮放到一个组中即可实现按钮分组,此时单选按钮单旋只作用的在一个组中。
 QButtonGroup *group=new QButtonGroup();group->addButton(ui->radioButton_test);group->addButton(ui->radioButton_test1);

Check Box

Check Box表示复选按钮,一次性可以选择多个和 QCheckBox 最相关的属性也是 checkable checked , 都是继承⾃ QAbstractButton . ⾄于 QCheckBox 独有的属性 tristate ⽤来实现 "三态复选框" ,不过这个东西比较冷门。

用法基本类似,只不过复选按钮没有单选按钮的排他机制了。

QLabel

QLabel是一种显示组件,名叫标签.以下是关于QLabel的属性

text
QLabel 中的⽂本
textFormat⽂本的格式.
Qt::PlainText 纯⽂本
Qt::RichText 富⽂本(⽀持 html 标签)
Qt::MarkdownText markdown 格式
Qt::AutoText 根据⽂本内容⾃动决定⽂本格式.
pixmapQLabel 内部包含的图⽚.
scaledContents
设为 true 表⽰内容⾃动拉伸填充 QLabel设为 false 则不会⾃动拉伸
alignment对⻬⽅式.可以设置⽔平和垂直⽅向如何对⻬.
wordWrap
设为 true 内部的⽂本会⾃动换⾏.
设为 false 则内部⽂本不会⾃动换⾏.
indent设置⽂本缩进. ⽔平和垂直⽅向都⽣效.
margin
内部⽂本和边框之间的边距.
不同于于 indent, 但是是上下左右四个⽅向都同时有效.
⽽ indent 最多只是两个⽅向有效(具体哪两个⽅向有效取决于 alignment )
openExternalLinks
是否允许打开⼀个外部的链接.
(当 QLabel ⽂本内容包含 url 的时候涉及到)
buddy
给 QLabel 关联⼀个 "伙伴" , 这样点击 QLabel 时就能激活对应的伙伴.
例如伙伴如果是⼀个 QCheckBox, 那么该 QCheckBox 就会被选中.

对于编写的文本,QT支持textFormat多样式,其中就右通过添加标签的方式(类似HTML)修改文本样式的富文本,还有Markdown文本。

 label->setText("<b>竹杖芒鞋轻胜马,谁怕,一蓑烟雨任平生</b>");//b标签用来加粗

对于标签的图片,我们可以调用方法setscaledcontents(),可以根据组件的大小,图片自动填充满组件。

在QT中除了信号机制,还有一种机制称为事件,例如在拖拽窗口,修改窗口大小时就会触发事件ReSize,此时我们一般去重写父类中的虚函数来对事件进行处理。

除了以上标签的属性,还有对于标签中文本内容属性的设置:

设置文本对齐方式:

ui->label->setAlignment(Qt::AlignCenter | Qt:: AlignVCenter);//设置内容垂直且水平居中对齐

   ui->label->setWordWrap(true);//设置自动换行ui->label->setIndent(50);//设置缩进50个像素ui->label->setMargin(20);//设置文本边距;

setbuddy 设置伙伴,将两个无关系的组件关联起来。Lable的快捷键的格式是在文本中使用&+一个键,就可以表示该标签的快捷键,例如,将一个按钮与一个标签关联起来,给标签设置快捷键,点击快捷键(Alt+快捷键),触发按钮选中。标签的快捷键相对于按钮快捷键要弱很多。

LCD Number

QLCDNumer 是⼀个专⻔⽤来显⽰数字的控件. 
intValueQLCDNumber 显⽰的数字值(int).
valueQLCDNumber 显⽰的数字值(double).和 intValue 是联动的.
例如给 value 设为 1.5, intValue 的值就是 2.
另外, 设置 value 和 intValue 的⽅法名字为 display , ⽽不是 setValue 或 者 setIntValue .
digitCount显⽰⼏位数字.
mode
数字显⽰形式.
1. QLCDNumber::Dec :⼗进制模式,显⽰常规的⼗进制数字。
2. QLCDNumber::Hex :⼗六进制模式,以⼗六进制格式显⽰数字。
3. QLCDNumber::Bin :⼆进制模式,以⼆进制格式显⽰数字。
4. QLCDNumber::Oct :⼋进制模式,以⼋进制格式显⽰数字。
只有⼗进制的时候才能显⽰⼩数点后的内容.
segmentStyle设置显⽰⻛格.
1. QLCDNumber::Flat :平⾯的显⽰⻛格,数字呈现在⼀个平坦的表⾯上。
2. QLCDNumber::Outline :轮廓显⽰⻛格,数字具有清晰的轮廓和阴影效 果。
3. QLCDNumber::Filled :填充显⽰⻛格,数字被填充颜⾊并与背景区分 开。
smallDecimalPoint设置⽐较⼩的 ⼩数点.
其中QT中也提供了计时器对象,方便我们结合这个一起使用。

如果想使用线程的方式使用循环的方式去计时递减,由于主窗口时有主线程维护的,而QT为了保证主窗口的线程安全,因此是不允许其他线程修改界面的。因此只能在主线程里改:

//设置LCDNumber
ui->lcdNumber->display(10);//设置初始值
time=new QTimer(this);//创建timea对象
connect(time,&QTimer::timeout,this,&Widget::handle);
time->start(1000);//参数出发定时器为周期,单位ms
connect(this,Widget::pushButton_music_clicked,this,Widget::on_pushButton_music_clicked);
void Widget::handle()
{int num=ui->lcdNumber->intValue();if(num<=0){this->time->stop();emit pushButton_music_clicked();return ;}ui->lcdNumber->display(num-1);
}

QProgessBar

使⽤ QProgressBar 表⽰⼀个进度条.
minimum进度条最⼩值
maximum进度条最⼤值
value进度条当前值
alignment
alignment
⽂本在进度条中的对⻬⽅式.
Qt::AlignLeft : 左对⻬
Qt::AlignRight : 右对⻬
Qt::AlignCenter : 居中对⻬
Qt::AlignJustify : 两端对⻬
Qt::AlignJustify两端对⻬
textVisible进度条的数字是否可⻅.
orientation进度条的⽅向是⽔平还是垂直
textDirection⽂本的朝向.
format

展⽰的数字格式.

%p :表⽰进度的百分⽐(0-100)
%v :表⽰进度的数值(0-100)
%m :表⽰剩余时间(以毫秒为单位)
%t :表⽰总时间(以毫秒为单位
进度条的使用我们一般都会联合QTimer一起使用。基于QTimer的属性对进度条进行更新。
time=new QTimer(this);//创建timea对象
connect(time,&QTimer::timeout,this,&Widget::handle);
time->start(1000);//参数出发定时器为周期,单位ms
void Widget::handle()
{int val =ui->progressBar->value();if(val>=100){this->time->stop();return ;}ui->progressBar->setValue(val+10);
}

QProgressBar::chunk {background-color:red;}//修改样式表设置为红色进度条

Calender Widget

QCalendarWidget 表⽰⼀个 "⽇历" ,

selectDate当前选中的⽇期
minimumDate最⼩⽇期
maximumDate最⼤⽇期
firstDayOfWeek每周的第⼀天(也就是⽇历的第⼀列) 是周⼏.
gridVisible是否显⽰表格的边框
selectionMode是否允许选择⽇期
navigationBarVisible⽇历上⽅标题是否显⽰
horizontalHeaderFormat⽇历上⽅标题显⽰的⽇期格式
verticalHeaderFormat
⽇历第⼀列显⽰的内容格式
dateEditEnabled是否允许⽇期被编辑
void Widget::on_calendarWidget_selectionChanged()
{QDate date=ui->calendarWidget->selectedDate();ui->label_date->setText(date.toString());
}

Line Edit

Line Edit就是一个文本框,用户可以去输入。

text输⼊框中的⽂本
inputMask输⼊内容格式约束
maxLength最⼤⻓度
frame是否添加边框
echoMode
显⽰⽅式.
QLineEdit::Normal :这是默认值,⽂本框会显⽰输⼊的⽂本。
QLineEdit::Password :在这种模式下,输⼊的字符会被隐藏,
通常⽤星号(*)或等号(=)代替。
QLineEdit::NoEcho :在这种模式下,⽂本框不会显⽰任何输⼊
的字符。
cursorPosition光标所在位置
alignment⽂字对⻬⽅式, 设置⽔平和垂直⽅向的对⻬.
dragEnabled是否允许拖拽
readOnly是否是只读的(不允许修改)
placeHolderText当输⼊框内容为空的时候, 显⽰什么样的提⽰信息
clearButtonEnabled是否会⾃动显⽰出 "清除按钮
 ui->lineEdit_name->setPlaceholderText("请输入名字");ui->lineEdit_password->setPlaceholderText("请输入密码");ui->lineEdit_password->setEchoMode(QLineEdit::Password);ui->lineEdit_name->setClearButtonEnabled(true);ui->lineEdit_password->setClearButtonEnabled(true);ui->lineEdit_password->setInputMask("000-000-000");//固定格式为000-000-000,0代表舒数字

说到这里的内容格式约束,不得不说到一个语法,正则表达式:

关于正则表达式
正则表达式是⼀种在计算机中常⽤的, 使⽤特殊字符描述⼀个字符串的特征的机制. 在进⾏字
符串匹配时⾮常有⽤. 正则表达式的语法还⽐较复杂, ⼀般都是随⽤随查, 不需要背下来.
参考:
正则表达式⽂档 https://learn.microsoft.com/zh-cn/previous
versions/visualstudio/visual-studio-2008/ae5bf541(v=vs.90)?redirectedfrom=MSDN
正则表达式在线⼯具: https://regextester.buyaocha.com/
//在构造函数中创建正则表达式验证器
QRegularExpression reg("^1\\d{10}$");//例如创建一个验证电话号码的。
//^1表示以1开头,之后\d表示数字(需要多加/防止转义字符),,{10},表示前面的内容出现十次,$结尾
ui->lineEdit_password->setValidator(new QRegularExpressionValidator(reg));
//通过该对象去检测密码输入的合法性void Widget::on_lineEdit_password_textEdited(const QString &arg1)//输入内容就会产生信号
{QString content=arg1;int pos=0;//验证是否通过的操作if (ui->lineEdit_password->validator()->validate(content,pos)==QValidator::Acceptable){//如果通过按钮才可用ui->pushButton->setEnabled(false);}else{ui->pushButton->setEnabled(true);}
}void Widget::on_checkBox_show_toggled(bool checked)
{if(checked==true){ui->lineEdit_password->setEchoMode(QLineEdit::Normal);}else{ui->lineEdit_password->setEchoMode(QLineEdit::Password);}
}

QTextEdit

QTextEdit 表⽰多⾏输⼊框. 也是⼀个富⽂本 & markdown 编辑器. 并且能在内容超出编辑框范围时⾃动提供滚动。除了表示文本,还可以使用html和markdown进行渲染。
markdown
输⼊框内持有的内容. ⽀持 markdown 格式. 能够⾃动的对markdown ⽂本进⾏
渲染成 html
html输⼊框内持有的内容. 可以⽀持⼤部分 html 标签. 包括 img 和 table 等
placeHolderText输⼊框为空时提⽰的内容.
readOnly是否是只读的
是否是只读的是否开启 undo / redo 功能.按下 ctrl + z 触发 undo
autoFormating开启⾃动格式化.
tabstopWidth
按下缩进占多少空间
overwriteMode是否开启覆盖写模式
acceptRichText是否接收富⽂本内容
verticalScrollBarPolicy
  垂直⽅向滚动条的出现策略
Qt::ScrollBarAsNeeded : 根据内容⾃动决定是否需要滚动条。这是默认 值。
Qt::ScrollBarAlwaysOff : 总是关闭滚动条。
Qt::ScrollBarAlwaysOn : 总是显⽰滚动条。
horizontalScrollBarPolicy ⽔平⽅向滚动条的出现策略
Qt::ScrollBarAsNeeded : 根据内容⾃动决定是否需要滚动条。这是默认值。
Qt::ScrollBarAlwaysOff : 总是关闭滚动条。
Qt::ScrollBarAlwaysOn : 总是显⽰滚动条
信号
textChanged()⽂本内容改变时触发
selectionChanged()选中范围改变时触发
cursorPositionChanged()光标移动时触发
undoAvailable(bool)可以进⾏ undo 操作时触发
可以进⾏ redo 操作时触发可以进⾏ redo 操作时触发
copyAvaiable(bool)⽂本被选中/取消选中时触发

QCombo Box

QCombo Box叫做复选框,其实就是下拉框。

currentText当前选中的⽂本
currentIndex当前选中的条⽬下标从 0 开始计算. 如果当前没有条⽬被选中, 值为 -1
editable
是否允许修改设为 true 时, QComboBox 的⾏为就⾮常接近 QLineEdit , 也可以设置 validator
iconSize下拉框图标 (⼩三⻆) 的⼤⼩
maxCount最多允许有多少个条⽬
addItem(const QString&)添加⼀个条⽬
currentIndex()获取当前条⽬的下标从 0 开始计算. 如果当前没有条⽬被选中, 值为 -1
currentText()获取当前条⽬的⽂本内容
信号
activated(int)
activated(const QString & text)

当⽤⼾选择了⼀个选项时发出.这个时候相当于⽤⼾点开下拉框,

并且⿏标划过某个选项此时还没有确认做出选择..

currentIndexChanged(int)
currentIndexChanged(const QString& text)
当前选项改变时发出.
此时⽤⼾已经明确的选择了⼀个选项.
⽤⼾操作或者通过程序操作都会触发这个信号.
editTextChanged(const QString & text)
当编辑框中的⽂本改变时发出
(editable 为 true 时有效)
//构造
std::ifstream fp("D:\\QTcode\\edittext\\test.txt",std::ifstream::out);if(!fp.is_open()){qDebug()<<"文件打开失败";return ;}std::string line;while(std::getline(fp,line)){ui->comboBox->addItem(QString::fromStdString(line));}fp.close();void Widget::on_comboBox_currentIndexChanged(int index)//选中的下拉框的内容显示给标签
{QString content=ui->comboBox->currentText();ui->label_2->setText(content);
}

QSpin Box

使⽤ QSpinBox 或者 QDoubleSpinBox 表⽰ "微调框", 它是带有按钮的输⼊框. 可以⽤来输⼊整 数/浮点数. 通过点击按钮来修改数值⼤⼩. 由于 SpinBox 和 QDoubleSpinBox ⽤法基本相同, 就只介绍 SpinBox 的使⽤了.

value存储的数值.
singleStep每次调整的 "步⻓". 按下⼀次按钮数据变化多少
displayInteger
数字的进制. 例如 displayInteger 设为 10, 则是按照 10 进制表⽰. 设为 2 则为 2
进制表⽰.
minimum最⼩值
maximum最⼤值
suffix后缀
prefix前缀
wrapping是否允许换⾏
frame是否带边框
alignment⽂字对⻬⽅式.
.
readOnly
是否允许修改
buttonSymbol按钮上的图标
buttonsymbol
按钮上的图标.
UpDownArrows 上下箭头形式
PlusMinus 加减号形式
NoButtons 没有按钮
accelerated (加速的)
按下按钮时是否为快速调整模式
correctionMode
输⼊有误时如何修正.
QAbstractSpinBox::CorrectToPreviousValue : 如果⽤⼾输⼊了⼀个
⽆效的值(例如,在只能显⽰正整数的SpinBox中输⼊了负数),那么
SpinBox会恢复为上⼀个有效值。例如,如果SpinBox的初始值是1,⽤⼾
输⼊了-1(⽆效),然后SpinBox会恢复为1。
QAbstractSpinBox::CorrectToNearestValue : 如果⽤⼾输⼊了⼀个
⽆效的值,SpinBox会恢复为最接近的有效值。例如,如果SpinBox的初始
值是1,⽤⼾输⼊了-1(⽆效),那么SpinBox会恢复为0。
keyboardTrack
是否开启键盘跟踪.
设为 true, 每次在输⼊框输⼊⼀个数字, 都会触发⼀次 valueChanged() 和
textChanged() 信号.
设为 false, 只有在最终按下 enter 或者输⼊框失去焦点, 才会触发
valueChanged() 和 textChanged() 信号
信号
textChanged(QString)
微调框的⽂本发⽣改变时会触发. 参数 QString 带有 前缀 和 后缀.
valueChanged(int)
微调框的⽂本发⽣改变时会触发. 参数 int, 表⽰当前的数值
    //设置微调框ui->spinBox->setRange(1,5);//设置范围ui->spinBox->setValue(1);//设置初始值int valu=ui->spinBox->value();//获取微调框当前值

QDateTimeEdit

QDateTimeEdit其实也是微调框,但是是操作时间的,对于时间的为条框有三个,如下所示:

使⽤ QDateEdit 作为⽇期的微调框.
使⽤ QTimeEdit 作为时间的微调框.
使⽤ QDateTimeEdit 作为时间⽇期的微调框.
QDateTimeEdit 核⼼属性
dateTime时间⽇期的值. 形如 2000/1/1 0:00:00
date单纯⽇期的值. 形如 2001/1/1
time单纯时间的值. 形如 0:00:00
displayFormat
时间⽇期格式. 形如 yyyy/M/d H:mm
y 表⽰年份
M 表⽰⽉份
d 表⽰⽇期
H 表⽰⼩时
m 表⽰分钟
s 表⽰秒
minimumDateTime最⼩时间⽇期
maximumDateTime最⼤时间⽇期
timeSpec
Qt::LocalTime :显⽰本地时间。
Qt::UTC :显⽰协调世界时(UTC)。
Qt::OffsetFromUTC :显⽰相对于UTC的偏移量(时差).

信号

dateChanged(QDate)⽇期改变时触发.
timeChanged(QTime)时间改变时触发.
dateTimeChanged(QDateTime)
时间⽇期任意⼀个改变时触发.
对于日期对象,我们可以调用QDateTime中自身内置的函数
使⽤ daysTo 函数可以计算两个⽇期的天数.
使⽤ secsTo 函数可以计算两个时间的秒数.
通过 (秒数 / 3600) 换算成⼩时数, 再余上 24 得到零⼏个⼩时.
使⽤ QString::number 把整数转成 QString 进⾏拼接
QDateTime time=ui->dateEdit->dateTime();QDateTime time2=ui->dateEdit_2->dateTime();int day=time.daysTo(time2);//time与time2两者做差,求出天数差int seconds=time.secsTo(time2);//求相差的秒数qDebug()<<day;qDebug()<<seconds;

QDial

使⽤ QDial 表⽰⼀个 旋钮. 有些程序, 通过⿏标拖动旋钮旋转, 即可完成⼀些相关的设置
value持有的数值.
minimum最⼩值
maximum最⼤值
singleStep按下⽅向键的时候改变的步⻓.
pageStep按下 pageUp / pageDown 的时候改变的步⻓.
sliderPosition界⾯上旋钮显⽰的 初始位置
tracking
外观是否会跟踪数值变化.
默认值为 true. ⼀般不需要修改.
wrapping
是否允许循环调整.
即数值如果超过最⼤值, 是否允许回到最⼩值.
(调整过程能否 "套圈")
notchesVisible是否显⽰ 刻度线
notchTarget
刻度线之间的相对位置.
数字越⼤, 刻度线越稀疏.
信号:
valueChanged(int)数值改变时触发
rangeChanged(int, int)范围变化时触发
可以通过代码,也可以在ui中技能设置,设置wrapping,可以循回,设置nothtarget(设置为10),设置初始旋钮的位置(数值),设置旋钮整圈的范围(最大值与最小值)。编写一个代码,通过旋钮调节窗口透明度。
void Widget::on_dial_valueChanged(int value)
{int val=ui->dial->value();double opacity=(double(val)/100);this->setWindowOpacity(opacity);
}

QverticalSlider

使⽤ verticalSlider 表⽰⼀个滑动条.
verticalSlider 和 QDial 都是继承⾃ QAbstractSlider , 因此⽤法上基本相同.
value持有的数值.
minimum最⼩值
maximum最⼤值
singleStep按下⽅向键的时候改变的步⻓.
pageStep按下 pageUp / pageDown 的时候改变的步⻓.
sliderPosition滑动条显⽰的 初始位置
tracking
外观是否会跟踪数值变化.
默认值为 true. ⼀般不需要修改.
orientation滑动条的⽅向是⽔平还是垂直
invertedAppearance
是否要翻转滑动条的⽅向
tickPosition刻度的位置.
tickInterval刻度的密集程度
valueChanged(int)
数值改变时触发
rangeChanged(int, int)范围变化时触发
除了和旋转按钮一样的功能,我们还可以给他设置快捷键:
  //给滑动条添加快捷键QShortcut *shortcut=new QShortcut(this);//先创建快捷键对象shortcut->setKey(QKeySequence("w"));QShortcut *shortcut2=new QShortcut(this);//先创建快捷键对象shortcut2->setKey(QKeySequence("a"));//使用信号槽来触发connect(shortcut,&QShortcut::activated,this,&Widget::Sliderhandle);connect(shortcut2,&QShortcut::activated,this,&Widget::Sliderhandle2);void Widget::Sliderhandle()
{int val=ui->verticalSlider->value();if(val>=ui->verticalSlider->maximum()){return ;}ui->verticalSlider->setValue(val+1);//每次加一
}
void Widget::Sliderhandle2()
{int val=ui->verticalSlider->value();if(val<=ui->verticalSlider->minimum()){return ;}ui->verticalSlider->setValue(val-1);//每次减一
}

4.多元素控件

Qt 中提供的多元素控件有:
QListWidget
QListView
前两个表示列表的组合控件
QTableWidget
QTableView
中间两个是表示表格的组合控件
QTreeWidget
QTreeView
最后两个是表示树形的组合控件
至于没什么每一组都两个,实际上在软件开发中 xxxView是一种MVC结构,指一种常用的组织形式。View只负责视图,不关注数据以及交互,使用view就需要自己实现交互以及数据部分,为了方便编写,又提供了xxxWidget,基于xxxView,帮我们提供了API方便我们去用。
这里我们就介绍WIdget类型的。

QListWidget

使⽤ QListWidget 能够显⽰⼀个纵向的列表. 
currentRow当前被选中的是第⼏⾏
count⼀共有多少⾏
sortingEnabled是否允许排序
isWrapping是否允许换⾏
emAlignment元素的对⻬⽅式
selectRectVisible被选中的元素矩形是否可⻅
spacing元素之间的间隔
主要方法
addItem(const QString& label)
addItem(QListWidgetItem *item)
列表中添加元素
currentItem()返回 QListWidgetItem* 表⽰当前选中的元素
setCurrentItem(QListWidgetItem* item)设置选中哪个元素
setCurrentRow(int row)设置选中第⼏⾏的元素
insertItem(const QString& label, int row)
insertItem(QListWidgetItem *item, int row)
在指定的位置插⼊元素
item(int row)
返回 QListWidgetItem* 表⽰第 row ⾏的元素
takeItem(int row)
删除指定⾏的元素, 返回 QListWidgetItem* 表⽰是哪个
元素被删 除了
槽函数
currentItemChanged(QListWidgetItem*
current, QListWidgetItem* old)
选中不同元素时会触发. 参数是当前选中的元素和之前选中的元素.
currentRowChanged(int)选中不同元素时会触发. 参数是当前选中元素的⾏数.
itemClicked(QListWidgetItem* item)点击某个元素时触发
itemDoubleClicked(QListWidgetItem*
item)
双击某个元素时触发
itemEntered(QListWidgetItem* item)⿏标进⼊元素时触发

void Widget::on_pushButton_add_clicked()
{//根据文本插入QString content=ui->lineEdit->text();QListWidgetItem *item =new QListWidgetItem(ui->listWidget);item->setText(content);ui->listWidget->setStyleSheet("font-size:15px;color:green;");ui->listWidget->addItem(item);//也可以之家additemQString
}void Widget::on_pushButton_del_clicked()
{//根据选中的行删除int row=ui->listWidget->currentRow();ui->listWidget->takeItem(row);
}

QTabelWidget

使⽤ QTableWidget 表⽰⼀个表格控件. ⼀个表格中包含若⼲⾏, 每⼀⾏⼜包含若⼲列.
表格中的每个单元格, 是⼀个 QTableWidgetItem 对象
item(int row, int column)

根据⾏数列数获取指定的

QTableWidgetItem*

setItem(int row, int column, QTableWidget*)
根据⾏数列数设置表格中的元素
currentItem()返回被选中的元素 QTableWidgetItem*
currentRow()返回被选中元素是第⼏⾏
currentColumn()返回被选中元素是第⼏列
row(QTableWidgetItem* 获取指定 item 是第⼏⾏
column(QTableWidgetItem* ) 获取指定 item 是第⼏列
rowCount()获取⾏数
columnCount()获取列数
insertRow(int row)在第 row ⾏处插⼊新⾏
insertColumn(int column)在第 column 列插⼊新列
removeRow(int row)删除第 row ⾏
removeColumn(int column)删除第 column 列
setHorizontalHeaderItem(int column, QTableWidget*)
设置指定列的表头
setVerticalHeaderItem(int row,
QTableWidget*)
设置指定⾏的表头
信号
cellClicked(int row, int column)点击单元格时触发
cellDoubleClicked(int row, int
column)
双击单元格时触发
cellEntered(int row, int column)⿏标进⼊单元格时触发
currentCellChanged(int row, int
column, int previousRow, int previousColumn)
选中不同单元格时触发
QTableWidgetItem 核⼼⽅法
row()获取当前是第⼏⾏
column()获取当前是第⼏列
setText(const QString&)设置⽂本
setTextAlignment(int)设置⽂本对⻬
setIcon(const QIcon&)设置图标
setSelected(bool)设置被选中
setSizeHints(const QSize&)设置尺⼨
setFont(const QFont&)设置字体

表格的属性就像我们在mysql学习到的表格,有列的属性,行的属性。第几行第几行就是一个item.

/创建三行三列的表格ui->tableWidget->insertRow(0);ui->tableWidget->insertRow(1);ui->tableWidget->insertRow(2);ui->tableWidget->insertColumn(0);ui->tableWidget->insertColumn(1);ui->tableWidget->insertColumn(2);//设置列名ui->tableWidget->setHorizontalHeaderItem(0,new QTableWidgetItem("姓名"));ui->tableWidget->setHorizontalHeaderItem(1,new QTableWidgetItem("性别"));ui->tableWidget->setHorizontalHeaderItem(2,new QTableWidgetItem("年龄"));//添加元素ui->tableWidget->setItem(0,0,new QTableWidgetItem("张三"));ui->tableWidget->setItem(0,1,new QTableWidgetItem("男"));ui->tableWidget->setItem(0,2,new QTableWidgetItem("00001"));void Widget::on_pushButton_insert_clicked()
{int row=ui->tableWidget->rowCount();//下标即为对应的行//获取当前的行数就可以表示下一行ui->tableWidget->insertRow(row);}void Widget::on_pushButton_clicked()
{int column=ui->tableWidget->columnCount();//下标即为对应的行//获取当前的行数就可以表示下一行ui->tableWidget->insertColumn(column);QString content=ui->lineEdit_table->text();ui->tableWidget->setHorizontalHeaderItem(column,new QTableWidgetItem(content));
}

QTree Widget

使⽤ QTreeWidget 表⽰⼀个树形控件. ⾥⾯的每个元素, 都是⼀个 QTreeWidgetItem , 每个
QTreeWidgetItem 可以包含多个⽂本和图标, 每个⽂本/图标为⼀个 列. 可以给 QTreeWidget 设置顶层节点(顶层节点可以有多个), 然后再给顶层节点添加⼦节点, 从⽽构成 树形结构。
clear清空所有⼦节点
addTopLevelItem(QTreeWidgetItem* item)新增顶层节点
topLevelItem(int index)获取指定下标的顶层节点.
opLevelItemCount()获取顶层节点个数
indexOfTopLevelItem(QTreeWidgetItem* item)
查询指定节点是顶层节点中的下标
takeTopLevelItem(int index)
删除指定的顶层节点. 返回 QTreeWidgetItem*
表⽰被删除 的元素
currentItem()获取到当前选中的节点, 返回 QTreeWidgetItem
setCurrentItem(QTreeWidgetItem* item)选中指定节点
setExpanded(bool)展开/关闭节点
setHeaderLabel(const QString& text)
设置 TreeWidget 的 header 名称.  
QTreeWidget 核⼼信号
currentItemChanged(QTreeWidgetItem*
current, QTreeWidgetItem* old)
切换选中元素时触发
itemClicked(QTreeWidgetItem* item, int col)点击元素时触发
itemDoubleClicked(QTreeWidgetItem* item,
int col)
双击元素时触发
itemEntered(QTreeWidgetItem* item, int col)元素被展开时触发
itemExpanded(QTreeWidgetItem* item)
元素被展开时触发
itemCollapsend(QTreeWidgetItem* item)元素被折叠时触发
QTreeWidgetItem 核⼼属性
addChild(QTreeWidgetItem* child)新增⼦节点
childCount()⼦节点的个数
child(int index)获取指定下标的⼦节点. 返回 QTreeWidgetItem
takeChild(int index)删除对应下标的⼦节点
removeChild(QTreeWidgetItem*
child)
删除对应的⼦节点
parent()获取该元素的⽗节点
当目录使用
//设置树形结构QStringList headerLabels;headerLabels << "Name" << "Age" << "Location";ui->treeWidget->setHeaderLabels(headerLabels);//设置根节点的列名//新增顶层节点,顶层目录即最高层次的目录QTreeWidgetItem *item=new QTreeWidgetItem();item->setText(0,"目录");//0表示所处的目录列号//给顶层目录添加子目录QTreeWidgetItem *itemchild=new QTreeWidgetItem();itemchild->setText(0,"子目录");QTreeWidgetItem *itemchild2=new QTreeWidgetItem();itemchild2->setText(0,"子目录2");item->addChild(itemchild);item->addChild(itemchild2);ui->treeWidget->addTopLevelItem(item);//添加到树中QTreeWidgetItem *item1=new QTreeWidgetItem();item1->setText(0,"目录1");//添加到树中ui->treeWidget->addTopLevelItem(item1);QTreeWidgetItem *item2=new QTreeWidgetItem();item2->setText(0,"目录2");//添加到树中ui->treeWidget->addTopLevelItem(item2);

即一个列下可能会有许多子目录。

5.容器类控件

容器类控件有两种 Group Box 分组框,QTab WIdget标签页

Group Box

我们可以将一些组件放到这个框框里头,同时左上角还可以设置这整个框的名字。
title分组框的标题
alignment分组框内部内容的对⻬⽅式
flat是否是 "扁平" 模式
checkable
是否可选择.
设为 true, 则在 title 前⽅会多出⼀个可勾选的部分.
checked描述分组框的选择状态 (前提是 checkable 为 true)

QTab Widget

使⽤ QTabWidget 实现⼀个带有标签⻚的控件, 可以往⾥⾯添加⼀些 widget. 进⼀步的就可以通过标 签⻚来切换.
tabPosition
标签⻚所在的位置.
North 上⽅
South 下⽅
West 左侧
East 右侧
currentIndex当前选中了第⼏个标签⻚ (从 0 开始计算)
currentTabText当前选中的标签⻚的⽂本
currentTabName当前选中的标签⻚的名字
currentTabIcon当前选中的标签⻚的图标
currentTabToolTip当前选中的标签⻚的提⽰信息
absCloseab标签⻚是否可以关闭
movable标签⻚是否可以移动
currentChanged(int)在标签⻚发⽣切换时触发, 参数为被点击的选项卡编号.
tabBarClicked(int)在点击选项卡的标签条的时候触发. 参数为被点击的选项卡编号.
tabBarDoubleClicked(int)在双击选项卡的标签条的时候触发. 参数为被点击的选项卡编号.
tabCloseRequest(int)在标签⻚关闭时触发. 参数为被关闭的选项卡编号

我们首先可以去ui界面设计,拖动一个标签table,我们可以选择一个页面往里面添加其他组件,同时i我们也可以右键添加或删除页,同时还有许多共功能。

使用ui访问具体的某个标签页时,我们不是用objectname,而失去使用currentTabName,

//创建新的标签页
void Widget::on_pushButton_add_clicked()
{QWidget * wid=new QWidget();int num=ui->tabWidget->count();//标签页数量ui->tabWidget->addTab(wid,QString("标签页")+QString::number(num+1));//三个参数,第一个为widget指针表示窗口,第二个为icon表示图标,第三个为 QString表示标题}
//删除选中标签页
void Widget::on_pushButton_del_clicked()
{int idnext=ui->tabWidget->currentIndex();ui->tabWidget->removeTab(idnext);
}

布局管理器

之前使⽤ Qt 在界⾯上创建的控件, 都是通过 "手动定位" 的⽅式来设定的. 也就是每个控件所在的位置, 都需要计算坐标, 最终通过 setGeometry 或者 move ⽅式摆放过去. 这种设定⽅式其实并不⽅便. 尤其是界⾯如果内容⽐较多, 不好计算. ⽽且⼀个窗⼝⼤⼩往往是可以调整 的, 按照绝对定位的⽅式, 也⽆法⾃适应窗⼝⼤⼩. 因此 Qt 引⼊ "布局管理器" (Layout) 机制, 来解决上述问题。

垂直布局QVBoxLayout

使⽤ QVBoxLayout 表⽰垂直的布局管理器. V 是 vertical 的缩写.
五个核心属性
layoutLeftMargin左侧边距
layoutRightMargin右侧边距
layoutTopMargin上⽅边距
layoutBottomMargin下⽅边距
layoutSpacing
相邻元素之间的间距
Layout 只是⽤于界⾯布局, 并没有提供信号.

一个窗口只能设置一个布局管理器。但是我们用QT Desgner可以拖很多个layout,实际上时先创建了一个widget,在对widget设置垂直布局。其次虽然只能设谁一个布局管理,但是里面可以进行布局管理器的嵌套。、

QPushButton * button1=new QPushButton("按钮一");QPushButton * button2=new QPushButton("按钮二");QPushButton * button3=new QPushButton("按钮三");//创建布局管理器QVBoxLayout * layout=new QVBoxLayout();layout->addWidget(button1);layout->addWidget(button2);layout->addWidget(button3);//添加布局管理器到窗口中this->setLayout(layout);

我们试着嵌套布局管理器看看:

QVBoxLayout * layout=new QVBoxLayout();this->setLayout(layout);QPushButton * button1=new QPushButton("按钮一");QPushButton * button2=new QPushButton("按钮二");layout->addWidget(button1);layout->addWidget(button2);QHBoxLayout * hboxlayout=new QHBoxLayout();//把水平布局添加到垂直布局当中layout->addLayout(hboxlayout);QPushButton * button3=new QPushButton("按钮三");QPushButton * button4=new QPushButton("按钮四");hboxlayout->addWidget(button3);hboxlayout->addWidget(button4);

⽔平布局QHBoxLayout

使⽤ QHBoxLayout 表⽰垂直的布局管理器. H 是 horizontal 的缩写.
属性与垂直布局一样,用法也一样,区别时水平布局,注重水平方向的的布置管理。上述例子也演示了水平布局。

网格布局QGridLayout

Qt 中还提供了 QGridLayout ⽤来实现⽹格布局的效果,可以达到 M * N 的这种⽹格的效果
网格布局会根据坐标自动进行划分。
layoutLeftMargin左侧边距
layoutRightMargin右侧边距
layoutTopMargin上⽅边距
layoutBottomMargin下⽅边距
layoutHorizontalSpacing相邻元素之间⽔平⽅向的间距
layoutVerticalSpacing相邻元素之间垂直⽅向的间距
layoutRowStretch⾏⽅向的拉伸系数
layoutColumnStretch列⽅向的拉伸系数

想不与上面的布局,网格布局队列和行的间距以及拉伸系数提供了修改。

QGridLayout *gridlayout=new QGridLayout();this->setLayout(gridlayout);QPushButton * button1=new QPushButton("按钮一");QPushButton * button2=new QPushButton("按钮二");QPushButton * button3=new QPushButton("按钮三");QPushButton * button4=new QPushButton("按钮四");gridlayout->addWidget(button1,0,0);//添加时可以指定行与列gridlayout->addWidget(button2,0,1);gridlayout->addWidget(button3,1,0);gridlayout->addWidget(button4,1,1);
}

通过将坐标设置为同一行或者同一列,就可以实现水平或者垂直布局。
即使两者坐标相差极大,但是也会根据窗口大小在窗口内按照布局显示。
 gridlayout->addWidget(button1,0,0);//添加时可以指定行与列gridlayout->addWidget(button2,1,1);gridlayout->addWidget(button3,50,50);gridlayout->addWidget(button4,100,100);
直接进行组建的布局,各个组件的大小是均等的,如果你想改变某个组件或者某列或者某行的大小,你就可以修改他的拉伸系数。
 gridlayout->setColumnStretch(0,1);//设置第一列的拉伸系数为一gridlayout->setColumnStretch(1,2);//设置第2列的拉伸系数为二
出列列拉伸,我们还可以进行行拉伸,但是直接拉伸,我们会发现并不会有我们想看到的效果,这是因为widget中有一个sizepolicy的限制。
使⽤ setSizePolicy 设置按钮的尺⼨策略. 可选的值如下:
QSizePolicy::Ignored : 忽略控件的尺⼨,不对布局产⽣影响。
QSizePolicy::Minimum : 控件的最⼩尺⼨为固定值,布局时不会超过该值。
QSizePolicy::Maximum : 控件的最⼤尺⼨为固定值,布局时不会⼩于该值。
QSizePolicy::Preferred : 控件的理想尺⼨为固定值,布局时会尽量接近该值。
QSizePolicy::Expanding : 控件的尺⼨可以根据空间调整,尽可能占据更多空间。
QSizePolicy::Shrinking : 控件的尺⼨可以根据空间调整,尽可能缩⼩以适应空间
    QGridLayout *gridlayout=new QGridLayout();this->setLayout(gridlayout);QPushButton * button1=new QPushButton("按钮一");QPushButton * button2=new QPushButton("按钮二");QPushButton * button3=new QPushButton("按钮三");QPushButton * button4=new QPushButton("按钮四");QPushButton * button5=new QPushButton("按钮五");QPushButton * button6=new QPushButton("按钮六");button1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Ignored);button2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Ignored);button3->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Ignored);button4->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Ignored);button5->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Ignored);button6->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Ignored);gridlayout->addWidget(button1,0,0);//添加时可以指定行与列gridlayout->addWidget(button2,0,1);gridlayout->addWidget(button3,1,0);gridlayout->addWidget(button4,1,1);gridlayout->addWidget(button5,2,0);gridlayout->addWidget(button6,2,1);gridlayout->setRowStretch(0,1);gridlayout->setRowStretch(1,3);

表单布局

除了上述的布局管理器之外, Qt 还提供了 QFormLayout , 属于是 QGridLayout 的特殊情况, 专
⻔⽤于实现两列表单的布局. 这种表单布局多⽤于让⽤⼾填写信息的场景. 左侧列为提⽰, 右侧列为输⼊框。
在该布局添加item时,使用方法addRow(),参数分别为左侧的部件,与右侧的部件,因为他是两列的结构,也可以写空指针,表示这个位置不放部件。
// 把上述元素添加到 layout 中layout->addRow(label1, lineEdit1);layout->addRow(label2, lineEdit2);layout->addRow(label3, lineEdit3);layout->addRow(NULL, btn);

Spacer

使⽤布局管理器的时候, 可能需要在控件之间, 添加⼀段空⽩. 就可以使⽤ QSpacerItem 来表⽰
width宽度
height⾼度
hData
⽔平⽅向的 sizePolicy
QSizePolicy::Ignored : 忽略控件的尺⼨,不对布局产⽣影响。
QSizePolicy::Minimum : 控件的最⼩尺⼨为固定值,布局时不会超过该值。
QSizePolicy::Maximum : 控件的最⼤尺⼨为固定值,布局时不会⼩于该值。
QSizePolicy::Preferred : 控件的理想尺⼨为固定值,布局时会尽量接近该值
   QSizePolicy::Expanding : 控件的尺⼨可以根据空间调整,尽可能占据更多空 间。
QSizePolicy::Shrinking : 控件的尺⼨可以根据空间调整,尽可能缩⼩以适应 空间。
vData垂直⽅向的 sizePolicy

我们可以将空白也想象成一个组件表示空白,进行两个组件空白的设置时,按顺序,依次添加到布局管理中:

  • QSpacerItem主要用于在Qt中的水平布局和垂直布局中添加空白空间。
  • 它可以通过布局管理器的方法(如addSpacing()、insertSpacing()、addStretch()和insertStretch())直接添加到布局中。
  • 在网格布局中,虽然不直接使用QSpacerItem,但可以通过调整行和列的“弹性”来间接实现类似的效果。
  • 在更复杂的布局场景中,QSpacerItem仍然是一个有用的工具,可以帮助控制部件之间的间距和布局的整体外观。
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);

相关文章:

QT常用控件

目录 1.控件概述 2. QWidget 核⼼属性 设置组件是否可用 获取组件当前位置和尺⼨ QWidget的图标 组件的透明度设置 QWidget光标的设置 字体的设置 组件提示 设置组件获取到焦点的策略 stylesheet样式表 3.常用组件 QPushButton RadioButton Check Box QLabel …...

如何解决chatgpt出现503 bad gateway的问题

昨日&#xff0c;ChatGPT官网挂了&#xff0c;也就是使用web网页端访问的用户&#xff0c;会出现 bad gateway 情况。我们去ChatGPT官方的监控查看&#xff0c;已经展示相关错误。 影响的范围有&#xff1a; 影响了 ChatGPT 所有计划的所有用户。影响包括所有与 ChatGPT 相关…...

Halcon 双相机标定与拼图(二)

一、概述 这种标定有两种模式&#xff0c;有一个标定板和多个标定板两种 一个标定板 两个相机的重叠区域比较大&#xff0c;那么我们可以把标定板放到那个重叠区域来统一坐标系&#xff0c;如下 这种是只需要一个标定板&#xff0c;这种是推荐的方式 。这种是比较简单的&…...

【加密与解密】【04】Java安全架构

JAVA安全模块划分 JCA&#xff0c;Java Cryptography Architecture&#xff0c;Java加密体系结构JCE&#xff0c;Java Cryptography Extension&#xff0c;Java加密扩展包JSSE&#xff0c;Java Secure Sockets Extension&#xff0c;Java安全套接字扩展包JAAS&#xff0c;Java…...

论文阅读:Neural Scene Flow Prior

目录 概要 Motivation 整体架构流程 技术细节 小结 论文地址:...

如何通过 6 种简单方法将照片从华为转移到 PC?

华为作为全球领先的智能手机供应商之一&#xff0c;最近推出了其自主研发的操作系统——HarmonyOS 2.0&#xff0c;旨在为智能手机、平板电脑和智能手表等设备提供更流畅的用户体验。随着Mate 40/P40等系列手机计划升级到HarmonyOS 2.0&#xff0c;用户可能需要将手机中的文件备…...

QtCharts使用

1.基础配置 1.QGraphicsView提升为QChartView#include <QtCharts> QT_CHARTS_USE_NAMESPACE #include "ui_widget.h"2. QT charts 2.柱状图 2.1QBarSeries //1.创建Qchart对象QChart *chart new QChart();chart->setTitle("直方图演示");//设…...

深入分析 Flink SQL 工作机制

摘要&#xff1a;本文整理自 Flink Forward 2020 全球在线会议中文精华版&#xff0c;由 Apache Flink PMC 伍翀&#xff08;云邪&#xff09;分享&#xff0c;社区志愿者陈婧敏&#xff08;清樾&#xff09;整理。旨在帮助大家更好地理解 Flink SQL 引擎的工作原理。文章主要分…...

Spring Bean参数校验Validator

Spring Bean参数校验Validator 以下2种方式可以用于所有的 Spring bean 不仅仅是 Controller 控制器。 一、原始类型参数 在控制器&#xff08;或者其他Bean&#xff09;上使用Validated注解。 控制器类 RestController RequestMapping("account") Validated pub…...

AOP案例

黑马程序员JavaWeb开发教程 文章目录 一、案例1.1 案例1.2 步骤1.2.1 准备1.2.2 编码 一、案例 1.1 案例 将之前案例中增、删、改相关节后的操作日志记录到数据库表中。 操作日志&#xff1a;日志信息包含&#xff1a;操作人、操作时间、执行方法的全类名、执行方法名、方法…...

Facebook海外户Facebook广告被暂停的原因

有很多伙伴在Facebook广告时&#xff0c;有时会遇到账号被暂停&#xff0c;并通知你违反了哪些规则&#xff0c;那么Facebook广告被暂停的原因有哪些呢&#xff1f;今天小编详细梳理了一些原因&#xff0c;可以往下看哦~ 您的Facebook广告被暂停可能有以下几个原因&#xff1a…...

网站企业需要适用于什么服务器?

对于网站企业会选择什么样的服务器呢&#xff1f; 为了保证网站能够稳定的运行需要选择高可用性和可靠性的网站服务器&#xff0c;选择具备高可用性架构的云服务器供应商&#xff0c;能够提供多可用区部署、自动故障转移和备份恢复等功能&#xff0c;保障网站在各种故障情况下的…...

winscp无法上传,删除,修改文件并提示权限不够的分析

使用winscp删除文件,报了个错如下 根据这个错就去百度,网上大部分都是通过下面这种方法解决: 在winscp端进行设置 输入主机名(即IP地址)、用户名和密码,然后点击高级 在箭头所指位置输入sudo + sftp应用程序的路径 先查询 sudo find / -name sftp-server -print点击Sh…...

Hadoop3:MapReduce之InputFormat数据输入过程整体概览(0)

一、MapReduce中数据流向 二、MapTask并行度 1、原理概览 数据块&#xff1a;Block是HDFS物理上把数据分成一块一块。数据块是HDFS存储数据单位。 数据切片&#xff1a;数据切片只是在逻辑上对输入进行分片&#xff0c;并不会在磁盘上将其切分成片进行存储。数据切片是MapRed…...

【Leetcode Python】70.爬楼梯

麻烦大家要自己去leetcode看题目 第一个思路 用递归会超时 return self.climbStairs(n - 1) self.climbStairs(n - 2)第二个思路 滚动数组思想 class Solution(object):def climbStairs(self, n):""":type n: int:rtype: int"""if(n<2)…...

深度学习 - 张量的广播机制和复杂运算

张量的广播机制&#xff08;Broadcasting&#xff09;是一种处理不同形状张量进行数学运算的方式。通过广播机制&#xff0c;PyTorch可以自动扩展较小的张量&#xff0c;使其与较大的张量形状兼容&#xff0c;从而进行元素级的运算。广播机制遵循以下规则&#xff1a; 如果张量…...

【CSS】will-change 属性详解

目录 基本语法属性值常见用途will-change 如何用于优化动画效果示例&#xff1a; will-change 是一个 CSS 属性&#xff0c;用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化渲染性能&#xff0c;提前做一些准备工作&#xff0c;从而提高性能。 基本语法…...

linux安装mysql后,配置mysql,并连接navicat软件

Xshell连接登陆服务器 输入全局命令 mysql -u root -p 回车后&#xff0c;输入密码&#xff0c;不显示输入的密码 注意mysql服务状态&#xff0c;是否运行等 修改配置文件my.cnf&#xff0c;这里没找到就找my.ini&#xff0c;指定有一个是对的 find / -name my.cnf 接下…...

【学习笔记】Axios、Promise

TypeScript 1、Axios 1.1、概述 1.2、axios 的基本使用 1.3、axios 的请求方式及对应的 API 1.4、axios 请求的响应结果结构 1.5、axios 常用配置选项 1.6、axios.create() 1.7、拦截器 1.8、取消请求2、Promise 2.1、封装 fs 读…...

自然资源-关于加强规划实施监督管理的指导意见(浙江省自然资源厅学习借鉴)

自然资源-关于加强规划实施监督管理的指导意见&#xff08;浙江省自然资源厅&#xff08;征求意见稿&#xff09;学习借鉴 以下为征求意见稿的内容&#xff0c;很多干活&#xff1a; 各市、县&#xff08;市、区&#xff09;自然资源主管部门&#xff1a; 为加强国土空间规划…...

408链表的创建和初始化

首先第一个头文件&#xff0c;定义结构体类型 typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //可能作为第一次写c语言的小伙伴看不懂这一段typedef是如何定义的 //基本的解释如下所示 //typedef struct LNode LNode; //typedef struct LNode* LinkL…...

Python数据框/列表生成一列多个同样的值

例1&#xff1a;Python生成100个数字2 方法一&#xff1a; import numpy as np a np.random.randint(2,3,100) 方法二&#xff1a; a [2] list a * 100 #100个数字2的列表 例2&#xff1a;生成100个字符串棒 b 棒 list_b b * 100...

使用 MDC 实现日志链路跟踪,包教包会!

在微服务环境中&#xff0c;我们经常使用 Skywalking、Spring Cloud Sleut 等去实现整体请求链路的追踪&#xff0c;但是这个整体运维成本高&#xff0c;架构复杂&#xff0c;本次我们来使用 MDC 通过 Log 来实现一个轻量级的会话事务跟踪功能&#xff0c;需要的朋友可以参考一…...

【成都信息工程大学】只考程序设计!成都信息工程大学计算机考研考情分析!

成都信息工程大学&#xff08;Chengdu University of Information Technology&#xff09;&#xff0c;简称“成信大”&#xff0c;由中国气象局和四川省人民政府共建&#xff0c;入选中国首批“卓越工程师教育培养计划”、“2011计划”、“中西部高校基础能力建设工程”、四川…...

将单列数据帧转换成多列数据帧

文章目录 1. 查看数据文件2. 读取数据文件得到单例数据帧3. 将单列数据帧转换成多列数据帧 在本次实战中&#xff0c;我们的目标是将存储在HDFS上的以逗号分隔的文本文件student.txt转换为结构化的Spark DataFrame。首先&#xff0c;使用spark.read.text读取文件&#xff0c;得…...

信息学奥赛初赛天天练-20-完善程序-vector数组参数引用传递、二分中值与二分边界应用的深度解析

PDF文档公众号回复关键字:20240605 1 2023 CSP-J 完善程序1 完善程序&#xff08;单选题&#xff0c;每小题 3 分&#xff0c;共计 30 分&#xff09; 原有长度为 n1,公差为1等升数列&#xff0c;将数列输到程序的数组时移除了一个元素&#xff0c;导致长度为 n 的开序数组…...

推荐系统学习 一

参考&#xff1a;一文看懂推荐系统&#xff1a;召回08&#xff1a;双塔模型——线上服务需要离线存物品向量、模型更新分为全量更新和增量更新_数据库全量更新和增量更新流程图-CSDN博客 一文看懂推荐系统&#xff1a;概要01&#xff1a;推荐系统的基本概念_王树森 小红书-CSD…...

分库分表详解

文章目录 分库分表概述分库分表详解分库分表的策略分库分表的注意事项常用的分库分表中间件mysql单表达到多少数据量需要分库分表数据库分库分表缺点分表要停服吗&#xff0c;不停服怎么做 分库分表概述 分库分表是数据库架构设计中的一种常见策略&#xff0c;尤其是在面对大规…...

【java前端课堂】04_类的继承

类的继承 在Java中&#xff0c;继承是面向对象编程的四大基本特性之一&#xff0c;它允许我们根据一个已有的类来定义一个新的类&#xff0c;这个新的类继承了原有类的特性&#xff08;属性和方法&#xff09;&#xff0c;并可以添加新的特性或修改原有特性。这样&#xff0c;…...

React nginx配置,一个端口代理多个项目(转发后找不到CSS,JS及图片资源问题解决)

场景&#xff1a; nginx 配置负载均衡&#xff0c;甲方只提供一个端口&#xff0c;一个域名地址 方法&#xff1a; 一个端口一个域名匹配多个应用 方法一&#xff1a; 依靠设备浏览器区分: 使用UserAgent头来识别用户的客户端, CDN监测vary头的信息&#xff0c;如果内容不一致…...

电商网站的二级怎么做/郴州网站建设网络推广渠道

2019独角兽企业重金招聘Python工程师标准>>> 一、Android Support v4、v7、v13 介绍 Google提供了 Android Support Library package 系列的包来保证** 高版本sdk开发的向下兼容性** &#xff08;即我们用 4.x 开发时&#xff0c;在 1.6 等版本上&#xff0c;可以使…...

一线全屋定制10大品牌/长沙seo优化首选

计算机二级是大学中必不可少的一个证下面小编悄悄告诉你们计算机二级考试中的15个技巧//1.修改Office默认打开方式//据本次参加了模拟考试的考生透露&#xff0c;在打开考生文件夹素材做题时候&#xff0c;可能会出现默认打开方式是wps的情况(有些考点有一级WPS科目)。解决办法…...

最好看免费观看高清大全老师补课/上海关键词优化方法

接触智能车来&#xff0c;说道上位机&#xff0c;以前看到有人在论坛里分享了visualscope&#xff0c;这几天用了下&#xff0c;过程中也遇到了一些问题&#xff0c;首先先说怎么用吧&#xff0c;也帮助一些准备使用同学&#xff0c;给他们一些参考&#xff0c;我当时就自己摸索…...

东莞东城网站建设/互联网广告行业分析

为什么80%的码农都做不了架构师&#xff1f;>>> 数据结构 简单动态字符串SDS&#xff08;Simple Dynamic String&#xff09; 使用sdshdr结构体保存字符串长度&#xff0c;使获取字符串长度时间复杂度为O(n)动态空间管理动态扩张机制(字符串变长后自动触发&#xf…...

莆田免费建站模板/拉新项目官方一手平台

CIW Fireworks MX2004认证考试试题 难度级别&#xff1a; 难*** 中** 易* 1. 单项选择题&#xff08;共25题&#xff0c;每小题2分&#xff0c;共50分。每小题选择结果正确得2分&#xff0c;选择结果错误或不选择均不得分。&#xff09;克隆和 Duplicate 之间的区别是什么…...

建设网站元素搜索引擎/网站优化方案设计

c语言 函数的参数传递示例C语言中的rename()函数 (rename() function in C) The rename() function is defined in the <stdio.h> header file. 在<stdio.h>头文件中定义了rename()函数 。 Prototype: 原型&#xff1a; int rename(const char* old-filename, co…...