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

【Qt开发】输入类控件

目录

1,Line Edit

2,Line Edit代码运用

2-1,正则表达式

3,Text Edit

4,Combo Box

5,Spin Box

6,Date Edit和Time Edit

7,Dial

8,Slider


1,Line Edit

        QLineEdit 用来表示单行输入框。它可以输入一段文本,但是不能换行,因为它是单行输入框。其核心属性和核心信号如下。

2,Line Edit代码运用

        这里运用 Line Edit 来实现录入个人信息的情况。

// 初始化文本数据

ui->label1->setText("姓名");

ui->lineEdit1->setPlaceholderText("请输⼊姓名");

ui->radioButton1->setText("男");

ui->radioButton2->setText("女");

ui->label2->setText("电话");

ui->lineEdit2->setPlaceholderText("请输入电话");

ui->pushButton->setText("确定");

// 设置属性

ui->lineEdit1->setClearButtonEnabled(true); // 清空按钮

// 设置输入格式。此处的0代表“数字”。此时输入的格式为123-4567-4567这种形式

ui->lineEdit2->setInputMask("000-0000-0000");

void Widget::on_pushButton_clicked()

{

    QString gender = ui->radioButton1->isChecked() ? "男" : "⼥";

    qDebug() << "姓名: " << ui->lineEdit1->text()

                    << "性别: " << gender

                    << "⼿机: " << ui->lineEdit2->text();

}

2-1,正则表达式

        Line Edit 属性中的 inputMask 只能进行简单的输入格式校验。实际开发中,基于正则表达式的校验方式是更核心的方法。

        正则表达式本质上就是一个带有特殊字符的字符串。这个特殊字符是用来表示另一个字符串的特征。还有,正则表达式的语法比较复杂,一般都是随用随查,不需要背下来。

        正则表达式⽂档         正则表达式在线测试工具

        Qt中,使用 QRegExp 创建一个正则表达式对象,它通过正则表达式匹配来过滤掉非法输入。为了将它运用到控件中,还需要创建一个 QRegExpValidator 验证器,并将正则表达式作为参数传递给它。最后把验证器应用到控件上即可。

        在控制输入格式时,通常会 textChanged 或 textEdited 信号来处理输入内容非法或合法的情况。Qt中的控件借助 QValidator 抽象类(不能实例化出对象)中的 validate(QString& input, int& pos) 虚函数来验证输入的合法性。参数 input 代表输入的内容;pos 表示输入光标的位置,此参数通常直接设为0即可。validate函数返回值一个枚举值,这个枚举有三个值,代表输入的不同状态。即 QValidator::Acceptable 输入完全合法、QValidator::Invalid 输入不合法、QValidator::Intermediate 输入目前还不完整。

ui->pushButton->setText("提交");

// 定义正则表达式regExp里面的字符串是什么形式的。

// ^表示以什么开头,\d表示十进制数字(这里需要\\d在C++中转义成\d),{10}表示这个数字可以出现10次,$表示这是结尾

QRegExp regExp("^1\\d{10}$");   // 表示以1开头,后面有10个十进制数字

// 创建validator验证器对象,将正则表达式regExp作为其规则参数,把验证器应用到lineEdit控件上

QRegExpValidator* validator = new QRegExpValidator(regExp, ui->lineEdit);

ui->lineEdit->setValidator(validator);

// ui->lineEdit->setValidator(new QRegExpValidator(regExp)); 直接一步到位

void Widget::on_lineEdit_textEdited(const QString &text)

{

    QString content = text;

    int pos = 0;

    if (ui->lineEdit->validator()->validate(content, pos) == QValidator::Acceptable) {

        // 验证通过

        ui->pushButton->setEnabled(true);

    } else {

        // 验证不通过

        ui->pushButton->setEnabled(false);

    }

}

注意:在类型这块出现的警告,可以强转(void)来避免。

       Qt 中除了 QRegExpValidator 验证器外,还内置了四个主要的验证器对象。

