当前位置: 首页 > article >正文

【QT】常用控件(三)

在这里插入图片描述

个人主页~

常用控件(一)~
常用控件(二)~


QT中其他线程是改变不了GUI上的内容的,只有主线程可以

常用控件

  • 四、显示类控件
    • 2、LCD Number
    • 3、ProgressBar
    • 4、Calendar Widget
  • 五、输入类控件
    • 1、Line Edit
      • 正则表达式
    • 2、Text Edit
    • 3、Combo Box

四、显示类控件

2、LCD Number

QLCDNumber专门用来显示数字

属性说明
intValue显示数字值(int)
value显示数字值(double)
digitCount显示几位数字
mode数字显示形式
segmentStyle设置显示风格

我们来写一个倒计时小程序,其中,QTimer就是一个定时器,通过start启动定时器,通过stop关闭定时器,开启定时器后,每隔一定的周期(自己设置的)触发一次timeout信号,通过connect把该信号与我们自定义的槽函数updateTime相关联后,让槽函数改变LCDNumber的显示值,倒计时就写好了

LCDNumber

digitCount就直接括号里跟数字表示显示几位数字
mode有二进制、八进制、十进制、十六进制四种模式
segmentStyle有Flat、Outline、Filled三种风格

3、ProgressBar

属性说明
minimum进度条最小值
maximum进度条最大值
value进度条当前值
alignment文本在进度条中的对齐方式
textVisible进度条的数字是否可见
orientation进度条的方向是水平还是垂直
invertAppearance是否向反方向增长进度
textDirection文本的朝向
format展示的数字格式

写一个类似于上面倒计时的程序,每过100ms进度条增加1,也是通过timeout来作为信号,槽函数为进度条增长

progressbar

format展示的数字格式分别为进度百分比%p、进度数值%v、剩余时间%m、总时间%t

4、Calendar Widget

属性说明
selectDate当前选中的日期
minimumDate最小日期
maximumDate最大日期
firstDayOfWeek设置每周的第一天为周几
gridVisible是否显示表格的边框
selectionMode是否允许选择日期
navigationBarVisible日历上方标题是否显示
horizontalHeaderFormat日历上方标题显示的日期格式
verticalHeaderFormat日历第一列显示的内容格式
dateEditEnable是否允许日期被编辑

calendar

五、输入类控件

1、Line Edit

QLineEdit用来表示单行输入框,可以输入文本但不能换行

属性说明
text输入框中的文本
inputMask输入内容格式约束
maxLength最大长度
frame是否添加边框
echoMode显示方式
cursorPosition光标所在位置
alignment文字对齐方式
dragEnabled是否允许拖拽
readOnly是否只读
placeholderText当输入框内容为空时显示设置的提示信息
clearButtonEnabled是否会自动显示清除内容按钮

这里说一下echoMode,一共有三种模式,Normal、Password、NoEcho
Normal:默认, 显示输入的文本
Password:输入的字符会被隐藏为黑点
NoEcho:不会显示任何输入的字符

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->lineEdit->setClearButtonEnabled(true);
    ui->lineEdit->setPlaceholderText("请输入您的昵称");

    ui->lineEdit_2->setClearButtonEnabled(true);
    ui->lineEdit_2->setPlaceholderText("请输入账号");
    ui->lineEdit_2->setInputMask("000-000-0000");
    //设置账号限制输入的个数以及分隔符,只能为10位,三位四位之间,六位七位之间有一个-分隔
	//InputMask只能进行简单的校验,实际开放中我们使用正则表达式
	
    ui->lineEdit_3->setClearButtonEnabled(true);
    ui->lineEdit_3->setPlaceholderText("请输入密码");
    ui->lineEdit_3->setEchoMode(QLineEdit::Password);
}

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

void Widget::on_pushButton_clicked()
{
    qDebug() << "昵称:"<<ui->lineEdit->text()
             << "账号:"<<ui->lineEdit_2->text()
             << "密码:"<<ui->lineEdit_3->text();
}//所有的qDebug都可以与网络相结合,这样我们是将内容发送到窗口中,通过网络我们可以将内容发送到服务器上同时进行一系列的处理

正则表达式

微软正则表达式文档~

测正则表达式是否有效的网站~

#include "widget.h"
#include "ui_widget.h"
#include <QRegExpValidator>
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->pushButton->setEnabled(false);
    ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^1\\d{10}$")));
    //QRegExpValidator创建一个验证器对象,里面是匿名对象QRegExp
}

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

void Widget::on_lineEdit_textEdited(const QString &arg1)//arg1是当前输入框的内容
{
    QString con = arg1;

    int pos = 0;
    if(ui->lineEdit->validator()->validate(con,pos) == QValidator::Acceptable)
    //validate的返回值有两个,一个是QValidator::Acceptable通过,一个是QValidator::Invalid不通过
    //validate的参数就是从con中从pos位置开始是否能够验证通过
    {
        ui->pushButton->setEnabled(true);
    }
    else
    {
        ui->pushButton->setEnabled(false);
    }
}

void Widget::on_pushButton_clicked()
{
    qDebug() << "密码输入完成";
}

我来解释一下程序中出现的正则表达式

^:这个符号位于正则表达式的开始位置,表示匹配行的开始,在这里,它确保了我们正在检查的字符串是从头开始匹配的,而不是从字符串的中间或末尾开始

