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);");