目录
1. enabled:是否可用状态
2. geometry:位置与大小
3. windowFrame:窗口框架
4. windowTitle:窗口标题
5. windowIcon:窗口图标
6. qrc 资源文件机制
7. windowOpacity:窗口透明度
8. cursor:修改光标
9. font:字体相关
10. toolTip:提示文本
11. focusPolicy:焦点策略
12. styleSheet:样式表(仿CSS的QSS)
1.enabled:是否可用状态
禁用状态:控件不接受用户输入(如点击)。
一个父控件被禁用,其所有子控件也会被禁用。
示例:用按钮控制另一个按钮的可用状态。
void Widget::on_pushButton_clicked() { this->setWindowTitle("开"); } void Widget::on_pushButtonEnabled_clicked() { bool fl = ui->pushButton->isEnabled(); if(fl) { ui->pushButton->setEnabled(false); } else { ui->pushButton->setEnabled(true); } }
2.geometry:位置与大小
是四个属性的统称:
x,y(左上角坐标),width,height。QT 将它们封装在一个
QRect类里。注意:如果只修改
x,y坐标,按钮的大小不会改变,只是位置移动。但如果只使用geometry()获取矩形然后修改y坐标并设置回去,按钮可能会被拉伸或压缩。这是因为setY()方法只是改变了矩形的y值,而没有保持高度。正确示例:移动按钮。
void Widget::on_up_clicked() { auto rec = ui->pushButton->geometry(); ui->pushButton->setGeometry({rec.x(), rec.y()-10, rec.width(), rec.height()}); } void Widget::on_down_clicked() { auto rec = ui->pushButton->geometry(); ui->pushButton->setGeometry({rec.x(), rec.y()+10, rec.width(), rec.height()}); } void Widget::on_left_clicked() { auto rec = ui->pushButton->geometry(); ui->pushButton->setGeometry({rec.x()-10, rec.y(), rec.width(), rec.height()}); } void Widget::on_right_clicked() { auto rec = ui->pushButton->geometry(); ui->pushButton->setGeometry({rec.x()+10, rec.y(), rec.width(), rec.height()}); }
3.windowFrame:窗口框架
在
Widget窗口顶端显示“Widget”字母的细条,就是windowFrame框架。有些 API 以窗口客户区(不含边框)的左上角为
(0, 0),有些则以包含边框的整个窗口左上角为(0, 0)。QRect r1 = this->geometry(); // 客户区矩形 QRect r2 = this->frameGeometry(); // 包含窗口框架的矩形 qDebug() << r1; qDebug() << r2;注意:如果在构造函数中直接打印,可能会得到
(0, 0),因为此时窗口的界面可能尚未完全构造出来。应在按钮事件等窗口显示后再获取。结果示例:
QRect(560,264 800x600) // geometry QRect(559,219 802x646) // frameGeometry可以看出,左右各有 1 像素边框,上方标题栏高度为 46 像素。
4.windowTitle:窗口标题
设置顶层窗口标题栏的文字。
注意:只能对顶层窗口(如
Widget)设置,对按钮等子控件设置是无效的。// 错误示例,不会生效 QPushButton* q1 = new QPushButton(this); q1->setWindowTitle("1");
5.windowIcon:窗口图标
设置窗口左上角或任务栏上显示的小图标。
使用
QIcon类管理图标。QIcon q1("d:\\1.png"); // Windows路径,注意转义 this->setWindowIcon(q1);注意点:
之前按钮等控件通常用指针创建在堆上,但
QIcon可以直接放在栈上。原因1:按钮等需要确保生命周期与父窗口一致,因此需要托管给 QT 的对象树。
原因2:
QIcon是一个轻量级对象,创建并设置给窗口后,即使局部QIcon对象析构,图标资源已经加载,不影响显示。且QIcon没有setParent方法,无法放入对象树。
路径写法:
可以使用 C++11 的原始字符串(Raw String)避免转义:
QIcon q1(R"(d:\1.png)");在 QT 中,路径分隔符也可以使用
/:QIcon q1("d:/1.png");
问题:使用绝对路径不灵活,因为不同电脑路径不同,且图片可能被用户删除。解决方案:使用 QT 的资源文件 (qrc)机制。
6.qrc资源文件机制
QT 资源文件(后缀
.qrc)是一个 XML 文件,用于记录项目中的资源(如图片)。编译时,QT 会将资源文件中的资源数据(如图片)以二进制形式编译进最终的可执行文件(
.exe)中。优点:程序运行时无需依赖外部文件,不会被用户误删。
缺点:不适合嵌入过大的文件,会导致可执行文件体积膨胀。
使用步骤:
在项目上右键 -> 添加新文件 -> QT ->
Qt Resource File,创建.qrc文件。将图片文件复制到项目目录下(通常是
.qrc文件同级或子目录)。在 QT Creator 中双击
.qrc文件,点击“添加”->“添加前缀”,再“添加”->“添加文件”,选择图片。
https://media/image1.png
代码中使用:
QIcon q1(":/1.png"); // 冒号开头,然后是前缀(如果设置了)和文件名 setWindowIcon(q1);编译后,会在构建目录生成一个
qrc_*.cpp文件,里面包含了资源的二进制数据。
7.windowOpacity:窗口透明度
void Widget::on_pushButton_clicked() { // 增加透明度(变得更透明) float f = this->windowOpacity(); f += 0.1; if (f > 1.0) f = 1.0; this->setWindowOpacity(f); } void Widget::on_pushButton_2_clicked() { // 减少透明度(变得更不透明) float f = this->windowOpacity(); f -= 0.1; if (f < 0.0) f = 0.0; this->setWindowOpacity(f); }8.cursor:修改光标
属性面板修改:在 QT Designer 右侧属性编辑器的
cursor栏目下方可以直接选择预设光标。代码修改为预设光标:
this->setCursor(Qt::WaitCursor); // 设置为等待(转圈)光标自定义光标图标:
QPixmap p(":/tu.png"); // 加载图片资源 this->setCursor(p); // 设置为光标 // 还可以缩放图片 p = p.scaled(10, 10);
9.font:字体相关
family:字体样式(如“宋体”、“Arial”)。pointSize:字体大小(单位是“点”,px)。weight:字体粗细。范围是 0~99。bold属性是布尔值,对应weight约为 75(粗)和非粗体(约 50)。underline:是否有下划线。italic:是否倾斜。strikeOut:是否有删除线。
10.toolTip:提示文本
鼠标悬停在控件上时显示的简短解释文字。
ui->yes->setToolTip("这是yes按钮"); ui->yes->setToolTipDuration(2000); // 设置显示时间,单位毫秒 ui->no->setToolTip("这是no按钮"); ui->no->setToolTipDuration(2000);
11.focusPolicy:焦点策略
设置控件如何获得焦点(如文本框可以被什么方式激活)。
常见选项:
StrongFocus:可以通过鼠标点击和键盘Tab键获得焦点。ClickFocus:只能通过鼠标点击获得焦点。TabFocus:只能通过键盘Tab键获得焦点。NoFocus:不能获得焦点。
12.styleSheet:样式表(仿CSS的QSS)
使用类似 CSS 的键值对语法来修改控件的外观(颜色、边框、背景等)。
// 设置背景色为白色 this->setStyleSheet("background-color:white;"); // 设置文本编辑框背景为白色,文字为黑色 ui->textEdit->setStyleSheet("background-color:white;color:black");示例:实现简单的白天/黑夜模式切换
void Widget::on_pushButton_clicked() { // 白天模式 this->setStyleSheet("background-color:rgb(240,240,240);"); ui->textEdit->setStyleSheet("background-color:white;color:black;"); ui->pushButton->setStyleSheet("color:black;"); ui->pushButton_2->setStyleSheet("color:black;"); } void Widget::on_pushButton_2_clicked() { // 黑夜模式 this->setStyleSheet("background-color:black;"); ui->textEdit->setStyleSheet("background-color:black;color:white;"); ui->pushButton->setStyleSheet("color:white;"); ui->pushButton_2->setStyleSheet("color:white;"); }可以使用
rgb(r, g, b)或十六进制颜色码(如#F0F0F0)来表示颜色。