【Qt】常用控件(一)

文章目录

  • 一、核心属性
      • 1、enabled
          • 代码示例: 通过按钮2 切换按钮1 的禁用状态
      • 2、geometry
          • 代码示例: 控制按钮的位置
          • 代码示例:
          • window frame 的影响
          • 代码示例: 感受 geometry 和 frameGeometry 的区别
      • 3、windowTitle
      • 4、windowIcon
          • 代码示例: 通过 qrc 管理图片作为图标
          • 代码示例: 获取当前的⼯作目录
      • 5、windowOpacity
      • 6、cursor
          • 代码示例: 在 Qt Designer 中设置按钮的光标
          • 代码示例: 通过代码设置按钮的光标
          • 代码示例: ⾃定义⿏标光标
      • 7、font
          • 代码示例: 在 Qt Designer 中设置字体属性
          • 代码示例: 在代码中设置字体属性
      • 8、toolTip
          • 代码示例: 使用Qt Designer的方式进行设置toolTip
          • 代码示例: 使用代码的方式进行设置toolTip
      • 9、focusPolicy
      • 10、styleSheet
          • 代码示例: 设置文本样式
          • 代码示例: 实现切换夜间模式.

一、核心属性

1、enabled

API说明
isEnabled()获取到控件的可用状态
setEnabled()设置控件是否可使用。true表示可用,false表示不可用

• 所谓 “禁⽤” 指的是该控件不能接收任何⽤⼾的输⼊事件, 并且外观上往往是灰⾊的.
• 如果⼀个 widget 被禁⽤, 则该 widget 的⼦元素也被禁⽤.

//widget.cpp
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton* mybutton=new QPushButton(this);
    mybutton->setText("按钮");
    mybutton->setEnabled(false);

}

在这里插入图片描述

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

📚 QObject 的 objectName 属性介绍:
QObject 是 QWidget 的⽗类. ⾥⾯最主要的属性就是 objectName .
在⼀个 Qt 程序中, objectName 相当于对象的⾝份标识, 彼此之间不能重复.
在使⽤ Qt Designer 时, 尤其是界⾯上存在多个 widget 的时候, 可以通过 objectName 获取到指定的 widget 对象.
Qt Designer ⽣成的 ui ⽂件, 本⾝是 xml 格式的. qmake 会把这个 xml ⽂件转换成 C++ 的 .h
⽂件(这个⽂件⽣成在 build ⽬录中), 构成⼀个 ui_widget 类.
每个 widget 的 objectName 最终就会成为 ui_widget 类的属性名字.
最终这个类的实例, 就是 Ui::Widget *ui , 因此就可以通过形如 ui->pushButton 或
者 ui->pushButton_2 这样的代码获取到界⾯上的 widget 对象了.

void Widget::on_pushButton_clicked()
{
    qDebug()<<"执行了槽函数";
}
void Widget::on_pushButton_2_clicked()
{
    bool enable=ui->pushButton->isEnabled();
    if(enable)
    {
        ui->pushButton->setEnabled(false);
    }
    else
    {
        ui->pushButton->setEnabled(true);
    }
}

在这里插入图片描述
取消勾选就使禁用了。

在这里插入图片描述
在按钮当中的信号,常用的还是clicked(),clicked信号有两个版本,一个是无参的,另一个是有参的(bool)。一般来说QPushButton使用无参的就可以了。
bool表示是否被勾选。

2、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, 也可以分四个属性单独设置.

Rect就是矩形,Qt中针对几何上的概念也进行了封装
QPoint表示一个点,QRect表示一个矩形,属于缩小对象里面的属性非常的少,占用空间也少,在c++当中使用上述属性,可以使用值拷贝。
在之前我们用过了move它只是修改了位置,而setGeometry是全方面的修改。
(又修改位置,又修改尺寸)

代码示例: 控制按钮的位置
  1. 在界⾯中拖五个按钮.
    五个按钮的 objectName 分别为 pushButton_target , pushButton_up ,
    pushButton_down , pushButton_left , pushButton_right
    五个按钮的初始位置和大小都随意.
    在这里插入图片描述

下面的写法会发现只是修改target的左上角点位置。使用的是setGeometry(QRect),如果想要target的大小不改变进行平移就需要使用,setGeometry(int x, int y,int width, int height),第二份代码就是实现了不改变target的大小进行平移。
在这里插入图片描述

