QT常用的控件

news2024/11/20 14:37:48

QT常用控件

  • 一.控件概述
  • 二.QWidget 核心属性
    • 2.1 核心属性概览
    • 2.2 enabled
      • 代码示例:使用代码创建一个禁用状态的按钮
      • 代码示例: 通过按钮2 切换按钮1 的禁用状态.
    • 2.3 geometry
      • 代码示例: 控制按钮的位置
      • 代码示例: ⼀个随机按钮程序
      • 代码示例: 感受 geometry 和frameGeometry 的区别
        • (1) 在界面上放置⼀个按钮
        • (2)在按钮的 slot 函数中, 编写代码
        • (3)在构造函数中, 也添加同样的代码
    • 2.4 windowTitle
      • 代码示例:设置窗口标题
    • 2.5 windowIcon
      • 代码示例: 设置窗口图标
      • 代码示例: 获取当前的工作目录
      • 代码示例: 通过 qrc 管理图片作为图标
        • 1) 右键项目, 创建⼀个 Qt Resource File (qrc ⽂件), 文件名随意起(不要带中文), 此处叫做resource.qrc .
        • 2) 在 qrc 编辑器中, 添加前缀.
        • 3) 在 资源编辑器 中, 点击 add Files 添加资源文件.然后把要加入的文件复制进来就可以
    • 2.6 windowOpacity
      • 代码示例: 调整窗口透明度
    • 2.7 cursor
      • 代码示例: 在 Qt Designer 中设置按钮的光标
        • 1) 在界面中创建⼀个按钮.
        • 2) 直接在右侧属性编辑区修改 cursor 属性为 "等待"
        • 3) 运行程序, 鼠标悬停到按钮上, 即可看到光标的变化.
      • 代码示例: 通过代码设置按钮的光标
      • 代码示例: 自定义鼠标光标
        • 1) 创建 qrc 资源文件, 添加前缀 /,并把想要的图片加入即可
        • 2) 代码
    • 2.8 font
        • 代码示例: 在 Qt Designer 中设置字体属性
        • 代码示例: 在代码中设置字体属性
    • 2.8 toolTip
        • 代码示例: 设置按钮的 toolTip
    • 2.9styleSheet
        • 代码示例: 实现切换夜间模式.

一.控件概述

Widget 是 Qt 中的核心概念. 英文原义是 “小部件”, 我们此处也把它翻译为 “控件” .
控件是构成⼀个图形化界面的基本要素.

在这里插入图片描述
像上述示例中的, 按钮, 列表视图, 树形视图, 单行输入框, 多行输入框, 滚动条, 下拉框等, 都可以称为 “控件”.

Qt 作为⼀个成熟的 GUI 开发框架, 内置了大量的常用控件. 这⼀点在 Qt Designer 中就可以看到端倪.
并且 Qt 也提供了 “自定义控件” 的能力, 可以让程序猿在现有控件不能满足需求的时候, 对现有控件做出扩展, 或者手搓出新的控件

在这里插入图片描述

二.QWidget 核心属性

在 Qt 中, 使用 QWidget 类表示 “控件”. 像按钮, 视图, 输入框, 滚动条等具体的控件类, 都是继承自QWidget.
可以说, QWidget 中就包含了 Qt 整个控件体系中, 通⽤的部分.

在 Qt Designer 中, 随便拖⼀个控件过来, 选中该控件, 即可在右下放看到 QWidget 中的属性

在这里插入图片描述
这些属性既可以通过 QtDesigner 会直接修改, 也可以通过代码的方式修改.
这些属性的具体含义, 在 Qt Assistant 中均有详细介绍.

2.1 核心属性概览

下列表格列出了 QWidget 中的属性及其作用.