1:这个字符直接出现在正则表达式中,表示匹配字符串中的字符“1”,这意味着任何被这个正则表达式匹配的字符串都必须以数字1开头

\d:这部分稍微复杂一些。在正则表达式中,\d 是一个特殊的字符类,用于匹配任何一个数字字符(0-9)。但是,在大多数编程语言中,字符串中的反斜杠(\)是一个转义字符,用于表示特殊字符或字符类,因此,为了在字符串中表示\d这个正则表达式模式,我们需要对反斜杠本身进行转义,即使用两个反斜杠(\),所以,\d 在字符串中表示的是正则表达式中的 \d,用于匹配任何一个数字字符

{10}:这是一个量词,用于指定前面的字符类(在这个例子中是\d,即任何一个数字字符)应该出现的次数,{10} 表示前面的字符类应该恰好出现10次,因此,\d{10} 表示匹配连续的10个数字字符

$:这个符号位于正则表达式的末尾,表示匹配行的结束,在这里,它确保了我们正在检查的字符串是在末尾结束匹配的,也就是说,整个字符串必须完全匹配正则表达式定义的模式,不能有多余的字符

lineedit_2

2、Text Edit

属性说明
markdown输入框内容支持markdown格式
html输入框内容支持大部分html标签
placeHolderText输入框为空时提示的内容
readOnly是否只读
undoRedoEnable是否开启撤销undo和反撤销redo功能
autoFormating开启自动格式化
tabstopWidth每次缩进占多少空间
overwriteMode是否开启覆写模式
acceptRichText是否接收富文本内容
verticalScrollBarPolicy垂直方向滚动条的设置
horizontalScrollBarPolicy水平方向滚动条的设置
#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_textEdit_textChanged()
{
    const QString& con = ui->textEdit->toPlainText();

    ui->label->setText(con);

    qDebug() << "textChanged:" << con;
}

void Widget::on_textEdit_copyAvailable(bool b)
{
    qDebug() << "copyAvailable:" << b;
}

void Widget::on_textEdit_undoAvailable(bool b)
{
    qDebug() << "undoAvailable:" << b;
}

void Widget::on_textEdit_redoAvailable(bool b)
{
    qDebug() << "redoAvailable:" << b;
}

void Widget::on_textEdit_cursorPositionChanged()
{
    const QTextCursor& cursor = ui->textEdit->textCursor();
    //QTextCursor是QTestEdit包含的一个对象,通过这个对象可以获取到当前光标位置和选中的内容
    qDebug() << "cursorPositionChanged:" << cursor.position();
}

void Widget::on_textEdit_selectionChanged()
{
    const QTextCursor& cursor = ui->textEdit->textCursor();
    qDebug() << "selectionChanged:" << cursor.selectedText();
}

视频中分别展示了文本的改变,光标的移动,以及撤销和反撤销操作的打印

textedit

3、Combo Box

属性说明
currentText当前选中的文本
currenIndex当前选中条目的下标
editable是否允许修改
inconSize下拉框图标的大小
maxCount最多允许有多少个条目

对于普通的添加条目,我们直接additem然后加上名字就可以了,但有时候我们需要添加很多条目,就需要从文件中导入

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

    std::ifstream file("d:/config.txt");//打开文件config
    std::string line;//定义一个line存放读取的某一行的内容
    while(std::getline(file,line))//getline一行一行的读取
    {
        ui->comboBox->addItem(QString::fromStdString(line));
        //使用fromStdString将std::string转换为QString,每一行都添加到comboBox中
    }

    file.close();

}

在这里插入图片描述


今日分享就到这里了~

在这里插入图片描述


http://www.kler.cn/news/362970.html

相关文章:

  • 求助帖:ubuntu22.10 auto install user-data配置了为何还需要选择语言键盘(如何全自动)
  • Springboot 的手动配置操作讲解
  • 小新学习K8s第一天之K8s基础概念
  • 5G NR GSCN计算SSB中心频率MATLAB实现
  • Nginx超简洁知识:负载均衡-反向代理,动静分离,配置文件
  • php中的错误和异常捕获
  • (三)行为模式:11、模板模式(Template Pattern)(C++示例)
  • 【系统分析师】-论文-论需求开发
  • 双目视觉三角测量C语言代码实现不使用OpenCV
  • R语言笔记(一)
  • 基于neo4j的糖尿病知识图谱数据
  • 深入浅出 Vue3 nextTick
  • 推荐一个开源非线性视频编辑器:Kdenlive
  • 在一台不能接入互联网的服务器(cenos7)安装DOCKER
  • 基于YOLOv8深度学习的无人机视角高精度太阳能电池板检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割
  • 成长的代价
  • Telephony Contact
  • 信息系统的分类
  • JavaScript进阶:手写代码挑战(一)
  • chat_gpt回答:python 复制xml文件
  • AI绘画教程分享:Stable Diffusion最新使用指南
  • 大括号块作用域的起源是什么?为什么整型数值用补码保存?char类型变量是存储为int类型大小吗?枚举为什么被当做整型?编程语言标识符为什么不能以数字开头?
  • Java最全面试题->Java基础面试题->JavaWeb面试题->Maven面试题
  • Cookie与Session详解与应用
  • LangGraph 源码分析 | 结构化输出
  • Umi UI报错:连接失败,请尝试重启dev服务