void Widget::on_pushButton_up_clicked()
{
    QRect rect=ui->pushButton->geometry();
    qDebug()<<rect;
    rect.setY(rect.y()-10);
    ui->pushButton->setGeometry(rect);
}

void Widget::on_pushButton_down_clicked()
{
    QRect rect=ui->pushButton->geometry();
    qDebug()<<rect;
    rect.setY(rect.y()+10);
    ui->pushButton->setGeometry(rect);
}

void Widget::on_pushButton_left_clicked()
{
    QRect rect=ui->pushButton->geometry();
    qDebug()<<rect;
    rect.setX(rect.x()-10);
    ui->pushButton->setGeometry(rect);

}

void Widget::on_pushButton_right_clicked()
{
    QRect rect=ui->pushButton->geometry();
    qDebug()<<rect;
    rect.setX(rect.x()+10);
    ui->pushButton->setGeometry(rect);
}
void Widget::on_pushButton_up_clicked()
{
    QRect rect=ui->pushButton->geometry();
    qDebug()<<rect;
//    rect.setY(rect.y()-10);
//    ui->pushButton->setGeometry(rect);
    ui->pushButton->setGeometry(rect.x(),rect.y()-10,rect.width(),rect.height());
}

void Widget::on_pushButton_down_clicked()
{
    QRect rect=ui->pushButton->geometry();
    qDebug()<<rect;
//    rect.setY(rect.y()+10);
//    ui->pushButton->setGeometry(rect);
    ui->pushButton->setGeometry(rect.x(),rect.y()+10,rect.width(),rect.height());
}

void Widget::on_pushButton_left_clicked()
{
    QRect rect=ui->pushButton->geometry();
    qDebug()<<rect;
//    rect.setX(rect.x()-10);
//    ui->pushButton->setGeometry(rect);
    ui->pushButton->setGeometry(rect.x()-10,rect.y(),rect.width(),rect.height());

}

void Widget::on_pushButton_right_clicked()
{
    QRect rect=ui->pushButton->geometry();
    qDebug()<<rect;
//    rect.setX(rect.x()+10);
//    ui->pushButton->setGeometry(rect);
    ui->pushButton->setGeometry(rect.x()+10,rect.y(),rect.width(),rect.height());
}
代码示例:
  1. 往界⾯上拖拽两个按钮和⼀个 Label.
    Label 的 objectName 为 pushButton 和 pushButton_2 , label 的
    objectName 为 label
    在这里插入图片描述
void Widget::on_pushButton_clicked()
{
    ui->label->setText("意志太坚定了");
}

void Widget::on_pushButton_2_clicked()
{
    int width=this->geometry().width();
    int height=this->geometry().height();
    int x=rand()%width;
    int y=rand()%height;
    ui->pushButton_2->move(x,y);
}

还可以通过pressed,在鼠标点下去的一瞬间进行移动。
而clicked是点下去在松开才会触发。

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);
}
window frame 的影响

如果 widget 作为⼀个窗⼝ (带有标题栏, 最⼩化, 最⼤化, 关闭按钮), 那么在计算尺⼨和坐标的时候就有两种算法. 包含 window frame 和 不包含 window frame.
其中 x(), y(), frameGeometry(), pos(), move() 都是按照包含 window frame 的⽅式来计算的.
其中 geometry(), width(), height(), rect(), size() 则是按照不包含 window frame 的⽅式来计算的.
当然, 如果⼀个不是作为窗⼝的 widget , 上述两类⽅式得到的结果是⼀致的.
在这里插入图片描述

项目Value
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 对象

其实这⾥的 API 有 frameGeometry 和 geometry 两个就⾜够完成所有的需求了.

代码示例: 感受 geometry 和 frameGeometry 的区别
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QRect rect1=this->geometry();
    QRect rect2=this->frameGeometry();
    qDebug()<<rect1;
    qDebug()<<rect2;
}

在这里插入图片描述
当前代码被放到了构造函数当中,此时这个Widget对象正在构造,还没被加载到window frame(窗口框架)中此时还看不到window frame的影响。

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

//    QRect rect1=this->geometry();
//    QRect rect2=this->frameGeometry();
//    qDebug()<<rect1;
//    qDebug()<<rect2;
    QPushButton* mybutton=new QPushButton(this);
    mybutton->setText("按钮");
    mybutton->move(200,200);
    connect(mybutton,&QPushButton::clicked,this,&Widget::handle);

}

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