属性作用
enabled设置控件是否可使用. true 表示了用, false 表示禁用.
geometry位置和尺寸,包含x,y,width,height四个部分,其中坐标是以父元素为参考设置的
windowTitle设置 widget 标题
windowIcon设置 widget 图标
windowOpacity设置 widget 透明度
cursor鼠标悬停时显示的图标形状.是普通箭头, 还是沙漏, 还是十字等形状.在 Qt Designer 界面中可以清楚看到可选项.
font字体相关属性.涉及到字体家族, 字体大小, 粗体, 斜体, 下划线等等样式
toolTip⿏标悬停在 widget 上会在状态栏中显示的提示信息.
toolTipDuringtoolTip 显示的持续时间.
statusTipWidget 状态发生改变时显示的提示信息(比如按钮被按下等).
styleSheet允许使用 CSS 来设置 widget 中的样式
focusPolicy该 widget 如何获取到焦点.Qt::NoFocus:控件不参与焦点管理,即无法通过键盘或鼠标获取焦点 Qt::TabFocus:控件可以通过Tab键获得焦点 Qt::ClickFocus:控件可以通过鼠标点击获得焦点 Qt::StrongFocus:控件可以通过键盘和鼠标获得焦 Qt::WheelFocus:控件可以通过鼠标滚轮获得焦点(在某些平台或样式中可能不可用)
minimumSize控件的最小尺寸. 包含最小宽度和最小高度
maximumSize控件的最大吃尺寸. 包含最大宽度和最大高度.
sizePolicy尺寸策略. 设置控件在布局管理器中的缩放方式.
windowModality指定窗口是否具有 “模态” 行为.
sizeIncrement拖动窗口大小时的增量单位.
baseSize窗⼝的基础大小, 用来搭配 sizeIncrement 调整组件尺寸是计算组件应该调整到的合适的值
palette调色板. 可以设置 widget 的颜色风格
mouseTracking是否要跟踪鼠标移动事件. 如果设为 true, 表示需要跟踪, 则鼠标划过的时候该 widget 就能持续收到鼠标移动事件.如果设为 false, 表示不需要跟踪, 则鼠标划过的时候 widget 不会收到鼠标移动事件, 只能收到鼠标按下或者释放的事件.
tabletTracking是否跟踪触摸屏的移动事件.类似于 mouseTracking . Qt 5.9 中引⼊的新属性.
layoutDirection布局方向:Qt::LeftToRight:文本从左到右排列,也是默认值。Qt::RightToLeft:文本从右到左排列。
autoFillBackground是否⾃动填充背景颜色.
windowFilePath能够把 widget 和⼀个本地文件路径关联起来. PS: 其实作用不大.
accessibleName设置 widget 的可访问名称. 这个名称可以被辅助技术 (像屏幕阅读器) 获取到
inputMethodHints针对输⼊框有效, 用来提示用户当前能输入的合法数据的格式. 比如只能输入数字, 只能输入日期等.

2.2 enabled

API说明
isEnabled()获取到控件的可用状态.
setEnabled设置控件是否可使用. true 表示可用, false 表示禁用.
  • 所谓 “禁用” 指的是该控件不能接收任何用户的输入事件, 并且外观上往往是灰色的
  • 如果⼀个 widget 被禁用, 则该 widget 的子元素也被禁用.

代码示例:使用代码创建一个禁用状态的按钮

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->pushButton->setEnabled(false);

}

Widget::~Widget()
{
    delete ui;
}


运行程序, 可以看到按钮处于灰色状态, 无法被点击.
在这里插入图片描述

代码示例: 通过按钮2 切换按钮1 的禁用状态.

生成两个按钮的 slot 函数.

  • List item使用 isEnabled 获取当前按钮的可用状态.
  • 使用 setEnabled 修改按钮的可用状态. 此处是直接针对原来的可用状态进行取反后设置.
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    qDebug()<<"按下按钮";
}

void Widget::on_pushButton_2_clicked()
{
    bool fal = this->ui->pushButton->isEnabled();
    this->ui->pushButton->setEnabled(!fal);
}

2.3 geometry

位置和尺寸. 其实是四个属性的统称:

  • x横坐标
  • y宗坐标
  • width宽度
  • height 高度
    在这里插入图片描述

对于 Qt 的坐标系, 不要忘记是⼀个 “左手坐标系”. 其中坐标系的原点是当前元素的父元素的左上角

在这里插入图片描述

API说明
geometry()获取到控件的位置和尺寸. 返回结果是⼀个 QRect, 包含了 x, y, width, height. 其中 x, y 是左上角的坐标.
setGeometry(QRect) setGeometry(int x, int y,int width, int height)设置控件的位置和尺寸. 可以直接设置⼀个 QRect, 也可以分四个属性单独设置

代码示例: 控制按钮的位置

在这里插入图片描述

