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

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂

​🎂 作者介绍: 🎂🎂

🎂 🎉🎉🎉🎉🎉🎉🎉 🎂

🎂作者id:老秦包你会, 🎂

简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂

喜欢学习C语言、C++和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂

🎂个人主页::小小页面🎂

🎂gitee页面:秦大大🎂

🎂🎂🎂🎂🎂🎂🎂🎂

🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


显示类

QLabel

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

text

powershell 复制代码
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这个格式是纯文本格式, 写入里面的内容都是文本

powershell 复制代码
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被当成了一个空格,不用在意,

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

powershell 复制代码
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格式

powershell 复制代码
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,

下面我们代码演示

powershell 复制代码
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

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

powershell 复制代码
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

powershell 复制代码
class Widget : public QWidget
{
    Q_OBJECT

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


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

.cpp

powershell 复制代码
 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来演示:

powershell 复制代码
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枚举中有多个

powershell 复制代码
label1->setAlignment(Qt::AlignRight|Qt::AlignBottom);

如图:

需要注意的是|是一个异或操作符,用来AlignmentFlag枚举里面的值进行操作的

如果想实现不同的对齐方式可以使用|这个操作符

缩进indent

powershell 复制代码
//缩进
    label2->setIndent(50);//缩进50像素

如图:

需要注意的是,这样设置不仅仅是首行进行缩进,而是每行都会缩进

边距 margin

powershell 复制代码
 //边距
    label3->setText("水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水是杀杀杀杀杀杀杀杀杀杀杀杀杀杀杀是是");
    label3->setMargin(50);

如图:

自动换行 wordwrap

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

如图:

设置按钮

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

QLCDNumber

这是一个显示数字的控件, 一般用于时间,也可以使用到显示数值的区域

其属性如下:

下面我们来一一演示一下对应的效果怎么样

我们写一个倒计时,需要每隔一秒数值减1,类似定时器

注意:在C++中没有提供定时器,但是在QT中封装了对应的定时器(结合了信号和槽)

这里需要引入头文件, QTimer,

通过这个类创建出的对象, 会产生一个timeout的信号, 通过start的方法来开启定时器,并且参数中设置timeout信号的周期

powershell 复制代码
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;

    });
}

如图:

其他属性的话,可以自行探索,

相关推荐
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
----云烟----4 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024064 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic4 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it5 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神5 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
宅小海5 小时前
scala String
大数据·开发语言·scala
qq_327342735 小时前
Java实现离线身份证号码OCR识别
java·开发语言
锅包肉的九珍6 小时前
Scala的Array数组
开发语言·后端·scala