void Widget::handle()
{
        QRect rect1=this->geometry();
        QRect rect2=this->frameGeometry();
        qDebug()<<rect1;
        qDebug()<<rect2;
}

在这里插入图片描述
执⾏程序, 可以看到, 构造函数中, 打印出的 geometry 和 frameGeometry 是相同的.
但是在点击按钮时, 打印的 geometry 和 frameGeometry 则存在差异

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

3、windowTitle

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

注意! 上述设置操作针对不同的 widget 可能会有不同的⾏为.
如果是顶层 widget (独⽴窗⼝), 这个操作才会有效.
如果是⼦ widget, 这个操作⽆任何效果.
例如要是给QPushButton设置就没有效果

在这里插入图片描述

4、windowIcon

API说明
windowIcon()获取到控件的窗⼝图标. 返回 QIcon 对象.(并不常用)
setWindowIcon(constQIcon& icon)设置控件的窗⼝图标.

同 windowTitle, 上述操作仅针对顶层 widget 有效

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QIcon icon("D:/dog.png.png");
    this->setWindowIcon(icon);
}

在这里插入图片描述

在这里插入图片描述

上述代码当中QIcon icon("D:/dog.png.png");,路径当中不能出现中文,
注意: Windows 下路径的分隔符可以使⽤ / 也可以使⽤ \ . 但是如果在 字符串 中使⽤ \ , 需要写作转义字符的形式 \ . 因此我们还是更推荐使⽤ / .
在C++11当中引入了raw string解决了上述问题。
字符串当中不包含任何转义字符r("D:/dog.png.png");

实际开发中, 我们⼀般不会在代码中通过绝对路径引⼊图⽚. 因为我们⽆法保证程序发布后, 用户的电脑上也有同样的路径.
如果使⽤相对路径, 则需要确保代码中的相对路径写法和图⽚实际所在的路径匹配 (⽐如代码中写作 “./image/rose.jpg”, 就需要在当前⼯作⽬录中创建 image ⽬录, 并把 rose.jpg 放进去).

对于 Qt 程序来说, 当前⼯作⽬录可能是变化的. ⽐如通过 Qt Creator 运⾏的程序, 当前⼯作⽬录是项⽬的构建⽬录; 直接双击 exe 运⾏, ⼯作⽬录则是 exe 所在⽬录.
所谓构建⽬录, 是和 Qt 项⽬并列的, 专⻔⽤来放⽣成的临时⽂件和最终 exe 的⽬录.

下面的方法就是关于不需要使用绝对和相对路径,通过放入exe当中的方法。

Qt 使⽤ qrc 机制帮我们⾃动完成了上述⼯作, 更⽅便的来管理项⽬依赖的静态资源
qrc ⽂件是⼀种XML格式的资源配置⽂件, 它⽤XML记录硬盘上的⽂件和对应的随意指定的资源名称. 应⽤程序通过资源名称来访问这些资源.
在Qt开发中, 可以通过将资源⽂件添加到项⽬中来⽅便地访问和管理这些资源. 这些资源⽂件可以位于qrc⽂件所在⽬录的同级或其⼦⽬录下.
在构建程序的过程中, Qt 会把资源⽂件的⼆进制数据转成 cpp 代码, 编译到 exe 中. 从⽽使依赖的资源变得 “路径⽆关”.
这种资源管理机制并⾮ Qt 独有, 很多开发框架都有类似的机制. 例如 Android 的 Resources和 AssetManager 也是类似的效果.

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

右键项⽬, 创建⼀个 Qt Resource File (qrc ⽂件), ⽂件名随意起(不要带中⽂), 此处叫做
resource.qrc .
在这里插入图片描述

右键项⽬, 创建⼀个 Qt Resource File (qrc ⽂件), ⽂件名随意起(不要带中⽂), 此处叫做 resource.qrc .在这里插入图片描述
在 资源编辑器 中, 点击 add Files 添加资源⽂件. 此处我们需要添加的是 dog.png
在这里插入图片描述
在这里插入图片描述

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QIcon icon(":/dog.png");
    this->setWindowIcon(icon);
}

在这里插入图片描述