在 widget.cpp 中编写四个按钮的 slot 函数

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QRect>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_up_clicked()
{
    QRect ret =ui->pushButton->geometry();
    ui->pushButton->setGeometry(ret.x(),ret.y()-5,ret.width(),ret.height());

}

void Widget::on_pushButton_left_clicked()
{
    QRect ret = ui->pushButton->geometry();
    ui->pushButton->setGeometry(ret.x()-5,ret.y(),ret.width(),ret.height());
}

void Widget::on_pushButton_right_clicked()
{
    QRect ret = ui->pushButton->geometry();
    ui->pushButton->setGeometry(ret.x()+5,ret.y(),ret.width(),ret.height());
}

void Widget::on_pushButton_down_clicked()
{
    QRect ret = ui->pushButton->geometry();
    ui->pushButton->setGeometry(ret.x(),ret.y()+5,ret.width(),ret.height());
}

上述代码使用 move 方法也是可以的.

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QRect>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_up_clicked()
{
    QRect ret =ui->pushButton->geometry();
//    ui->pushButton->setGeometry(ret.x(),ret.y()-5,ret.width(),ret.height());
    ui->pushButton->move(ret.x(),ret.y()-5);
}

void Widget::on_pushButton_left_clicked()
{
    QRect ret = ui->pushButton->geometry();
  //  ui->pushButton->setGeometry(ret.x()-5,ret.y(),ret.width(),ret.height());
    ui->pushButton->move(ret.x()-5,ret.y());
}

void Widget::on_pushButton_right_clicked()
{
    QRect ret = ui->pushButton->geometry();
   // ui->pushButton->setGeometry(ret.x()+5,ret.y(),ret.width(),ret.height());
     ui->pushButton->move(ret.x()+5,ret.y());
}

void Widget::on_pushButton_down_clicked()
{
    QRect ret = ui->pushButton->geometry();
    //ui->pushButton->setGeometry(ret.x(),ret.y()+5,ret.width(),ret.height());
  ui->pushButton->move(ret.x(),ret.y()+5);
}

代码示例: ⼀个随机按钮程序

往界面上拖拽两个按钮和⼀个 Label.

控件中文本如下图所示.
在这里插入图片描述

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);


}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_yes_clicked()
{
    ui->label->setText("同意");
}

void Widget::on_pushButton_no_clicked()
{
    int width = this->geometry().width();
    int height = this->geometry().height();


    int x = rand()%width;
    int y = rand()%height;

    ui->pushButton_no->move(x,y);
}

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 对象.

代码示例: 感受 geometry 和frameGeometry 的区别

(1) 在界面上放置⼀个按钮

在这里插入图片描述

(2)在按钮的 slot 函数中, 编写代码

void Widget::on_pushButton_clicked()
{
    QRect ret1 = this->geometry();
    qDebug()<<"ret1:"<<ret1;

    QRect ret2 = this->frameGeometry();
      qDebug()<<"ret2:"<<ret2;
}

(3)在构造函数中, 也添加同样的代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QRect ret1 = this->geometry();
    qDebug()<<"ret1:"<<ret1;

    QRect ret2 = this->frameGeometry();
      qDebug()<<"ret2:"<<ret2;

}

执行程序, 可以看到, 构造函数中, 打印出的 geometry 和 frameGeometry 是相同的.
但是在点击按钮时, 打印的 geometry 和 frameGeometry 则存在差异.

在这里插入图片描述

这里需要注意

  • 在构造方法中, Widget 刚刚创建出来, 还没有加⼊到对象树中. 此时也就不具备 Windowframe.
  • 在按钮的 slot 函数中, 由于用户点击的时候, 对象树已经构造好了, 此时 Widget 已经具备了Window frame, 因此在位置和尺寸上均出现了差异.
  • 如果把上述代码修改成打印 pushButton 的 geometry 和 frameGeometry , 结果就是完全相
    同的. 因为 pushButton 并非是⼀个窗⼝.

2.4 windowTitle

API说明
windowTitle()获取到控件的窗口标题.
setWindowTitle(constQString& title)设置控件的窗口标题.

代码示例:设置窗口标题

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->windowTitle();
    this->setWindowTitle("标题");
}

Widget::~Widget()
{
    delete ui;
}


执行效果:

在这里插入图片描述

2.5 windowIcon

