Qt第三课 ----------显示类的控件属性

news2024/11/26 12:31:34

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言、C++和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


显示类

  • **作者前言**
  • QLabel
    • text
    • textFormat
    • pixmap
    • scaledcontents
    • Qlabel的常用属性
    • 设置按钮
  • QLCDNumber
  • QProgressBar
  • QTimer的简单介绍
  • QCalendar Widget

QLabel

这个是一个文本类,可以显示文字和图片的, 主要的 属性如下

text

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLabel* label = new QLabel(this);
    label->setText("这个是一个文本,用来练习");
    qDebug()  << label->text();
}

如图:
在这里插入图片描述

textFormat

这个是设置文本的格式的,
格式如下:
Qt::PlainText 纯⽂本
Qt::RichText 富⽂本(⽀持 html 标签)
Qt::MarkdownText markdown 格式
Qt::AutoText 根据⽂本内容⾃动决定⽂本格式.
下面我们一一介绍,
Plaintext这个格式是纯文本格式, 写入里面的内容都是文本

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLabel* label = new QLabel(this);
    label->setText("这个是一个文本,用来练习Plaintext");
    label->setTextFormat(Qt::PlainText);//普通文本

    QLabel* labelOne = new QLabel(this);
    labelOne->setText("<b>这个是一个文本,用来练习Plaintext<\b>");
    labelOne->setTextFormat(Qt::PlainText);//富文本
    label->move(0,50);

}

如图:
在这里插入图片描述
输入里面的任何都是文本,代码中的\b被当成了一个空格,不用在意,

当我们使用富文本的 时候如下:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLabel* label = new QLabel(this);
    label->setText("这个是一个文本,用来练习RichText");
    label->setTextFormat(Qt::RichText);//普通文本

    QLabel* labelOne = new QLabel(this);
    labelOne->setText("<h1>这个是一个文本,用来练习RichText<\\h1>");
    labelOne->setTextFormat(Qt::RichText);//富文本
    labelOne->move(0,100);
}

如图:
在这里插入图片描述
当我们使用html标签的时候,是会有效果的,这个就是富文本

我们来看看mackdown text格式

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLabel* label = new QLabel(this);
    label->setText("这个是一个文本,用来练习RichText");
    label->setTextFormat(Qt::MarkdownText);//普通文本

    QLabel* labelOne = new QLabel(this);
    labelOne->setText("# 这个是一个文本好哈,用来练习RichText");
    labelOne->setTextFormat(Qt::MarkdownText);//富文本
    labelOne->move(0,100);

//    qDebug()  << label->text();
//    QPixmap pixmap(":/new/one.jpg");
//    label->setPixmap(pixmap);
//    label->setScaledContents(true);
}

如图:
在这里插入图片描述
可以看出,在markdowntext格式中不同于Richtext, 它有属于自己的一套标签,跟html是一个意思,

pixmap

显示图片
前面我们在自定义鼠标图片时,介绍过QPixmap,
下面我们代码演示

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLabel* label = new QLabel(this);
    QPixmap pixmap(":/new/one.jpg");
    label->setPixmap(pixmap);

}

如图:
在这里插入图片描述

scaledcontents

这个是可以自由拉伸窗口的属性


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

    QPixmap pixmap(":/new/one.jpg");
    label->setPixmap(pixmap);
    label->setScaledContents(true);
}

​如图:

在这里插入图片描述
这个不会设置图片的大小,只负责窗口的拉伸,因为Qlabel的尺寸已经固定了,只有设置QLabel随着窗口的大小时刻发生改变,当我们拉伸这个窗口,会触发一个resize事件(resizeevent),是一个连续变化的,这个和我们之前的学过的connect是不一样的,
我们需要进行重写一下QWidget的resizeEvent这个虚函数,这个函数会在我们拖动窗口的尺寸会自动调用
.h

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    virtual void resizeEvent(QResizeEvent *event);


private:
    Ui::Widget *ui;
    QLabel* label;
};

.cpp


 void Widget::resizeEvent(QResizeEvent *event)
{
    qDebug()<< event->size();
    label->setGeometry(0,0,event->size().width(),event->size().height());

}

如图:
在这里插入图片描述
我们拉伸窗口.这个图片就会随着窗口变化而变化