注意上述路径的访问规则.
• 使⽤ : 作为开头, 表⽰从 qrc 中读取资源.
• / 是上⾯配置的前缀
• dog.png 是资源的名称
需要确保代码中编写的路径和添加到 qrc 中资源的路径匹配. 否则资源⽆法被访问 (同时也不会有报错提示).
但是qrc也是有缺点的,它并不能接受太大的文件,使用一些小的文件。

接下来, 我们可以进⼊到项⽬的构建⽬录, 可以看到, ⽬录中多了⼀个 qrc_resource.cpp ⽂件. 直接打开这个⽂件, 可以看到类似如下代码:
在这里插入图片描述

static const unsigned char qt_resource_data[] = {
 0x0,0x0,0x33,0x2,
 0xff,
 0xd8,0xff,0xe0,0x0,0x10,0x4a,0x46,0x49,0x46,0x0,0x1,0x1,0x0,0x0,0x1,0x0,
 0x1,0x0,0x0,0xff,0xfe,0x0,0x3b,0x43,0x52,0x45,0x41,0x54,0x4f,0x52,0x3a,0x20,
 ..........

上述代码其实就是通过 unsigned char 数组, 把 dog.png 中的每个字节都记录下来. 这些代码会被编译到 exe 中. 后续⽆论 exe 被复制到哪个⽬录下, 都确保能够访问到该图⽚资源.
在这里插入图片描述

上述 qrc 这⼀套资源管理⽅案, 优点和缺点都很明显.
优点: 确保了图⽚, 字体, 声⾳等资源能够真正做到 “⽬录⽆关”, ⽆论如何都不会出现资源丢失的情况.
缺点: 不适合管理体积⼤的资源. 如果资源⽐较⼤ (⽐如是⼏个 MB 的⽂件), 或者资源特别多,⽣成的最终的 exe 体积就会⽐较⼤, 程序运⾏消耗的内存也会增⼤, 程序编译的时间也会显著增加.

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

使⽤ QDir::currentPath() 即可获取到当前⼯作⽬录

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QString currentDir=QDir::currentPath();
    ui->label->setText(currentDir);
}

在这里插入图片描述
进⼊上述构建⽬录, 把⾥⾯的 exe 拷⻉到其他⽬录中, ⽐如 D: 中. 再次执⾏程序, 可以看到当前⼯作⽬录已经发⽣改变.

5、windowOpacity

API说明
windowOpacity()获取到控件的不透明数值. 返回 float, 取值为 0.0 -> 1.0 其中 0.0 表⽰全透明, 1.0 表⽰完全不透明.
ssetWindowOpacity(float n)设置控件的不透明数值.
void Widget::on_pushButton_clicked()
{
    float opacity=this->windowOpacity();
    if(opacity<=0.0)
        return ;
    qDebug()<<opacity;
    opacity-=0.1;//越小越透明
    this->setWindowOpacity(opacity);
}

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

在这里插入图片描述
从上面的打印结果可以看出并不是减0.1,
注意, C++ 中 float 类型遵守 IEEE 754 标准, 因此在进⾏运算的时候会有⼀定的精度误差. 因此 1 - 0.1 的数值并⾮是 0.9 .

6、cursor

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

首先在界面创建一个按钮
·
在这里插入图片描述
在这里插入图片描述
之后就可以通过属性中的cursor,进行修改光标的图标
它是Widget级别的,所以在同意界面的不同控件可以设置成不同的光标

代码示例: 通过代码设置按钮的光标
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QCursor cursor(Qt::WaitCursor);
    ui->pushButton->setCursor(cursor);
    this->setCursor(cursor);
}

系统内置的光标形状如下:
Ctrl + 左键 点击 Qt::WaitCursor 跳转到源码即可看到.

    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
    };
代码示例: ⾃定义⿏标光标
  1. 创建 qrc 资源⽂件, 添加前缀 / , 并加⼊ cursor.png
#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 创建⼀个位图对象, 加载⾃定义光标图⽚
    QPixmap pixmap(":/cursor.png");
    // 缩放图⽚为 64 * 64 的尺⼨.
    pixmap = pixmap.scaled(44, 44);
    // 创建 QCursor 对象, 并指定 "热点" 为 (2, 2) 坐标位置.
     // 所谓 "热点" 就是⿏标点击时⽣效的位置
    QCursor cursor(pixmap,2,2);
    this->setCursor(cursor);
}

