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

Qt:QWidget常用属性

目录

1.enabled

 2.geometry

3.认识Window Frame 

4.windowTitle

5.windowIcon

6.windowOpacity

7.cursor

8.font

9.toolTip

10.focusPolicy

11.styleSheet


Qt中的各种控件都是继承自QWidget。

1.enabled

描述一个控件是否处于可用状态。

禁用状态:

1.禁用指不接受用户的任何输入事件,并且外观往往是灰色的。

2.如果一个Widget被禁用,则其中的子元素也被禁用。

函数接口

isEnabled()获取控件的可用状态。

setEnabled()设置控件是否可用,true为可用,false为禁用。

QPushButton* button = new QPushButton(this);
button->setText("按钮");
button->setEnabled(false);

 

实现点击一个按钮可用切换另一个按钮的可用状态。 

void Widget::on_pushButton_clicked()
{//获取第一个按钮的可用状态bool enable = ui->pushButton_2->isEnabled();if(enable){ui->pushButton_2->setEnabled(false);}else{ui->pushButton_2->setEnabled(true);}}void Widget::on_pushButton_2_clicked()
{qDebug() << "执行槽函数";
}

 2.geometry

翻译为几何,在Qt中,指四个属性的统称。x、y、width、height。

它们的关系如下。

 

函数接口

geometry,返回一个QRect,其中包含了x、y、width、height,QRect是Qt封装的一个矩形、QPoint是Qt封装的一个点。 

setGeometry(QRect)

setGeometry(int x, int y, int width, int height)

相比之下,move函数只能修改x、y的值,而setGeometry可以修改x、y、width、height。

  • 写一个样例,用上下左右四个方向键,来控制Target按钮的位置。

void Widget::on_pushButton_up_clicked()
{QRect rect = ui->pushButton_Target->geometry();qDebug() << rect;rect.setY(rect.y()-5);ui->pushButton_Target->setGeometry(rect);
}void Widget::on_pushButton_down_clicked()
{QRect rect = ui->pushButton_Target->geometry();qDebug() << rect;rect.setY(rect.y()+5);ui->pushButton_Target->setGeometry(rect);
}void Widget::on_pushButton_left_clicked()
{QRect rect = ui->pushButton_Target->geometry();qDebug() << rect;rect.setX(rect.x()-5);ui->pushButton_Target->setGeometry(rect);
}void Widget::on_pushButton_right_clicked()
{QRect rect = ui->pushButton_Target->geometry();qDebug() << rect;rect.setX(rect.x()+5);ui->pushButton_Target->setGeometry(rect);
}

 

在这段代码中,仅仅修改了x、y的坐标,所以随着坐标的变化,尺寸也跟着变化。如果只是想让他平移,则应该这样写。

void Widget::on_pushButton_up_clicked()
{QRect rect = ui->pushButton_Target->geometry();qDebug() << rect;ui->pushButton_Target->setGeometry(rect.x(),rect.y()-5,rect.width(),rect.height());
}void Widget::on_pushButton_down_clicked()
{QRect rect = ui->pushButton_Target->geometry();qDebug() << rect;ui->pushButton_Target->setGeometry(rect.x(),rect.y()+5,rect.width(),rect.height());
}void Widget::on_pushButton_left_clicked()
{QRect rect = ui->pushButton_Target->geometry();qDebug() << rect;ui->pushButton_Target->setGeometry(rect.x()-5,rect.y(),rect.width(),rect.height());}void Widget::on_pushButton_right_clicked()
{QRect rect = ui->pushButton_Target->geometry();qDebug() << rect;ui->pushButton_Target->setGeometry(rect.x()+5,rect.y(),rect.width(),rect.height());
}

 

 

  •  样例练习

 

点击同意,则修改标签内容。

点击拒绝,则让拒绝按钮的位置随机变化。

void Widget::on_pushButton_accept_clicked()
{ui->label->setText("修改了标签内容");
}void Widget::on_pushButton_reject_clicked()
{srand(time(nullptr));//按钮的位置随机变化,但是不能出现在窗口外部,所以先获取窗口的尺寸int width = this->geometry().width();int height = this->geometry().height();//随机生成一个坐标int x = rand() % width;int y = rand() % height;//ui->pushButton_reject->move(x,y);
}

 

3.认识Window Frame 

window frame窗口框架,即下图中上面这一条窄框框,由操作系统自动生成,但是可以自定义的修改样式。

 

 

所谓的坐标系,是以Widget左上角为原点,还是以window frame左上角为原点?

在Qt中,提供了相对较多的坐标、尺寸函数,所以这两种坐标体系的操作都有,拿geometry来说

geometry()、setGeometry()这一组是不考虑window frame

frameGeometry()、setFrameGeometry()这一组是考虑window frame

 

4.windowTitle

    this->setWindowTitle("设置窗口标题");QPushButton* button = new QPushButton(this);button->setText("按钮");button->setWindowTitle("新的标题");

设置标题一定是独立窗口设置时才会生效,如this设置标题,如果是按钮,即widget的子控件,则不生效。

5.windowIcon

setWindowIcon(const QIcon& icon)在实际开发过程中经常使用,设置窗口图标,也是只对顶层窗口才有效。

windowIcon,用来获取窗口图标,返回一个QIcon类(Qt定义的),表示窗口图标。

在代码中,写一个Qt中的对象,比如QPushButton,往往都是new出来,而QIcon对象可以直接在栈区创建,QIcon对象是要设置到QWidget中,等于一次拷贝,所以我们创建的QIcon是一个临时对象,不必关注它是否释放,并且QIcon的构造函数也没有支持父对象的重载,不支持对象树。

QIcon icon("D:/LocalPrictures/R-C.jpg");
this->setWindowIcon(icon);

 

 

通过文件路径找图片资源有两个缺点。

1.当我们的程序换一台机器编译时,可能文件路径不匹配,所以在编写代码时,尽可能少用绝对路径,而是相对路径。

2.即使使用相对路径,也可能丢失资源。

所以,Qt引入一种qrc机制。

qrc机制原理:

给Qt项目引入一个额外的xml文件(但是后缀名为.qrc),将图片资源导入到这个xml文件中,并在xml记录相关信息。

Qt在编译项目的时候,根据qrc中对图片信息的描述,找到图片内容(本质是一串二进制文本),提取出来并转换成C++代码,最终编译到exe文件中。

qrc的缺点就是无法导入大文件,比如几个G的视频。

  • qrc使用

 

 

 

第一步,先添加一个前缀。

 

 

前缀可以理解成虚拟目录,并不是电脑上真实的目录,而是Qt抽象出来的,qrc机制本质上是把图片的二进制数据,转换成C++代码(在转换后的C++代码中,有一个很大的char数组,里面就是图片的二进制数据),为了方便Qt访问到这个图片,就抽象出虚拟目录 

把前缀修改成 /

 

 

第二步,导入图片,点击Add Files

 

 

 确保要导入图片的路径在qrc文件的同级目录,或者同级目录的子目录。比如qrc文件的同级目录下有一个Image的目录,要导入的图片就在它下面。

 

 

 

QIcon icon(":/Image/R-C.jpg"); 冒号+前缀+文件名
this->setWindowIcon(icon);

 

 

 

qrc机制中,将图片转换成C++代码后,C++文件在哪里?在上级目录中的debug目录下。

 

打开这个文件,发现文件内容就是一个很大的数组,每一个字节就是图片的一个字节二进制数据

当编译器执行时,这个文件也被编译到项目中,添加到exe中,加载到内存中, 只有程序在运行,这些数据就都在内存中能找到,图标就能正常显示。

6.windowOpacity

设置窗口的不透明度。

 

点击+按钮增加不透明度,即窗口越来越明显,点击-按钮增加透明度,即窗口越来越透明。

void Widget::on_pushButton_add_clicked()
{float opacity = this->windowOpacity();if(opacity >= 1.0){return;}opacity += 0.1;this->setWindowOpacity(opacity);
}void Widget::on_pushButton_sub_clicked()
{float opacity = this->windowOpacity();if(opacity <= 0.0){return;}opacity -= 0.1;this->setWindowOpacity(opacity);
}

窗口的不透明度并不是严格+-0.1来变化, 这和浮点数在内存中的存储有关。

 

7.cursor

修改鼠标光标的样式。

cursor(),获取当前widget的cursor属性,返回一个QCursor对象。

setCursor(const QCursor& cursor)

QGuiApplication::setOverrideCursor(const QCursor& cursor)设置光标的全局形状,覆盖setCursor的设置。

 

 

也可以在代码中修改。

QCursor cursor = Qt::WaitCursor;
QPushButton * button = new QPushButton(this);
button->setCursor(cursor);

 Qt内置的鼠标样式。

    enum CursorShape {ArrowCursor,UpArrowCursor,CrossCursor,WaitCursor,IBeamCursor,SizeVerCursor,SizeHorCursor,SizeBDiagCursor,SizeFDiagCursor,SizeAllCursor,BlankCursor,SplitVCursor,SplitHCursor,PointingHandCursor,ForbiddenCursor,WhatsThisCursor,BusyCursor,OpenHandCursor,ClosedHandCursor,DragCopyCursor,DragMoveCursor,DragLinkCursor,LastCursor = DragLinkCursor,BitmapCursor = 24,CustomCursor = 25};

Qt允许自定义鼠标样式。

导入图片后,Qt用QPixmap表示一个图片。

QPixmap image(":/R-C.jpg");
//pixmap进行缩放,返回一个副本
image = image.scaled(100,70);
QCursor cursor_(image,10,10);//还可以设置热点的位置,默认是左上角
this->setCursor(cursor_);

8.font

 设置widget的字体信息。

setFont(const QFont&)

QFont包含

 

Qt Designer支持修改Font属性

 

也可以用代码的方式来修改。

    QLabel* label = new QLabel(this);label->setText("Widget的Font属性");//创建fontQFont font;font.setFamily("微软雅黑");//设置字体font.setPixelSize(30);//设置字体大小是多少像素font.setBold(true);//加粗font.setItalic(true);//倾斜font.setUnderline(true);//下划线font.setStrikeOut(true);//删除线//添加到Label中label->setFont(font);

 

 

 

9.toolTip

当把鼠标悬停在这个控件上的时候,可以弹出一个提示。

setToolTip()设置提示的内容。

setToolTipDuration()设置提示的时间。

 ui->pushButton->setToolTip("按钮的提示");ui->pushButton->setToolTipDuration(3000);

10.focusPolicy

设置焦点策略

在GUI界面中,假设有一个输入框控件,只有让光标选中输入框后,键盘输入的值才会被记录。

我们把上述中,“让光标选中输入框”这个操作称为获得焦点。

一般来说,一个控件获取焦点有两种方式。

1.鼠标点击

2.按下Tab键

focusPolicy()获取Widget的focusPolicy,返回一个Qt::FocusPolicy

setFocusPolicy(Qt::FocusPolicy)设置Widget的focusPolicy

 

 

11.styleSheet

通过CSS设置Widget的样式。

CSS:层叠样式表,常用于网页开发中,主要用来美观网页。

Qt参考CSS,做了一套QSS

QSS的属性设置在Qt文档中都有说明。

也可以用代码来设置。

比如切换白天模式、夜间模式。

 


void Widget::on_pushButton_day_clicked()
{//设置整个窗口的背景是白色。this->setStyleSheet("background-color:white;");ui->plainTextEdit->setStyleSheet("color:black;");//设置按钮ui->pushButton_day->setStyleSheet("color:black;");ui->pushButton_night->setStyleSheet("color:black;");}void Widget::on_pushButton_night_clicked()
{//设置整个窗口的背景是白色。this->setStyleSheet("background-color:black;");ui->plainTextEdit->setStyleSheet("color:white;");//设置按钮ui->pushButton_day->setStyleSheet("color:white;");ui->pushButton_night->setStyleSheet("color:white;");
}

 QSS/CSS其实并不常用black、green这样的单词来修改颜色,而是用RGB三原色按照不同比例混合,组成不同的颜色。

计算机中,用一个字节表示R,一个字节表示G,一个字节表示B

而一个字节的表示形式可以是十进制:0->255、也可以是十六进制:0x0->0xFF

于是,最终表示一个颜色就是:

1.rgb(255,0,255)第一个255表示红色拉满,第二个0表示绿色比例为0,第三个255表示蓝色拉满

2.#FF0000:表示纯红色。

要想知道一个颜色具体的RGB值,往往用到一个叫取色器的东西,QQ自带的截图就有这个功能。

了解了计算机用RGB的方式表示颜色以后,可以在代码中修改成RGB方式。

this->setStyleSheet("background-color:rgb(240,240,240);");
http://www.dtcms.com/a/267917.html

相关文章:

  • NV205NV209美光固态闪存NV210NV215
  • QT并发机制
  • Qt实现外网双向音视频通话/支持嵌入式板子/实时性好延迟低/可以加水印
  • Linux系统移植(7.4)
  • C#实现CAN通讯接口
  • python-if结构、三目运算符
  • 一个简单的脚本,让pdf开启夜间模式
  • 【IOS】XCode创建firstapp并运行(成为IOS开发者)
  • Maixcam的使用3程序打包
  • 【机器学习笔记Ⅰ】13 正则化代价函数
  • 2025年6月AIGC发展全景:技术轻量化、Agent产业化与伦理新挑战
  • bottles安装网易云出现的问题01中文出现乱码问题
  • 等保测评-Apache Tomcat中间件
  • SpringMVC参数接收与数据返回详解
  • MySQL 8.0 主从复制原理分析与实战
  • 传统微商困境与开源链动2+1模式、AI智能名片及S2B2C商城小程序的转型破局
  • 数据挖掘:从理论到实践的深度探索
  • 基于腾讯云开发与“人·事·财·物”架构理念的家政预约小程序设计与实现
  • 【PyTorch】PyTorch中torch.nn模块的卷积层
  • 10.1《3步用ChatGPT+LangChain打造高质量私有数据集,模型效果提升200%》
  • Java多线程知识小结:Synchronized
  • Flink ClickHouse 连接器数据读取源码深度解析
  • G-sensor运动检测功能开源:打破技术壁垒,加速智能硬件开发!
  • Java JDBC的初步了解
  • 力扣网编程45题:跳跃游戏II之正向查找方法(中等)
  • 【深度学习新浪潮】AI在材料力学领域的研究进展一览
  • 基于51单片机智能婴儿床
  • SQL 一键生成 Go Struct!支持字段注释、类型映射、结构体命名规范
  • 从前端转go开发的学习路线
  • 3、Configuring Topics