Qlabel的常用属性

为了更加的观察接下来的现象,这里引入一个frameShape属性,这个是设置文本的边框的样式
在这里插入图片描述
其中的属性值有如下:

QFrame::Box :矩形边框
• QFrame::Panel :带有可点击区域的⾯板边框
QFrame::WinPanel :Windows⻛格的边框
• QFrame::HLine :⽔平线边框
• QFrame::VLine :垂直线边框
• QFrame::StyledPanel :带有可点击区域的⾯板边框,但样式取决于窗⼝主题

可以看出,这个属性是父类Qframe的属性,接下来。我们设置几个Qlabel来演示:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建4个, 设置边框
    QLabel *label1 = new QLabel(this);
    label1->setText("我是一段文字");
    label1->setGeometry(0,0,1000,250);
    QLabel *label2 = new QLabel("我是一段文字",this);
    label2->setGeometry(label1->geometry().x(),label1->geometry().y()+label1->geometry().height()+5,label1->geometry().width(),label1->geometry().height());
    QLabel *label3 = new QLabel("我是一段文字",this);
    label3->setGeometry(label1->geometry().x(),label2->geometry().y()+label1->geometry().height()+5,label1->geometry().width(),label1->geometry().height());
    QLabel *label4 = new QLabel("我是一段文字",this);
    label4->setGeometry(label1->geometry().x(),label3->geometry().y()+label1->geometry().height()+5,label1->geometry().width(),label1->geometry().height());
    label1->setFrameShape(QFrame::Box);
    label2->setFrameShape(QFrame::Box);
    label3->setFrameShape(QFrame::Box);
    label4->setFrameShape(QFrame::Box);
    //开始给每个QLabel设置一个属性. 对齐、缩进, 自动换行, 边距
    
}

如图:
在这里插入图片描述

对齐方式 alignment
对齐方式简单的介绍, 在AlignmentFlag枚举中有多个
在这里插入图片描述

label1->setAlignment(Qt::AlignRight|Qt::AlignBottom);

如图:
在这里插入图片描述
需要注意的是|是一个异或操作符,用来AlignmentFlag枚举里面的值进行操作的
如果想实现不同的对齐方式可以使用|这个操作符

缩进indent

//缩进
    label2->setIndent(50);//缩进50像素

如图:
在这里插入图片描述
需要注意的是,这样设置不仅仅是首行进行缩进,而是每行都会缩进

边距 margin

 //边距
    label3->setText("水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水是杀杀杀杀杀杀杀杀杀杀杀杀杀杀杀是是");
    label3->setMargin(50);

如图:
在这里插入图片描述
自动换行 wordwrap

//自动换行
    label4->setText("速度快撒娇撒扩大就是看电视咯大厦结婚的上来看大厦刘德华就撒开了大厦士大夫立刻啥的就会受到就撒娇的卡卡罗实践活动看啥打开拉萨大厦还打啥电话夸奖哈的空间撒谎就看撒抠脚大汉时刻");
    label4->setWordWrap(true);

如图:
在这里插入图片描述

设置按钮

前面我们也学习了按钮。我们可以往QLabel里面写入按钮, 这里需要的属性就是buddy

QLCDNumber

这是一个显示数字的控件, 一般用于时间,也可以使用到显示数值的区域
其属性如下:
在这里插入图片描述
在这里插入图片描述
下面我们来一一演示一下对应的效果怎么样
我们写一个倒计时,需要每隔一秒数值减1,类似定时器
注意:在C++中没有提供定时器,但是在QT中封装了对应的定时器(结合了信号和槽)
这里需要引入头文件, QTimer,
通过这个类创建出的对象, 会产生一个timeout的信号, 通过start的方法来开启定时器,并且参数中设置timeout信号的周期


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    int digth = 10;
    QLCDNumber* timeOne = new QLCDNumber(this);
    timeOne->display(digth);
    timeOne->setGeometry(this->geometry().width()/2, this->geometry().height()/2,500,200);
    QTimer* time = new QTimer(this);
    connect(time, &QTimer::timeout,this, [=]()
    {
        timeOne->display(timeOne->value()-1);
        if(digth == 0)
            time->stop();//停止定时器 
    });
    //启动定时器
    time->start(1000);//周期是1s, 触发一次timeout, 单位为ms
}