7、font

API说明
font()获取当前 widget 的字体信息. 返回 QFont 对象.
setFont(const QFont& font)设置当前 widget 的字体信息
属性说明
family字体家族. ⽐如 “楷体”, “宋体”, “微软雅⿊” 等.
pointSize字体⼤⼩
weight字体粗细. 以数值⽅式表⽰粗细程度取值范围为 [0, 99], 数值越⼤, 越粗.
bold是否加粗. 设置为 true, 相当于 weight 为 75. 设置为 false 相当于weight 为 50.
italic是否倾斜
underline是否带有下划线
strikeOut是否带有删除线
代码示例: 在 Qt Designer 中设置字体属性

在这里插入图片描述
在右侧的属性编辑区, 设置该 label 的 font 相关属性
在这⾥调整上述属性, 可以实时的看到⽂字的变化

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

Alt

8、toolTip

API说明
setToolTip设置 toolTip.⿏标悬停在该 widget 上时会有提示说明.
setToolTipDuring设置 toolTip 提⽰的时间. 单位 ms.时间到后 toolTip ⾃动消失.
代码示例: 使用Qt Designer的方式进行设置toolTip

在这里插入图片描述
Alt

代码示例: 使用代码的方式进行设置toolTip
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->pushButton->setToolTip("adj.斜体的;仿意大利古书写体的");
    ui->pushButton->setToolTipDuration(3000);
}

Alt

9、focusPolicy

API说明
focusPolicy()获取该 widget 的 focusPolicy, 返回 Qt::FocusPolicy
setFocusPolicy(Qt::FocusPolicy policy)设置 widget 的 focusPolicy

Qt::FocusPolicy 是⼀个枚举类型. 取值如下
• Qt::NoFocus :控件不会接收键盘焦点
• Qt::TabFocus :控件可以通过Tab键接收焦点
• Qt::ClickFocus :控件在⿏标点击时接收焦点
• Qt::StrongFocus :控件可以通过Tab键和⿏标点击接收焦点 (默认值)
• Qt::WheelFocus : 类似于 Qt::StrongFocus , 同时控件也通过⿏标滚轮获取到焦点 (新增
的选项, ⼀般很少使⽤).

同样也是可以使用Qt Designer进行设置的。
·
在这里插入图片描述

在切换文本框的时候可以使用光标点击,也是可以使用Tab建进行切换的(Shift+Tab向反方向切换)

10、styleSheet

通过 CSS 设置 widget 的样式.
CSS (Cascading Style Sheets 层叠样式表) 本⾝属于⽹⻚前端技术. 主要就是⽤来描述界⾯的样式.
所谓 “样式”, 包括不限于 ⼤⼩, 位置, 颜⾊, 间距, 字体, 背景, 边框等.
我们平时看到的丰富多彩的⽹⻚, 就都会⽤到⼤量的 CSS.
Qt 虽然是做 GUI 开发, 但实际上和 ⽹⻚前端 有很多异曲同⼯之处. 因此 Qt 也引⼊了对于 CSS的⽀持

代码示例: 设置文本样式

鼠标右键点击控件,点击改变样式表

在这里插入图片描述

在这里插入图片描述

代码示例: 实现切换夜间模式.
void Widget::on_pushButton_clicked()
{
    this->setStyleSheet("background-color: #f3f3f3;");
    ui->textEdit->setStyleSheet("background-color: #fff; color: #000;");//后面的color是字体的颜色
    ui->pushButton->setStyleSheet("color: #000;");
    ui->pushButton_2->setStyleSheet("color: #000");
}

void Widget::on_pushButton_2_clicked()
{
    this->setStyleSheet("background-color: #333;");
    ui->textEdit->setStyleSheet("background-color: #333; color: #fff;");//后面的color是字体的颜色
    ui->pushButton->setStyleSheet("color: #fff;");
    ui->pushButton_2->setStyleSheet("color: #fff");
}

在这里插入图片描述