API说明
windowIcon()获取到控件的窗口图标. 返回 QIcon 对象.
setWindowIcon(const QIcon& icon)设置控件的窗⼝图标

代码示例: 设置窗口图标

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>

#include <QIcon>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建图标对象
QIcon icon("d:/rose.jpg");
// 设置图标
this->setWindowIcon(icon);
}

Widget::~Widget()
{
    delete ui;
}


注意:Windows 下路径的分隔符可以使用 / 也可以使用 \ . 但是如果在 字符串 中使用 \ , 需要写作转义字符的形式 \ . 因此我们还是更推荐使用 / .

于此同时, 程序在任务栏中的图表也发生改变在这里插入图片描述

  • 绝对路径: 以盘符(windows)或者以 / (Linux) 开头的路径.
  • 相对路径: 以 . (表示当前路径) 或者 以 … (表示当前路径上级路径) 开头的路径. 其中 . 经常也会省略. 相对路径的前提是需要明确 “当前工作目录”

代码示例: 获取当前的工作目录

  1. 在界面上创建⼀个比较⼤的 label, 确保能把路径显示完整. objectName 使用默认的 label 即可.
#include "widget.h"
#include "ui_widget.h"
#include<QDir>
#include<QString>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QString current = QDir::currentPath();

    ui->label->setText(current);

}

Widget::~Widget()
{
    delete ui;
}


(2) 直接在 Qt Creator 中执行程序, 可以看到当前工作目录是项目的构建目录.
在这里插入图片描述

注意:

  • 上述 构建目录, 是随时可删除的. 比如点击菜单栏中的 “构建” -> “清理项目” , 就会把这个目录中的内容清空掉.
  • 因此如果我们把图片文件放到构建目录中, 可能在不小心删除后就丢失了. 我们还是希望能够把图片和源代码放到⼀起, 并且使我们的程序无论拷贝到任何位置中都能正确使用图片.**

Qt 使用 qrc 机制帮我们自动完成了上述工作, 更方便的来管理项目依赖的静态资源.

代码示例: 通过 qrc 管理图片作为图标

1) 右键项目, 创建⼀个 Qt Resource File (qrc ⽂件), 文件名随意起(不要带中文), 此处叫做resource.qrc .

在这里插入图片描述

2) 在 qrc 编辑器中, 添加前缀.

在这里插入图片描述
此处我们前缀设置成 / 即可.

3) 在 资源编辑器 中, 点击 add Files 添加资源文件.然后把要加入的文件复制进来就可以

添加成功的话
在这里插入图片描述
当前路劲就会显示

2.6 windowOpacity

API说明
windowOpacity()获取到控件的不透明数值. 返回 float, 取值为 0.0 -> 1.0 其中 0.0 表示全透明, 1.0 表示完全不透明.
setWindowOpacity(float n)设置控件的不透明数值

代码示例: 调整窗口透明度

  1. 在界面上拖放两个按钮, 分别用来增加不透明度和减少不透明度.
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);


}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_add_clicked()
{
    float ret = this->windowOpacity();//这里一定要是float
    ui->pushButton_add->setShortcut(QKeySequence("w"));
    if(ret>=1)
    {
        return;
    }
    qDebug()<<ret;
    ret+=0.1;
    this->setWindowOpacity(ret);
}

void Widget::on_pushButton_sub_clicked()
{
    float ret = this->windowOpacity();
    ui->pushButton_sub->setShortcut(QKeySequence("s"));
    if(ret<0)
    {
        return;
    }
    qDebug()<<ret;
    ret-=0.1;
    this->setWindowOpacity(ret);
}

切记,上述代码中的变量ret一定要是float类型的

  1. 执行程序, 可以看到, 点击了几下 - 之后, 就可以透过窗口看到后面的猫猫头了. 点击 + 又会逐渐恢复.

同时控制台中也可以看到 opacity 数值的变化
在这里插入图片描述

此处代码中的按钮也可以通过绑定键盘上的字母来实现,在接下来的文章中,我会继续说到

2.7 cursor

API说明
cursor()获取到当前 widget 的 cursor 属性, 返回 QCursor 对象.当鼠标悬停在该 widget 上时, 就会显示出对应的形状.
setCursor(const QCursor& cursor)设置该 widget 光标的形状. 仅在鼠标停留在该 widget 上时生效.
QGuiApplication::setOverrideCursor(const QCursor& cursor)设置全局光标的形状. 对整个程序中的所有 widget 都会⽣效. 覆盖上面的 setCursor 设置的内容