3,Text Edit

        QTextEdit 表示多行输入框,用于编辑和显示多行纯文本和富文本(HTML格式)。它比 QLineEdit 更加灵活,因为它支持多行文本输入、文本格式化等更多功能。

        Qt中还有一个与QTextEdit类似功能的控件——QPlainTextEdit,该控件只能表示纯文本,而QTextEdit不仅能表示纯文本,还能表示 html 和 markdown。用法上基本一致。

        TextEdit重点在于信号。编写内容时,textChanged 和 cursorPositionChanged 会触发。鼠标选中一段文本时,cursorPositionChanged,selectionChanged,copyAvailable 会触发。按下 ctrl + z 撤销操作时,textChanged,undoAvailable,redoAvailable,cursorPositionChanged 会触发。按下 ctrl + y,textChanged,undoAvailable,redoAvailable,cursorPositionChanged 会触发。

       信号中 undo 是指如果用户进行了可以撤销的操作(如文本输入、删除等),该信号会被发出,并且参数 available 会设置为 true,表示此时可以执行撤销操作;相反,如果没有可撤销的操作,available 将为 false。undo对应的快捷键是 ctrl + z。

        信号中 redo 是指重做操作。当存在已被撤销的操作可以重新执行时,此信号将被发出,并且参数 available 会是 true;若无可重做的操作,则 available 为 false。redo对应的快捷键是 ctrl + y。

        selectionChanged 跟 copyAvailable 不同的是当范围选中文本时,selectionChanged会一直触发,copyAvailable选中文本时只会触发一次,取消选中时也触发一次,此时bool参数为false。

void Widget::on_textEdit_textChanged()

{

    // toPlainText()获取文本,跟很多控件的text()一样

    qDebug() << "[textChanged] " << ui->textEdit->toPlainText();

}

void Widget::on_textEdit_selectionChanged()

{

    //QTextEdit中包含了⼀个QTextCursor对象,通过这个对象可以获取到当前光标位置和选中的内容

    const QTextCursor& cursor = ui->textEdit->textCursor();

    qDebug() << "[selectionChanged] " << cursor.selectedText();

}

void Widget::on_textEdit_cursorPositionChanged()

{

    const QTextCursor& cursor = ui->textEdit->textCursor();

    // cursor.position()表示光标的位置,即1,2,3...

    qDebug() << "[cursorPositionChanged] " << cursor.position();

}

void Widget::on_textEdit_undoAvailable(bool b)

{

    qDebug() << "[undoAvailable] " << b;

}

void Widget::on_textEdit_redoAvailable(bool b)

{

    qDebug() << "[redoAvailable] " << b;

}

void Widget::on_textEdit_copyAvailable(bool b)

{

    qDebug() << "[copyAvailable] " << b;

}

4,Combo Box

        QComboBox 表示下拉框。核心属性、核心方法、核心信号如下:

ui->comboBox->addItem("巨⽆霸");

ui->comboBox->addItem("⻨辣鸡腿堡");

ui->comboBox_2->addItem("薯条");

ui->comboBox_2->addItem("⻨辣鸡翅");

ui->comboBox_3->addItem("可乐");

ui->comboBox_3->addItem("雪碧");


void Widget::on_pushButton_clicked()
{
    qDebug() << "汉堡选择: " << ui->comboBox->currentText();
    qDebug() << "⼩⻝选择: " << ui->comboBox_2->currentText();
    qDebug() << "饮料选择: " << ui->comboBox_3->currentText();
}

        很多时候下拉框的选项并非是固定的,而是通过读取文件或读取网络获取到的。从文件中获取数据时,可以使用 C++ 标准库的 std::fstream,也可以使用 Qt 所提供的QFile,它同样实现读写文件的功能。

// 打开文件

std::ifstream file("E:/text.txt");

if (!file.is_open()) {

    qDebug() << "文件打开失败";

    return;

}

// getline按行来读取文本,从文件中取到的每一行内容设置到下拉框中

std::string line;

while (std::getline(file, line)) {

    // QString::fromStdString把std::string转成QString

    ui->comboBox->addItem(QString::fromStdString(line));

}

file.close();

5,Spin Box

        QSpinBox 或 QDoubleSpinBox 表示 "微调框",它是带有按钮的输入框,可以用来输入整数或浮点数。通过点击按钮来修改数值大小。由于 SpinBox 和 QDoubleSpinBox 用法基本相同,所以这里就只介绍 SpinBox 的使用了。

ui->comboBox->addItem("巨无霸");

ui->comboBox->addItem("⻨辣鸡腿堡");

ui->spinBox->setValue(1);

ui->spinBox->setRange(1, 5);  // 设置微调框数值范围

6,Date Edit和Time Edit

        QDateEdit 是日期的微调框。

        QTimeEdit 是时间的微调框。

        QDateTimeEdit 是时间日期的微调框。

        这几个控件用法非常相似,这里以 QDateTimeEdit 为例进行介绍。其核心属性如下:

// 获取到两个时间框的时间⽇期

QDateTime timeOld = ui->dateTimeEdit->dateTime();

QDateTime timeNew = ui->dateTimeEdit_2->dateTime();

// 计算⽇期差值

// daysTo函数可以计算两个⽇期差的天数。该函数存在bug,因为这里没有考虑小时,是直接拿天数相减

