1. QWidget
- 可以在Qt Creator 右侧看到 QWidget 的各种属性

2 QWidget常用属性
2.1 enabled
- 描述了一个控件是否"可用"状态,相对于"禁用"
- 禁用:该控件不能接收任何用户的输入事件,并且外观上是灰色的
- 如果一个 widget 被禁用,则该 widget 的子元素也被禁用
- isEnabled:获取到控件的可用状态
- setEnabled:设置控件是否可用,true 表示可用,false 表示禁用

- 禁用状态切换
cpp
void Widget::on_pushButton_clicked()
{
qDebug()<<"执行了槽函数!";
}
void Widget::on_pushButton_enable_clicked()
{
// 切换第一个按钮的禁用状态
// 1.先获取第一个按钮当前的可用状态
bool enable=ui->pushButton->isEnabled();
if(enable)
{
ui->pushButton->setEnabled(false);
}else{
ui->pushButton->setEnabled(true);
}
}
2.2 geometry
- 几何

- geometry():获取控件的位置和尺寸,返回一个QRect,包含x,y,width,height
- QPoint表示一个点,只有x,y
- QRect表示一个矩形,有x,y,width,height
- 都是小对象,里面的属性很少,占用空间也小,通常会传值来传递参数
- setGeometry(QRect)/setGeometry(int x,int y,int width,int height)
- 设置控件位置和尺寸
cpp
void Widget::on_pushButton_up_clicked()
{
// 获取到 target 本身的 geometry
QRect rect=ui->pushButton_target->geometry();
qDebug()<<rect;
// 修改 target 坐标
// rect.setY(rect.y()-5);
// ui->pushButton_target->setGeometry(rect);
ui->pushButton_target->setGeometry(rect.x(),rect.y()-5,rect.width(),rect.height
());
}
- pressed:鼠标按下时触发。点击鼠标分为按下和抬起两步
cpp
// 鼠标按下(未抬起时)
void Widget::on_pushButton_2_pressed()
{
// 点击这个按钮就把这个按钮挪走
// 可以通过生成随机数的方式,来确定按钮的新位置
// 获取当前窗口尺寸
int width=this->geometry().width();
int height=this->geometry().height();
// 重新生成按钮的位置
int x=rand()%width;
int y=rand()%height;
// 移动按钮位置
ui->pushButton_2->move(x,y);
}
2.3 window frame 窗口框架
- 在 Qt 中,关于位置尺寸,提供了很多的 API
- 考虑 window frame,以 window frame 左上角为原点
- frameGeometry()
- setFrameGeometry()
- 不考虑 window frame,以 Widget 左上角为原点
- geometry()
- setGeometry()
- 考虑 window frame,以 window frame 左上角为原点
2.4 windowTitle
- 只能针对顶层窗口这样的 QWidget 才有效
- windowTitle():获取控件的窗口标题
- setWindowTitle(const QString& title):设置控件的窗口标题

2.5 windowIcon
- 类似于 windowTitle,针对顶层窗口才有效
- windowIcon():获取到控件的窗口图标,返回 QIcon(图标) 对象
- setWindowIcon(const QIcon& icon):设置控件的窗口图标
- 路径不要带中文,使用 / 或 \\ 作为路径分隔,使用相对路径
- 优先在栈上创建图标, QIcon 自身是一个比较小的对象,创建出来之后就是要设置到某个 QWidget 里面。QIcon 对象本身是否释放影响图标最终的显示
2.5.1 qrc机制
- qrc 机制(把外部文件"打包"进程序里)从根本上解决两个问题
- 确保图片所在的路径在目标用户机器上存在
- 确保图片不会被用户搞没了
- 缺点:无法导入太大的资源文件
- 本质:把 图片 的二进制数据,转成 C++ 代码
2.5.1.1 创建qrc文件:
- 在项目中创建一个 qrc 文件,文件名不要带中文和特殊符号



2.5.1.2 添加资源文件
-
创建一个"前缀"(Prefix)
- 所谓的前缀,可以理解为虚拟的目录,是Qt自己抽象出来的
-
点击"添加前缀"之后把前缀变为 / 即可

-
把刚才的图片导入到资源文件中
- 要求导入的资源文件必须在 resource.qrc 文件的同级目录,或者同级目录的子目录里


- 要求导入的资源文件必须在 resource.qrc 文件的同级目录,或者同级目录的子目录里
2.5.1.3 使用qrc中资源文件
- 当代码中需要访问 qrc 中管理的文件时,就需要在路径上带有 :前缀文件名