代码示例: 在 Qt Designer 中设置按钮的光标

1) 在界面中创建⼀个按钮.

在这里插入图片描述

2) 直接在右侧属性编辑区修改 cursor 属性为 “等待”

在这里插入图片描述

3) 运行程序, 鼠标悬停到按钮上, 即可看到光标的变化.

在这里插入图片描述

代码示例: 通过代码设置按钮的光标

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QPushButton* button = new QPushButton(this);
    button->resize(200,250);
    button->move(100,100);

    button->setText("这是一个按钮");
    button->setCursor(QCursor(Qt::WaitCursor));
}

Widget::~Widget()
{
    delete ui;
}


在系统内置的光标下:

Ctrl + 左键 点击 Qt::WaitCursor 跳转到源码即可看到.

在这里插入图片描述

这里就不一一列举了,有兴趣的可以尝试

代码示例: 自定义鼠标光标

Qt 自带的光标形状有限. 我们也可以自己找个图片, 做成鼠标的光标
这里给大家推荐一个图标库,阿里巴巴矢量图标库

1) 创建 qrc 资源文件, 添加前缀 /,并把想要的图片加入即可
2) 代码
#include <QPixmap>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建⼀个位图对象, 加载⾃定义光标图⽚
QPixmap pixmap(":/huaji.png");
// 缩放图⽚为 64 * 64 的尺⼨.
pixmap = pixmap.scaled(64, 64);
// 创建 QCursor 对象, 并指定 "热点" 为 (2, 2) 坐标位置.
// 所谓 "热点" 就是⿏标点击时⽣效的位置.
QCursor cursor(pixmap, 2, 2);
// 设置光标
this->setCursor(cursor);
}

这里结果图无法截图,可以自己尝试

2.8 font

API说明
font()获取当前 widget 的字体信息. 返回 QFont 对象.
setFont(const QFont& font)设置当前 widget 的字体信息

关于QFont

属性说明
family字体家族. 比如 “楷体”, “宋体”, “微软雅黑” 等
pointSize字体大小
weight字体粗细. 以数值方式表示粗细程度取值范围为 [0, 99], 数值越大, 越粗.
bold是否加粗. 设置为 true, 相当于 weight 为 75. 设置为 false 相当于weight 为 50.
italic是否倾斜
underline是否带有下划线
strikeOut是否带有删除线
代码示例: 在 Qt Designer 中设置字体属性
  1. 在界面上创建⼀个 label
    在这里插入图片描述
  2. 在右侧的属性编辑区, 设置该 label 的 font 相关属性
    在这里插入图片描述
    执行程序即可观察到效果
代码示例: 在代码中设置字体属性
  1. 在界面中创建 label, objectName 使用默认的 label 即可

在这里插入图片描述
2) 修改 widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 设置 label 的⽂本内容
    ui->label->setText("这是⼀段⽂本");
    // 创建字体对象
    QFont font;
    // 设置字体家族
    font.setFamily("仿宋");
    // 设置字体⼤⼩
    font.setPointSize(20);
    // 设置字体加粗
    font.setBold(true);
    // 设置字体倾斜
    font.setItalic(true);
    // 设置字体下划线
    font.setUnderline(true);
    // 设置字体删除线
    font.setStrikeOut(true);
    // 设置字体对象到 label 上
    ui->label->setFont(font);
}

Widget::~Widget()
{
    delete ui;
}


  1. 运行程序, 观察效果在这里插入图片描述

2.8 toolTip

API说明
setToolTip设置 toolTip.鼠标悬停在该 widget 上时会有提示说明.
setToolTipDuring设置 toolTip 提示的时间. 单位 ms.时间到后 toolTip 自动消失
代码示例: 设置按钮的 toolTip

1). 在界面上拖放两个按钮. objectName 设置为 pushButton_yes 和 pushButton_no

在这里插入图片描述
2).编写 widget.cpp

在这里插入图片描述

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->pushButton_no->setToolTip("no");
    ui->pushButton_no->setToolTipDuration(5000);

    ui->pushButton_yes->setToolTip("yes");
    ui->pushButton_no->setToolTipDuration(5000);

}