value和intvalue是获取数值的属性, display是变更数值的属性,
除了这种方法,我们还可以使用sleep来进行,但是这个只是windos的api,需要导入windos.h头文件,只能在Vs中使用, 但是在QT中是无法使用的,从C++11开始,引入了这个sleep_for,需要引入头文件, thread

#include<thread>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLCDNumber* number = new QLCDNumber(this);
    number->display(10);
    number->setGeometry(20,20, 500,100);

    while (true)
    {
        //休眠
        std::this_thread::sleep_for(std::chrono::seconds(1));//std::this_thread获取当前进程, std::chrono::seconds(1)休眠1s
        if(0 == number->value())
            break;
        number->display(number->value()-1);
    }


}

如果我们使用这个代码去运行,就会发现, 结果直接等待十秒后才显示,
如图:
在这里插入图片描述
原因如下:
在这里插入图片描述
因为我们的代码是在构造函数中写的,显示出来的时候已经把构造函数里面的代码都运行完毕了,显示出来就是最终的结果,也就是十秒后的结果,

有些人可能会想到使用线程
我们可以通过创建一个线程用来执行算数的代码片段,


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLCDNumber* number = new QLCDNumber(this);
    number->display(10);
    number->setGeometry(20,20, 500,100);
    std::thread t([=]()
    {
        while (true)
            {
                //休眠
                std::this_thread::sleep_for(std::chrono::seconds(1));//std::this_thread获取当前进程, std::chrono::seconds(1)休眠1s
                if(0 == number->value())
                    break;
                number->display(number->value()-1);
            }
    });


}

当我们运行出来就会发现
如图:
在这里插入图片描述
这里出现了一个错误,这个错误的原因主要是在QT中, 界面由一个线程进行控制的,也就是含有main函数的主线程,QT为了保护线程的安全,禁止被其他线程影响,只能在主线程进行修改,如修改界面,我们写的代码就是修改了界面的值,

QProgressBar

进度条
相关属性如下:
在这里插入图片描述
在这里插入图片描述
下面我们一一来演示

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建一个进度条
    QProgressBar* progress = new QProgressBar(this);
    progress->setGeometry(20,20,1000,200);
    progress->setMinimum(0);//设置最小值
    progress->setMaximum(100);//设置最大值
    progress->setAlignment(Qt::AlignLeft);//设置对齐方式
    progress->setOrientation(Qt::Horizontal);//设置方向
    progress->setFormat("%p%");//设置文本格式
    //创建一个定时器
    QTimer* time = new QTimer(this);
    connect(time, &QTimer::timeout, this, [=]()
    {
       progress->setValue(progress->value()+1);
       if(progress->value()==100)
       {
           time->stop();
           qDebug()<<"运行结束";
       }
    });
    time->start(100);//启动定时器

}

如图:
在这里插入图片描述
这里使用了定时器来演示一个进度条
如果我们还可以进一步的更改一下进度条的颜色,这里就要涉及到styleshet样式了

progress->setStyleSheet("QProgressBar::chunk {background-color: rgb(64, 65, 66);}");

如图:
在这里插入图片描述
这里有一个bug,文字显示在左上角了

QTimer的简单介绍

这里需要声明一点, 关于QTimer头文件,在没有引入头文件的时候,是可以声明这个QTimer的指针或者引用的,因为在Qt中有一个专门的头文件包含了Qt中所有类的声明,也就是前置声明, 例如
在这里插入图片描述

我们创建出来的代码包含的头文件里面就间接包含了这个专门的头文件, 如果我们想要真正使用和创建这个定时器,还是需要导入头文件QTimer,否则哪怕我们在类中声明了相关指针或者引入,实例化出来也是会报错的,

QCalendar Widget

日历
这个是设置日历的
主要的属性如下:
在这里插入图片描述
还有一些信号函数如下:
在这里插入图片描述
一般常用的信号是第一个,下面就简单演示一下

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QCalendarWidget* calender = new QCalendarWidget(this);
    calender->setSelectionMode(QCalendarWidget::SelectionMode::SingleSelection);//是否可以设置日期