2.6 windowOpacity
- 透明效果,初始默认值为1
- windowOpacity():获取控件的不透明数值,返回float,取值为0.0-1.0
- 0.0:全透明
- 1.0:完全不透明
- setWindowOpacity(float n):设置控件不透明度
cpp
void Widget::on_pushButton_add_clicked()
{
float opacity=this->windowOpacity();
if(opacity>=1.0)
return;
qDebug()<<opacity;
opacity+=0.1;
this->setWindowOpacity(opacity);
}
void Widget::on_pushButton_sub_clicked()
{
float opacity=this->windowOpacity();
if(opacity<=0)
return;
qDebug()<<opacity;
opacity-=0.1;
this->setWindowOpacity(opacity);
}
- 两个问题
- 透明度变化,并非是精准的
- 浮点数用二进制和科学计数法表示,分为符号位,有效数字,指数部分
- 小数有效数字每一位代表的分别是0.5,0.25,0.125,,,有的数字凑不出来
- 优点:运算速度快,占用空间小
- 缺点:有些小数无法精确表示
- 平时写代码不要比较直接用 == 比较两个浮点数,作差,判断绝对值是否符合预期范围
- 算钱或精度高的地方,慎用 float/double
- 浮点数用二进制和科学计数法表示,分为符号位,有效数字,指数部分
- 上述代码,在进行设置前,先判定了 opacity 的范围,然后再决定是否设置。这个判定其实可以不写,为啥我们仍然要写上
- 防御性编程:别人犯错了,不会对我们自身构成太大的伤害

- 防御性编程:别人犯错了,不会对我们自身构成太大的伤害
- 透明度变化,并非是精准的
2.7 cursor
- 鼠标样式
- cursor():获取当前 widget 的 cursor 属性,返回 QCursor 对象,当鼠标悬停在该 widget 上时,就会显示出对应的形状
- setCursor(const QCursor& cursor):设置该 widget 光标的形状,仅在鼠标停留在该 widget 上时生效
- 上面两个是 Widget 级别的,同一个界面中,不同的控件可以设置成不同的光标
- QGuiApplication::setOverrideCursor(const QCursor& cursor):设置全局光标的形状,对整个程序中的所有 widget 都会生效,覆盖上面的 setCursor 设置的内容
- Qt 允许通过自定义的图片来设置光标
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 访问到图片文件
QPixmap pixmap(":/12.png");
pixmap=pixmap.scaled(50,50); //缩放图片
// 构造光标对象
// 默认情况下,鼠标点击时,相当于图片的左上角在进行点击
QCursor cursor(pixmap,10,10);
// 10,10 以图片左上角为0,0原点,找到10,10这个位置作为鼠标真正点击位置
// 把光标设置进去
this->setCursor(cursor);
}
2.8 font
- 字体
- font():获取当前 widget 的字体信息,返回 QFont 对象
- setFont(const QFront& font):设置当前 widget 字体信息


2.9 toolTip
- 当把鼠标悬停到一个控件的时候,就能弹出一个提示
- setToolTip:设置 toolTip,提示内容
- setToolTipDuration:设置 toolTip 提示的时间,单位 ms,时间到后提示消失
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置两个按钮的tooltips
ui->pushButton_yes->setToolTip("yes");
ui->pushButton_yes->setToolTipDuration(2000);
ui->pushButton_no->setToolTip("no");
ui->pushButton_no->setToolTipDuration(2000);
}
2.10 focusPolicy
- 焦点:指的是能选中某个单位,接下来的操作就都是针对该焦点元素进行了
- 一个控件获取到焦点,主要是两种方式
- 鼠标点击
- 键盘的tab
- focusPolicy():获取该 widget 的 focusPolicy,返回 Qt::FocusPolicy
- setFocusPolicy(Qt::FocusPolicy policy):设置 widget 的 focusPolicy
- Qt::FocusPolicy是一个枚举类型,取值如下
- Qt::NoFocus:控件不会接收键盘焦点,像 label 这种
- Qt::TabFocus:控件可以通过Tab键接收焦点
- Qt::ClickFocus:控件在鼠标点击时接收焦点
- Qt::StrongFocus:控件可以通过 Tab 键和鼠标点击接收焦点(默认值)
- Qt::WheelFocus:类似于 Qt::StrongFpcus,同时空间也可以通过鼠标滚轮获取到焦点
2.11 styleSheet
- 样式表:描述界面具体是啥样子
- 格式:键值对
- 键和值之间 : 分隔
- 键值对和键值对之间,使用 ; 分隔

- 计算机三原色:红蓝绿
cpp
void Widget::on_pushButton_light_clicked()
{
// 设置窗口样式
this->setStyleSheet("background-color: rgb(240,240,240);");
// 设置输入框的样式
ui->plainTextEdit->setStyleSheet("background-color: white;color: black");
// 设置按钮的样式
ui->pushButton_light->setStyleSheet("color: black");
ui->pushButton_black->setStyleSheet("color: black");
}
void Widget::on_pushButton_black_clicked()
{
// 设置窗口样式
this->setStyleSheet("background-color: black;");
// 设置输入框的样式
ui->plainTextEdit->setStyleSheet("background-color: black;color: white");
// 设置按钮的样式
ui->pushButton_light->setStyleSheet("color: white");
ui->pushButton_black->setStyleSheet("color: white");
}