Widget::~Widget()
{
    delete ui;
}


2.9styleSheet

通过 CSS 设置 widget 的样式.
CSS 中可以设置的样式属性⾮常多. 基于这些属性 Qt 只能支持其中⼀部分, 称为 QSS (Qt Style Sheet)

  1. 在界面上创建 label

在这里插入图片描述
2) 编辑右侧的 styleSheet 属性, 设置样式
鼠标右键标签,然后有个改变样式表即可
在这里插入图片描述
在此输入框里输入想要的样式即可

代码示例: 实现切换夜间模式.

(1) 在界面上创建⼀个多行输入框 (Text Edit) 和两个按钮.

在这里插入图片描述
2) 编写按钮的 slot 函数

  • #333 是深色
  • #fff 是纯白色.
  • #000 是纯黑色

代码

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_day_clicked()
{
    this->setStyleSheet("background-color: #333");
    ui->textEdit->setStyleSheet("background-color: #333; color: #fff;");
    ui->pushButton_day->setStyleSheet("color: #fff");
    ui->pushButton_ye->setStyleSheet("color: #fff");
}

void Widget::on_pushButton_ye_clicked()
{
    this->setStyleSheet("background-color: #f3f3f3");
    ui->textEdit->setStyleSheet("background-color: #fff; color: #000;");
    ui->pushButton_day->setStyleSheet("color: #000");
    ui->pushButton_ye->setStyleSheet("color: #000");
}

3) 运行程序, 点击 “日间模式”, 就是浅色背景, 深色文字; 点击 “夜间模式”, 就是深色背景, 浅色⽂字

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1954778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python | TypeError: ‘NoneType’ object is not iterable

Python | TypeError: ‘NoneType’ object is not iterable 在Python编程中&#xff0c;TypeError: NoneType object is not iterable 是一个常见的错误&#xff0c;通常表明你尝试对一个值为 None 的对象进行迭代操作&#xff0c;而 None 类型的对象是不可迭代的。本文将深入…

python count返回什么

描述 count() 方法用于统计字符串中某个子字符串出现的次数&#xff0c;可选参数为开始搜索与结束搜索的位置索引。 语法 count() 方法语法&#xff1a; S.count(sub[,start0[,endlen(S)]]) 参数 sub -- 搜索的子字符串。 S -- 父字符串。 start -- 可选参数&#xff0c;…

Windows11和Win10如何彻底永久关闭Windows defender

Windows11和Win10如何彻底永久关闭Windows defender 亲测简单快捷有效关闭病毒和威胁防护。 使用关闭windows defender工具。 随时可以重新开启病毒和威胁防护。

【Spring Boot】Spring 的安全框架:Spring Security

Spring 的安全框架&#xff1a;Spring Security 1.Spring Security 初识1.1 核心概念1.2 认证和授权1.2.1 验证&#xff08;authentication&#xff09;1.2.2 授权&#xff08;authorization&#xff09; 1.3 模块 2.核心类2.1 Securitycontext2.2 SecurityContextHolder2.2.1 …

刷题心得之位运算技巧 gcd 和 lcm

位运算 gcd 和 lcm 位运算技巧遍历 n 的所有子集, 不包括空集遍历 n 的所有子集, 包括空集提取出 n 二进制中第一次出现的1消除 n 二进制中第一次出现的1判断 n 是否是 2 的幂次方 gcd [最大公约数]lcm [最小公倍数] 位运算技巧 遍历 n 的所有子集, 不包括空集 #include <…

52.TFT_LCD液晶屏字符显示

&#xff08;1&#xff09;实验目标&#xff1a;在5寸显示屏&#xff08;800 * 480 60&#xff09;中央显示汉字&#xff08;黄色&#xff09;&#xff0c;且背景颜色为青色。 &#xff08;2&#xff09;代码编写&#xff1a; tft_ctrl模块&#xff1a; module tft_ctrl(inp…

电子电气架构---域控制器的软硬件趋势

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

TiDB-从0到1-sync-diff-inspector数据校验工具

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容TiDB-从0到1-数据导出导入TiDB-从0到1-BR工具 一、sync-diff-inspector工具 sync-diff-inspector是TiDB原生…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第六十二章 定时器按键消抖实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