//    calender->setDateEditEnabled(true);

    connect(calender, &QCalendarWidget::selectionChanged, this, [=]()
    {
        QDate a = calender->selectedDate();
        qDebug()<<a;

    });
}

如图:
在这里插入图片描述
其他属性的话,可以自行探索,

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

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

相关文章

从0开始深度学习(8)——softmax回归

1 分类问题 深度学习从大方向上来说&#xff0c;就是回归预测和分类问题。 假设输入一个 2 ∗ 2 2*2 2∗2的灰度图像&#xff0c;可能属于“鸡、猫、狗”三个类别中的一个&#xff0c;那如何在计算机中表示标签呢&#xff1f;最常见的想法是 y { 1 , 2 , 3 } y \{1,2,3\} y{…

现金1.8kw, 年入150w, 财务不自由...

他的生活状态无疑是许多人梦寐以求的。拥有两套无贷款的房产&#xff0c;家庭和睦&#xff0c;两台车价值约50万元。现金资产高达1800万元&#xff0c;家庭年收入约150万元&#xff0c;职业稳定&#xff0c;属于中层管理阶层。 重要的是&#xff0c;孩子们的成绩优异&#xff0…

ListView的Items绑定和comboBox和CheckBox组合使用实现复选框的功能

为 ListView 控件的内容指定视图模式的方法&#xff0c;参考官方文档。 ComboBox 样式和模板 案例说明&#xff1a;通过checkBox和ComboBox的组合方式实现下拉窗口的多选方式&#xff0c;同时说明了ListView中Items项目的两种绑定方式. 示例&#xff1a; 设计样式 Xaml代码…

机器学习 | 特征选择如何减少过拟合?

在快速发展的机器学习领域&#xff0c;精确模型的开发对于预测性能至关重要。过度拟合的可能性&#xff0c;即模型除了数据中的潜在模式外&#xff0c;还拾取训练集特有的噪声和振荡&#xff0c;这是一个固有的问题。特征选择作为一种有效的抗过拟合武器&#xff0c;为提高模型…

好用,易用,高效,稳定 基于opencv 的 图像模板匹配 - python 实现

在定位、搜索固定界面图块时&#xff0c;经常用到模板匹配&#xff0c;opencv自带的图像模板匹配好用&#xff0c;易用&#xff0c;高效&#xff0c;稳定&#xff0c;且有多种匹配计算方式。 具体示例如下&#xff1a; 模板图&#xff1a; 待搜索图&#xff1a; 具体实现代码…

苹果正式宣布:iPhone全面开放近场通信(Near Field Communication,简称NFC)【使用安全元件提供app内NFC数据交换功能】

文章目录 引言I iPhone的NFC功能开发者用户数据交换的体验革新安全与隐私II 知识扩展:近场通信(NFC)技术钱包NFC开关打开读取NFC标签(NFC tags )权限demo引言 2014年iPhone 6开始,苹果首次引入了NFC功能,但最初只允许自家的Apple Pay进行移动支付。慢慢地适配了交通卡,增…

基于go开发的终端版即时通信系统(c-s架构)

项目架构图 类似一个聊天室一样 整体是一个客户端和服务端之间的并发多线程网络通信&#xff0c;效果可以翻到最后面看。 为了巩固基础的项目练手所以分为9个阶段进行迭代开发 版本⼀&#xff1a;构建基础Server 新建一个文件夹就叫golang-IM_system 第一阶段先将server的大…

沈阳化工大学第十一届程序设计沈阳区竞赛:凿冰 Action(博弈论,思维)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 北极探险队有新收获了&#xff01;&#xff01;&#xff01; 北极探险队发现了NNN条长度不一的冰柱&#xff0c;由于冰柱里封存有价值的生物&#xff0c;现在需要两名生物学家小A和小…

TON生态小游戏开发:推广、经济模型与UI设计的建设指南

随着区块链技术的快速发展&#xff0c;基于区块链的Web3游戏正引领行业变革。而TON生态小游戏&#xff0c;借助Telegram庞大的用户基础和TON&#xff08;The Open Network&#xff09;链上技术&#xff0c;已成为这一领域的明星之一。国内外开发者正迅速涌入&#xff0c;开发和…