关于计算机中的颜⾊表⽰
计算机中使⽤ “像素” 表⽰屏幕上的⼀个基本单位(也就是⼀个发亮的光点).
每个光点都使⽤三个字节表⽰颜⾊, 分别是 R (red), G (green), B (blue) ⼀个字节表⽰ (取值范
围是 0-255, 或者 0x00-0xFF).
混合三种不同颜⾊的数值⽐例, 就能搭配出千千万万的颜⾊出来.
• rgb(255, 0, 0) 或者 #FF0000 或者 #F00 表⽰纯红⾊.
• rgb(0, 255, 0) 或者 #00FF00 或者 #0F0 表⽰纯绿⾊.
• rgb(0, 0, 255) 或者 #0000FF 或者 #00F 表⽰纯蓝⾊.
• rgb(255, 255, 255) 或者 #FFFFFF 或者 #FFF 表⽰纯⽩⾊.
• rgb(0, 0, 0) 或者 #000000 或者 #000 表⽰纯⿊⾊.
当然, 上述规则只是针对⼀般的程序⽽⾔是这么设定的. 实际的显⽰器, 可能有 8bit ⾊深或者10bit ⾊深等, 实际情况会更加复杂

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探秘未来科技:数字化无人巡检的奇妙之旅

嘿&#xff0c;朋友们&#xff01;下午茶时间到&#xff01;趁着这会儿咱们来聊一个超级炫酷的话题——数字化无人巡检。想象一下&#xff0c;那些曾经需要人工跋山涉水、风吹日晒的巡检工作&#xff0c;现在正被一群“智能小分队”悄悄接手&#xff0c;是不是觉得既神奇又方便…

国内使用 CloudFlare 避坑指南

最近明月收到了不少新手使用 CloudFlare 的求助,发现很多首次使用 CloudFlare 的甚至包括已经在使用 CloudFlare 的站长们对 CloudFlare 的使用有很多的误区,再加上国内简中互联网上有关 CloudFlare 的教程良莠不齐,更是加深了新手使用 CloudFlare 入坑的概率,让一些别有用…

maven .lastUpdated文件作用

现象 有时候我在用maven管理项目时会发现有些依赖报错&#xff0c;这时你可以看一下本地仓库中是否有.lastUpdated文件&#xff0c;也许与它有关。 原因 有这个文件就表示依赖下载过程中发生了错误导致依赖没成功下载&#xff0c;可能是网络原因&#xff0c;也有可能是远程…

汽车灯罩材料使用PMMA(亚克力)具有哪些优势?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车灯罩材料使用PMMA&#xff08;亚克力&#xff09;具有哪些优势 首先&#xff0c;PMMA具有高透明度&#xff0c;其透光率可达92%以上&#xff0c;使得光线能够均匀、清晰地透过灯罩&#xff0c;为驾驶者提供明亮且均匀的照明效果&#xff0c;确保行车安全。 其次&#xff…

618洗地机怎么选?热门洗地机选购指南,拒绝踩雷

洗地机是一种智能化的清洁工具&#xff0c;具有超强的清洁能力&#xff0c;能轻松应对各种地面污渍&#xff0c;无论是干污还是湿污。其一键操作设计简便易上手&#xff0c;省去了传统清洁方式的繁琐步骤&#xff0c;节省了时间和精力。高端型号更配备智能感应功能&#xff0c;…

产品设计中的“注册”说明

​在使用网站或应用的时候必不可少的就是账号系统&#xff0c;账号系统有些人可能觉得简单&#xff0c;无非就是账号密码。真的是这样吗&#xff1f; 一个完整的账号系统通常大家会分成四部分&#xff1a; 1.注册&#xff08;手机号、邮箱、用户名/密码限制/验证码&#xff09;…

C++进阶:AVL树详解及模拟实现(图示讲解旋转过程)

C进阶&#xff1a;AVL树详解及模拟实现&#xff08;图示讲解旋转过程&#xff09; 之前在搜索二叉树最后早就埋下伏笔&#xff0c;来介绍AVL树和红黑树&#xff0c;今天就先来第一个吧 文章目录 1.AVL树介绍1.1概念介绍1.2核心性质 2.项目文件规划3.整体框架&#xff08;节点和…

植物ATAC-seq文献集锦(一)——基因组篇

ATAC-seq&#xff08;Assay for Transposase-Accessible Chromatin with high-throughput Sequencing&#xff09;是一种用于探究染色质开放性区域的技术&#xff0c;该技术利用Tn5转座酶接近核小体疏松区域切割暴露的DNA&#xff0c;获得开放的染色质区段(Open Chromatin)&…

BGP学习二:BGP通告原则,BGP反射器,BGP路径属性细致讲解,新手小白无负担