详解Mysql InnoDB引擎 04

文章目录 1. InnoDB 简介2. 逻辑存储结构2.1 表空间 idb文件2.2 段2.3 区 1M2.4 页 16KB2.5 行 3. 架构3.1 内存结构3.1.1 Buffer Pool 缓冲池3.1.2 Change Buffer 更改缓冲区3.1.3 Adaptive Hash Index3.1.4 Log Buffer 3.2 磁盘结构 4. 后台线程5. 事务原理5.1 redo log 重做…

Pytorch深度学习实践(9)卷积神经网络

卷积神经网络 全连接神经网络 神经网络中全部是线性模型&#xff0c;是由线性模型串联起来的 全连接网络又叫全连接层 卷积神经网络 在全连接神经网络中&#xff0c;由于输入必须是一维向量&#xff0c;因此在处理图像时必须要对图像矩阵进行拉伸成一维的形式&#xff0c;…

视觉巡线小车(STM32+OpenMV)——总结

文章目录 目录 文章目录 前言 一、效果展示 二、完整流程 1、STM32CubeMX配置 2、Keil编辑 3、硬件接线 4、参数调试 5、图像处理调试 三、总结 前言 基于前面的系列文章&#xff0c;已基本介绍完了基于STM32OpenMV的视觉巡线小车&#xff0c;本文将以小编自己的小车…

BACnet物联网关BL103:Modbus协议转BACnet/MSTP

随着物联网技术在楼宇自动化与暖通控制系统中的迅猛发展&#xff0c;构建一种既经济高效又高度可靠的协议转换物联网关成为了不可或缺的核心硬件组件。在此背景下&#xff0c;我们钡铼特别推荐一款主流的BAS&#xff08;楼宇自动化系统&#xff09;与BACnet物联网关——BL103&a…

小世界特性解析——聚类系数与平均路径长度的奥秘

小世界特性解析——聚类系数与平均路径长度的奥秘 小世界特性的核心衡量指标 小世界特性&#xff0c;这一复杂网络中的重要概念&#xff0c;主要通过两个关键指标来衡量&#xff1a;聚类系数和平均路径长度。这两个指标共同揭示了网络结构的紧密程度和信息传播的效率。 聚类…

echarts没数据的时候,页面显示暂无数据

echarts没数据的时候&#xff0c;页面显示暂无数据 给个if判断 let option{} if(data.length0){ //没有数据或者数据不合法,显示暂无数据option {title: {text: 暂无数据,x: center,y: center,textStyle: {fontFamily: Manteka,fontSize: 12,fontWeight: normal,color: #333…

使用 Copilot 对 OneDrive 文档分享进行摘要

对于大量使用onedrive进行资料分享的用户而言&#xff0c;对分享的文件进行简要说明并提供给对方&#xff0c;是一个基本素养。 在以往&#xff0c;他们只能阅读文件名然后靠回忆进行撰写&#xff0c;或者打开每一个文档通读全文然后再关闭返回并撰写摘要。 当用户在 SharePo…

Java聚合快递小程序对接云洋系统程序app源码

​一场物流效率的革命 引言&#xff1a;物流新时代的序章 在数字化浪潮席卷各行各业的今天&#xff0c;物流行业也迎来了前所未有的变革。为了进一步提升物流效率&#xff0c;优化用户体验&#xff0c;聚合快递系统与云洋系统小程序的对接成为了行业内外关注的焦点。这一创新…

基于JSP的毕业生就业信息管理系统

你好&#xff0c;我是专注于信息系统开发的码农小野&#xff01;如果你对毕业生就业信息管理有需求&#xff0c;欢迎联系我。 开发语言&#xff1a;JSP 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 SSM框架 工具&#xff1a;Eclipse、Maven、Navicat 系统展示 首页…

登录案例(JAVA)

练习1 package lx2;import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner;public class demo1 {/*需求&#xff1a;写一个登陆小案例。步骤…

Hive环境搭建(内置数据库)

实验目的】 1) 了解hive的作用 2) 熟练hive的配置过程&#xff08;内置数据库&#xff09; 【实验原理】 Hive的架构是由Client、Metastore、Driver、Compiler构成&#xff0c;执行流程是编译器可以将一个Hive QL转换成操作符&#xff0c;操作符是Hive中的最小处理单元。…