如何在算家云搭建Kolors(图像生成)

一、模型介绍 Kolors 是快手 Kolors 团队基于潜在扩散的大规模文本转图片生成模型。经过数十亿个文本-图片对的训练&#xff0c;Kolors 在视觉质量、复杂语义准确性和中英文文本渲染方面均比开源和闭源模型具有显著优势。此外&#xff0c;Kolors 支持中英文输入&#xff0c;在…

C语言基础语法——类型转换

数据有不同的类型&#xff0c;不同类型数据之间进行混合运算时涉及到类型的转换问题。 转换的方法有两种&#xff1a; 自动类型转换&#xff08;隐式转换&#xff09;&#xff1a;遵循一定的规则&#xff0c;由编译系统自动完成强制类型转换&#xff08;显示转换&#xff09;…

http协议概述与状态码

目录 1.HTTP概述 1.1请求报文起始行与开头 ​1.2响应报文起始行 ​ 1.3响应报文开头 ​ 2.http状态协议码 1.HTTP概述 默认端口 80 HTTP超文本传输与协议: 数据请求和响应 传输:将网站的数据传递给用户 超文本:图片 视频等 请求request:打开网站 访问网站 响应r…

Python数据分析-垃圾邮件分类

一、研究背景 随着电子通信技术的飞速发展&#xff0c;电子邮件已经成为人们日常工作和生活中不可或缺的一部分。然而&#xff0c;伴随着这一趋势&#xff0c;垃圾邮件&#xff08;Spam&#xff09;的数量也在急剧增加。垃圾邮件不仅会占用用户的邮箱空间&#xff0c;还可能含…

设置dl服务解决github pushTimed out问题

提交代码到GitHub&#xff0c;一直提示提交失败 我们一般是fq挂的dl服务器进行的&#xff0c;而git需要配置下dl&#xff0c;此时我们要将dl服务器对应的IP地址和端口为我们所调用。 查找dl服务器&#xff08;windows直接搜索dl服务器设置&#xff0c;mac参考官网&#xff09…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第二十二章 安装VMware Tool 工具

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

学习python自动化——pytest单元测试框架

一、什么是pytest 单元测试框架&#xff0c;unittest&#xff08;python自带的&#xff09;&#xff0c;pytest&#xff08;第三方库&#xff09;。 用于编写测试用例、收集用例、执行用例、生成测试结果文件&#xff08;html、xml&#xff09; 1.1、安装pytest pip instal…

【ARM Linux驱动开发】嵌入式ARM Linux驱动开发基本步骤

【ARM Linux驱动开发】嵌入式ARM Linux驱动开发基本步骤 文章目录 开发环境驱动开发&#xff08;以字符设备为例&#xff09;安装驱动应用程序开发附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 开发环境 首先需要交叉编译器和Linux环境…

豆包PixelDance指南:字节跳动推出的AI视频生成大模型,突破多主体互动难关

豆包PixelDance是由字节跳动旗下火山引擎发布的AI视频生成大模型。它是业界首个突破多主体互动难关的视频生成模型&#xff0c;支持多风格多比例的一致性多镜头生成。PixelDance基于DiT架构&#xff0c;具备高效的DiT融合计算单元&#xff0c;能够实现复杂的多主体运动交互和多…

【高等数学】 一元函数积分学

1. 不定积分的计算 1.1. 基本积分表 知识点 例题 1.2. 凑微分&#xff08;第一类换元法&#xff09; 知识点 本质&#xff1a;利用复合函数求导法则的逆运算 第一步&#xff0c;识别或者凑出来复合函数的导函数 如果被积函数具备以下特点&#xff1a; 1.它由两项相乘来表…

《案例》—— OpenCV 实现2B铅笔填涂的答题卡答案识别

文章目录 一、案例介绍二、代码解析 一、案例介绍 下面是一张使用2B铅笔填涂选项后的答题卡 使用OpenCV 中的各种方法进行真确答案识别&#xff0c;最终将正确填涂的答案用绿色圈出&#xff0c;错误的答案不圈出&#xff0c;用红色圈出错误题目的正确答案最终统计正确的题目数…