// secsTo函数可以计算两个时间差的秒数

// int days = timeOld.daysTo(timeNew); bug代码

int seconds = timeOld.secsTo(timeNew);

int days = (seconds / 3600) / 24;     // 通过秒数计算天数

int hours = (seconds / 3600) % 24;

// QString::number把整数转成QString

QString text = QString::number(days) + QString(" 天 ") + QString::number(hours)

7,Dial

        QDial 表示一个旋钮,如下图。

ui->dial->setMinimum(0);  // 设置旋钮对应的最小数值

ui->dial->setMaximum(100); // 设置旋钮对应的最大数值

ui->dial->setWrapping(true);  // 设置可以循环旋转

ui->dial->setNotchesVisible(true); // 设置刻度线可见

ui->dial->setValue(100);  // 设置初始值为100

// 通过旋钮调整窗口的透明度

void Widget::on_dial_valueChanged(int value)

{

    qDebug() << value;

    // 注意:不透明度是个小数。0完全不透明;1完全透明

    this->setWindowOpacity((double)value / 100);

}

8,Slider

        QSlider 表示一个滑动条,它分为水平滑动条和垂直滑动条。这里要说明下,QSlider 和 QDial 都是继承自 QAbstractSlider,因此用法上基本相同。

ui->verticalSlider->setMinimum(800);

ui->verticalSlider->setMaximum(1000);

ui->verticalSlider->setValue(800);

ui->verticalSlider->setInvertedAppearance(true); // 翻转朝向, 默认滑块从下向上增⻓, 改成从上往下增⻓

// 使用快捷键,需要用到QShortcut类

// 这里用快捷键‘s’进行减少,‘w’进行增加

QShortcut* shortcut1 = new QShortcut(this);

shortcut1->setKey(QKeySequence("s"));

connect(shortcut1, &QShortcut::activated, this, &Widget::subValue);

QShortcut* shortcut2 = new QShortcut(this);

shortcut2->setKey(QKeySequence("w"));

connect(shortcut2, &QShortcut::activated, this, &Widget::addValue);

// 使用滑动条增加或减小窗口大小,并使用快捷键功能

void Widget::on_verticalSlider_valueChanged(int value)

{

    QRect rect = this->geometry();

    this->setGeometry(rect.x(), rect.y(), rect.width(), value);

    qDebug() << value;

}

void Widget::subValue()

{

    int value = ui->verticalSlider->value();

    if (value <= ui->verticalSlider->minimum()) {

        return;

    }

    ui->verticalSlider->setValue(value - 20);

}

void Widget::addValue()

{

    int value = ui->verticalSlider->value();

    if (value >= ui->verticalSlider->maximum()) {

        return;

    }

    ui->verticalSlider->setValue(value + 20);

}

相关文章:

  • Python 字符串相似度计算:方法、应用与实践
  • WeakAuras Lua Script [ICC BOSS 11 - Sindragosa]
  • ROS2学习(10)------ROS2参数
  • STM32F103_Bootloader程序开发03 - 启动入口与升级模式判断(boot_entry.c与boot_entry.h)
  • SOC-ESP32S3部分:13-定时器
  • 多查询检索在RAG中的应用及为什么平均嵌入向量效果好
  • 【蓝桥杯嵌入式】【模块】八、UART相关配置及代码模板
  • [De1CTF 2019]SSRF Me
  • 今日行情明日机会——20250526
  • Redis批量删除Key的三种方式
  • 【杂谈】------使用 __int128 处理超大整数计算
  • MyBatis深度解析:XML/注解配置与动态SQL编写实战
  • TinyVue v3.23.0 正式发布:增加 NumberAnimation 数字动画组件、支持全局配置组件的 props
  • FreeRTOS 在物联网传感器节点的应用:低功耗实时数据采集与传输方案
  • 资源回收:为地球减负,共创绿色未来
  • 超临界机组协调控制系统建模项目开发笔记
  • ubuntu 22.04 配置静态IP、网关、DNS
  • MySQL进阶实战:窗口函数 VS 聚合函数,性能与场景全对比
  • MyBatis 与 Spring 框架集成详解:构建企业级数据访问层
  • 泛型(1)
  • 网站推广传单/国家市场监督管理总局官网
  • 来宾建设工程造价网站/外贸seo推广公司
  • 学历网站怎么做/浏览器直接进入网站的注意事项
  • 网络销售工作内容/搜索引擎优化搜索优化
  • 做网商哪个国外网站好/品牌广告语经典100条
  • 做2手车网站需要多少钱/怎么创建个人网站