目录 一.AS号 二.BGP路由生成 1.network 2.import-route引入 三.BGP通告原则 1.只发布最优且有效的路由 2.从EBGP获取的路由&#xff0c;会发布给所有对等体 3.水平分割原则 4.IBGP学习BGP默认不发送给EBGP&#xff0c;但如果也从IGP学习到了这条路由&#xff0c;就发…

EasyHPC - PyTorch入门教程【笔记】

内容来源&#xff1a;超算习堂 (easyhpc.net) 文章目录 01 Tensors环境要求1.1 Tensors1.1.1 直接创建tensor1.1.2 在现有tensor中创建tensor1.1.3 从NumPy中创建tensor 1.2 基本运算1.2.1 使用运算符1.2.2 调用方法 1.3 CUDA Tensors 02 Autograd2.1 Tensor2.2 Gradient 03 Ne…

shell脚本中条件语句

一.test测试 在Shell脚本中&#xff0c;test命令用于进行条件测试。它也可以通过方括号[]来表示&#xff0c;因为test实际上是[命令的一个别名。 格式1&#xff1a;test 条件表达式 格式2&#xff1a;[ 条件表达式 ] 注意[ ]空格&#xff0c;否则会失败 测试 是否成功使用…

永嘉原厂8×16点阵数码管驱动抗干扰数码管驱动IC防干扰数显芯片VK1640 SOP28

产品型号&#xff1a;VK1640 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP28 原厂&#xff0c;工程服务&#xff0c;技术支持&#xff01; 概述 VK1640是一种数码管或点阵LED驱动控制专用芯片&#xff0c;内部集成有数据锁存器、LED 驱动等电路。SEG脚接LE…

netstat命令详解

netstat网络连接分析工具 工具说明&#xff1a; netstat 是一款命令行工具&#xff0c;主要是用于列出系统上所有的网络套接字连接情况&#xff0c;包括 tcp, udp 以及 unix 套接字&#xff0c;另外它还能列出处于监听状态&#xff08;即等待接入请求&#xff09;的套接字。除…

SpringBoot集成Curator实现Watch事件监听

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Zookeeper是一个Ap…

【MySQL】常见的数据类型

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;MySQL 目录 &#x1f449;&#x1f3fb;常见的数据类型bit类型enumset集合查询函数find_ in_ set &#x1f449;&#x1f3fb;浮点类型float类型decimal &am…

用友U8与旺店通的对接案例分析

在现代企业管理中&#xff0c;财务管理和电商运营管理是企业数字化转型的两个重要组成部分。用友U8作为企业的财务管理系统&#xff0c;与旺店通这一电商ERP系统的结合&#xff0c;可以为企业带来全面的数据整合和流程自动化。本文将通过轻易云集成平台的视角&#xff0c;分析用…

weblogic [WeakPassword]

一、漏洞描述 开放了wblogic端口&#xff0c;进去发现有任意读取文件漏洞&#xff0c;配合解密工具读出密码&#xff0c;登录后台传入webshell 二、影响版本 当前版本 三、影响组件 weblogic 四、漏洞判断 hello/file.jsp?path/etc/passwd 发现有任意文件下载 五、漏洞…

47.全排列

1.题目 47. 全排列 II - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/permutations-ii/description/ 2.思路 注意剪枝的条件 3.代码 class Solution {vector<int> path;vector<vector<int>> ret;bool check[9]; public:vector<…

防伪溯源一体化管理系统基于FastAdmin+ThinkPHP和Uniapp(源码搭建/上线/运营/售后/维护更新)

一款基于FastAdminThinkPHP和Uniapp进行开发的多平台&#xff08;微信小程序、H5网页&#xff09;溯源、防伪、管理一体化独立系统&#xff0c;拥有强大的防伪码和溯源码双码生成功能&#xff08;内置多种生成规则&#xff09;、批量大量导出防伪和溯源码码数据、支持代理商管理…

JavaScript数组(Array)方法 - toReversed、toSorted、toSpliced

最近发现几个数组方法&#xff0c;是一些常规方法的升级版&#xff0c;比较有意思&#xff0c;分享给大家 文章目录 一、温故二、知新toReversedtoSortedtoSpliced 一、温故 我们先来回顾几个比较常用的方法&#xff1a;reverse&#xff0c;sort&#xff0c;splice众所周知&a…