目录
widget常用属性及其作用
enabled
geomtry
window frame
window frame的影响
相关API
windowTitle
windowIcon
qrc机制
qrc使用方式
自定义鼠标图片
设置字体样式
设置鼠标悬停提示
toolTip
控件获取焦点
styleSheet
widget常用属性及其作用
属性 | 作用 |
enabled | 设置控件是否可使用 |
geometry | 位置和尺寸,包含x,y,width,height四个部分 |
windowTitle | 设置widget标题 |
windowIcon | 设置widget图标 |
windowOpacity | 设置widget透明度 |
cursor | 鼠标悬停时显示的图标形状,是普通箭头,还是沙漏,还是十字等 |
font | 字体相关属性. 涉及到字体家族, 字体⼤⼩, 粗体, 斜体, 下划线等等样式 |
toolTip | ⿏标悬停在 widget 上会在状态栏中显⽰的提⽰信息 |
toolTipDuring | toolTip 显⽰的持续时间. |
statusTip | Widget 状态发⽣改变时显⽰的提⽰信息(⽐如按钮被按下等) |
whatsThis | ⿏标悬停并按下 alt+F1 时, 显⽰的帮助信息(显⽰在⼀个弹出的窗⼝中). |
styleSheet | 允许使⽤ CSS 来设置 widget 中的样式. Qt 中⽀持的样式⾮常丰富, 对于前端开发⼈员上⼿是⾮常友好的. |
focusPolicy | 该 widget 如何获取到焦点. • Qt::NoFocus:控件不参与焦点管理,即⽆法通过键盘或⿏标获取焦点 • Qt::TabFocus:控件可以通过Tab键获得焦点 • Qt::ClickFocus:控件可以通过⿏标点击获得焦点 • Qt::StrongFocus:控件可以通过键盘和⿏标获得焦点 • Qt::WheelFocus:控件可以通过⿏标滚轮获得焦点(在某些平台或样式中可能不可 ⽤) |
layoutDirection | 布局⽅向. • Qt::LeftToRight:⽂本从左到右排列,也是默认值。 • Qt::RightToLeft:⽂本从右到左排列。 • Qt::GlobalAtomics:部件的布局⽅向由全局原⼦性决定(PS 这个翻译其实有点尴尬. 其实就是根据应⽤程序中的其他 widget 布局⽅向确定的) |
inputMethodHints | 针对输⼊框有效, ⽤来提⽰⽤⼾当前能输⼊的合法数据的格式. ⽐如只能输⼊数字, 只能 输⼊⽇期等. |
enabled
API | 说明 |
---|---|
isEnabled() | 获取到控件的可用状态 |
setEnabled | 设置控件是否可使用 |
示例:
button->setEnabled(false); //设置禁用
*所谓“禁用”指的是该控件不能接收任何用户的输入事件,并且外观往往也是灰色的。
*如果一个widget被禁用,则该widget的子元素也被禁用。
geomtry
位置和尺寸,其实是四个属性的统称:
- x 横坐标
- y 纵坐标
- width 宽度
- heigh t宽度
API | 说明 |
---|---|
geometry() | 获取到控件的位置和尺寸,返回结果是一个QRect,包含x,y,width,height,其中 x,y是左上角的坐标 |
setGeometry(QRect) setGeometry(int x,int y,int width,int height) | 设置控件的位置和尺寸,可以直接设置一个QRect,也可以分四个属性单独设置 |
//获取当前位置信息
QRect rect = ui->pushButton_target->geometry();
//改变控件位置信息
ui->pushButton_target-> setGeometry (rect. x () - 5 , rect. y (), rect. width (),rect. height ());
window frame
window frame的影响
如果 widget 作为⼀个窗⼝ (带有标题栏, 最⼩化, 最⼤化, 关闭按钮), 那么在计算尺⼨和坐标的时候就有两种算法. 包含 window frame 和 不包含 window frame.其中 x(), y(), frameGeometry(), pos(), move() 都是按照包含 window frame 的⽅式来计算的.其中 geometry(), width(), height(), rect(), size() 则是按照不包含 window frame 的⽅式来计算的.当然, 如果⼀个不是作为窗⼝的 widget , 上述两类⽅式得到的结果是⼀致的.
实际差别如下图所示
相关API
API | 说明 |
---|---|
x() | 获取横坐标 计算时包含 window frame |
y() | 获取纵坐标 计算时包含 window frame |
pos() | 返回 QPoint 对象, ⾥⾯包含 x(), y(), setX(), setY() 等⽅法. 计算时包含 window frame |
frameSize() | 返回 QSize 对象, ⾥⾯包含 width(), height(), setWidth(), setHeight() 等⽅法. 计算时包含 window frame |
frameGeometry() | 返回 QRect 对象. QRect 相当于 QPoint 和 QSize 的结合体. 可以获取 x, y, width, size. 计算时包含 window frame 对象. |
width() | 获取宽度 计算时不包含 window frame |
height() | 获取⾼度 计算时不包含 window frame |
size() | 返回 QSize 对象, ⾥⾯包含 width(), height(), setWidth(), setHeight() 等⽅法. 计算时不包含 window frame |
rect() | 返回 QRect 对象. QRect 相当于 QPoint 和 QSize 的结合体. 可以获取并设置 x, y, width, size. 计算时不包含 window frame 对象 |
geometry | 返回 QRect 对象. QRect 相当于 QPoint 和 QSize 的结合体. 可以获取 x, y, width, size. 计算时不包含 window frame 对象. |
setGeometry | 直接设置窗⼝的位置和尺⼨. 可以设置 x, y, width, height, 或者 QRect 对象. 计算时不包含 window frame 对象 |
windowTitle
API | 说明 |
---|---|
windowTitle() | 获取到控件的窗⼝标题. |
setWindowTitle(const QString& title) | 设置控件的窗⼝标题. |
代码示例:
this -> setWindowTitle ( " 这是标题 " );
windowIcon
API | 说明 |
---|---|
windowIcon() | 获取到控件的窗⼝图标. 返回 QIcon 对象. |
setWindowIcon(const QIcon& icon ) | 设置控件的窗⼝图标. |
注意:同 windowTitle, 上述操作仅针对顶层 widget 有效.
代码示例:
// 创建图标对象QIcon icon ( "d:/rose.jpg" );// 设置图标this -> setWindowIcon (icon);
设置图标的时候,可能会存在路径图片的问题,因此,Qt中有一个qrc机制
qrc机制
这个机制从根本上解决下述两个问题:
- 确保你的图片所在的路径在目标用户机器上存在
- 确保你的图片不会被用户搞没了
在Qt项目引入一个额外的xml文件(后缀名使用 .qrc表示)在这个xml中把要使用的图片资源给导入进来,并且在xml中进行记录。
Qt在编译项目的时候,就会根据qrc中描述的图片信息,找到图片内容,并且提取出图片的二进制数据,把这些二进制数据转成C++代码,最终编译到exe里。
但是qrc机制也存在缺点:无法导入太大的资源文件,比如搞几个GB的这种视频文件,qrc就无能为力了
qrc使用方式
第一步:在项目中创建一个qrc文件,文件名不要带中文和特殊符号
第二步:把图片导入到qrc文件中
(1)先创建一个“前缀”(prefix)
所谓的“前缀”可以理解成虚拟的目录,这个目录没有在你的电脑上真实存在,是Qt自己抽象出来的 ,qrc机制本质上就是把图片的二进制数据,转成C++代码(最终就会在代码中看到很大的char数组,里面就是图片的二进制数据)
为了方便Qt代码中访问到这个图片,Qt就自己抽象出了虚拟的目录
(2)把需要的图片导入到资源文件中
上示的按钮在创建prefix之前是禁用的,创建好prefix之后就可以使用了,添加的文件就是添加到prefix下面的。 点击这个按钮后,所得到的目录就是当前代码所在的目录。
导入图片的时候,需要确保你导入的图片必须在resourse.qrc文件的同级目录
如上即可完成添加。
当代码中需要访问qrc中管理的文件时,就需要在路径上带有:前缀,格式如下:
QIcon icon(" :/wallhaven-7p3993.jpg")
自定义鼠标图片
//访问到图片文件QPixmap pixmap(":/123.jpg");//构造光标对象QCursor cursor(pixmap,10,10);//把光标设置进去this->setCursor(cursor);
但是图片可能会因为太大或者太小,所以我们可以通过缩放或者放大图片以便实现效果
//访问到图片文件QPixmap pixmap(":/123.jpg");pixmap = pixmap.scaled(100,100);
缩放操作不是对图像本身进行修改,而是 返回一个新的图像副本,所以我们需要将它在存起来
iconfont-阿里巴巴矢量图标库
设置字体样式
QLabel* label= new QLabel(this);label->setText("这是一段文本");//创建字体对象QFont font;font.setFamily("仿宋");font.setPixelSize(30);font.setBold(true);font.setItalic(true);font.setUnderline(true);font.setStrikeOut(true);//把font对象设置到lebel中label->setFont(font);
设置鼠标悬停提示
一个GUI程序,界面比较复杂,按钮很多的时候,我们希望鼠标悬停在某个控件的时候,能弹出一个提示
toolTip
API | 说明 |
---|---|
setToolTip | 设置toolTip 鼠标悬停在该widget上时会有提示说明 |
setToolTipDuring | 设置toolTip提示的时间,单位ms。 时间到后toolTip自动消失 |
代码示例:
ui->pushButton_yes-> setToolTip ( " 这个是 yes 按钮 " );ui->pushButton_yes-> setToolTipDuration ( 3000 );
控件获取焦点
API | 说明 |
---|---|
focusPolicy() | 获取该 widget 的 focusPolicy, 返回 Qt::FocusPolicy |
setFocusPolicy(Qt::FocusPolicy policy ) | 设置 widget 的 focusPolicy. |
Qt::FocusPolicy 是⼀个枚举类型. 取值如下• Qt::NoFocus :控件不会接收键盘焦点• Qt::TabFocus :控件可以通过Tab键接收焦点• Qt::ClickFocus :控件在⿏标点击时接收焦点• Qt::StrongFocus :控件可以通过Tab键和⿏标点击接收焦点 (默认值)• Qt::WheelFocus : 类似于 Qt::StrongFocus , 同时控件也通过⿏标滚轮获取到焦点 (新增的选项, ⼀般很少使⽤).
styleSheet
CSS 中可以设置的样式属性⾮常多 . 基于这些属性 Qt 只能⽀持其中⼀部分, 称为 QSS (Qt Style Sheet) . 具体的⽀持情况可以参考 Qt ⽂档中 "Qt Style Sheets Reference" 章节.
代码示例:
this -> setStyleSheet ( "background-color: #333" );ui->textEdit-> setStyleSheet ( "background-color: #333; color: #fff;" );ui->pushButton_light-> setStyleSheet ( "color: #fff" );ui->pushButton_dark-> setStyleSheet ( "color: #fff" );