Qt控件:输入控件

1. 下拉列表框 QComboBox

在Qt中,QComboBox(下拉列表框)是一种常用的选择控件,允许用户从预定义的选项列表中选择一个值,也可设置为可编辑模式让用户输入自定义内容。

  • 功能:提供下拉式的选项列表,节省界面空间。
  • 模式
    • 只读模式(默认):用户只能从列表中选择。
    • 可编辑模式:用户可输入自定义内容。
  • 信号:选项变化时发出信号,支持索引和文本两种方式捕获变化。

1.1 创建 ComboBox

方法1:在Qt Designer中添加
方法2:在代码中创建

#include <QComboBox>

// 在窗口构造函数中创建
QComboBox *comboBox = new QComboBox(this);
comboBox->addItem("选项1");  // 添加单个选项
comboBox->addItems({"选项2", "选项3", "选项4"});  // 添加多个选项

// 设置当前选中项
comboBox->setCurrentIndex(1);  // 选中第二个选项(索引从0开始)
comboBox->setCurrentText("选项3");  // 选中文本为"选项3"的项

1.2 常用属性和方法

属性:

属性说明
currentIndex当前选中项的索引(-1表示无选中项)
currentText当前选中项的文本
editable是否可编辑(默认 false
maxCount最大选项数(默认 32767
maxVisibleItems下拉列表一次最多显示的项数
insertPolicy可编辑模式下的插入策略(如 QComboBox::InsertAtTop

方法:

// 添加选项
void addItem(const QString &text, const QVariant &userData = QVariant());
void addItems(const QStringList &texts);

// 插入和删除选项
void insertItem(int index, const QString &text);
void removeItem(int index);
void clear();  // 清空所有选项

// 获取选项信息
QString itemText(int index) const;
QVariant itemData(int index) const;  // 获取用户数据(见下文)
int count() const;  // 选项总数

// 设置和获取当前项
int currentIndex() const;
QString currentText() const;
QVariant currentData() const;
void setCurrentIndex(int index);
void setCurrentText(const QString &text);

可编辑模式:设置 setEditable(true) 后,用户可输入自定义内容

comboBox->setEditable(true);

// 设置插入策略
comboBox->setInsertPolicy(QComboBox::InsertAtTop);  // 新输入的内容添加到顶部
comboBox->setInsertPolicy(QComboBox::InsertAlphabetically);  // 按字母顺序插入

用户数据(User Data):每个选项可关联一个 QVariant 类型的用户数据,用于存储额外信息(如ID、对象指针等)

// 添加选项并关联用户数据
comboBox->addItem("北京", 1001);  // 关联城市ID
comboBox->addItem("上海", 1002);

// 获取用户数据
int cityId = comboBox->itemData(comboBox->currentIndex()).toInt();

1.3 信号与槽连接

QComboBox提供多种信号,常用的有:

// 选项索引变化时发出(包括程序设置和用户选择)
void currentIndexChanged(int index);
void currentIndexChanged(const QString &text);

// 可编辑模式下,文本被编辑时发出
void editTextChanged(const QString &text);

// 下拉列表弹出/收起时发出
void activated(int index);
void activated(const QString &text);

示例:连接信号与槽

// 方式1:使用索引
connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
        [=](int index) {
    qDebug() << "选中项索引:" << index;
    qDebug() << "选中项文本:" << comboBox->itemText(index);
});

// 方式2:使用文本
connect(comboBox, &QComboBox::currentTextChanged,
        [=](const QString &text) {
    qDebug() << "当前文本:" << text;
});

// 方式3:在槽函数中处理
class MyClass : public QObject {
    Q_OBJECT
public slots:
    void onComboBoxChanged(int index);
};

connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
        this, &MyClass::onComboBoxChanged);

1.4 注意事项

  • 索引从0开始:第一个选项的索引是0。
  • 性能考虑:大量选项(如超过1000个)时,建议使用 QListView 作为下拉视图。
  • 用户数据类型:存储复杂类型(如自定义对象)时,需使用 Q_DECLARE_METATYPE 注册类型。

在这里插入图片描述

2. 编辑框 QLineEdit

在Qt中,QLineEdit 是用于单行文本输入的控件,支持文本验证、密码模式、占位符提示等功能。

  • 功能:提供单行文本输入框,支持键盘输入、文本选择、复制粘贴等操作。
  • 常用场景:用户名/密码输入、搜索框、配置参数输入等。
  • 信号:文本变化、编辑完成等事件会发出相应信号。

2.1 创建和基本设置

方法1:在Qt Designer中添加

  1. 在Qt Designer的控件面板中找到 QLineEdit
  2. 拖到界面上,在"属性编辑器"中设置 textplaceholderTextmaxLength 等属性。

方法2:在代码中创建

#include <QLineEdit>
// 在窗口构造函数中创建
QLineEdit *lineEdit = new QLineEdit(this);
lineEdit->setText("初始文本");  // 设置初始文本
lineEdit->setPlaceholderText("请输入文本...");  // 设置占位符(输入框为空时显示)
lineEdit->setMaxLength(50);  // 设置最大输入长度
lineEdit->setReadOnly(false);  // 设置是否只读

2.2 常用属性和方法

文本操作:

// 设置和获取文本
void setText(const QString &text);
QString text() const;

// 追加和插入文本
void append(const QString &text);
void insert(const QString &newText);

// 清空文本
void clear();

// 选中部分文本
void setSelection(int start, int length);
void selectAll();

外观和行为:

// 设置对齐方式
void setAlignment(Qt::Alignment flag);  // 如 Qt::AlignCenter

// 设置字体
void setFont(const QFont &font);

// 设置输入掩码(限制输入格式)
void setInputMask(const QString &inputMask);  // 如 "9999-99-99" 限制日期格式

// 设置回声模式(用于密码输入)
void setEchoMode(QLineEdit::EchoMode mode);  // 如 QLineEdit::Password

验证器:

// 设置文本验证器(限制输入内容)
void setValidator(const QValidator *validator);

// 示例:只允许输入整数
QIntValidator *validator = new QIntValidator(0, 100, this);  // 范围0-100
lineEdit->setValidator(validator);

// 示例:只允许输入正则表达式匹配的内容
QRegExpValidator *regexValidator = new QRegExpValidator(QRegExp("[A-Za-z0-9]+"), this);
lineEdit->setValidator(regexValidator);

信号与槽连接:
QLineEdit提供多种信号,常用的有:

// 文本变化时发出(用户输入或代码设置)
void textChanged(const QString &text);

// 编辑完成时发出(按下Enter或失去焦点)
void editingFinished();

// 光标位置变化时发出
void cursorPositionChanged(int oldPos, int newPos);

// 选中的文本变化时发出
void selectionChanged();

// 按下Return/Enter键时发出
void returnPressed();

示例:连接信号与槽:

// 方式1:文本变化时触发
connect(lineEdit, &QLineEdit::textChanged, [=](const QString &text) {
    qDebug() << "当前文本:" << text;
});

// 方式2:编辑完成时触发
connect(lineEdit, &QLineEdit::editingFinished, [=]() {
    qDebug() << "编辑完成,当前文本:" << lineEdit->text();
});

// 方式3:在槽函数中处理
class MyClass : public QObject {
    Q_OBJECT
public slots:
    void onTextChanged(const QString &text);
};

connect(lineEdit, &QLineEdit::textChanged, this, &MyClass::onTextChanged);

密码模式:
通过 setEchoMode() 设置密码模式:

// 设置为密码模式
lineEdit->setEchoMode(QLineEdit::Password);  // 显示星号 (*)

// 可选的密码模式
lineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);  // 编辑时显示明文,之后显示星号
lineEdit->setEchoMode(QLineEdit::Normal);  // 正常显示(默认)

输入掩码:
使用 setInputMask() 限制输入格式:

// 示例1:电话号码(+1 123 456 7890)
lineEdit->setInputMask("+9 999 999 9999");

// 示例2:IP地址
lineEdit->setInputMask("000.000.000.000;_");  // 用下划线 (_) 作为空白字符

// 示例3:日期(YYYY-MM-DD)
lineEdit->setInputMask("9999-99-99");

2.3 示例

#include <QLineEdit>
#include <QVBoxLayout>
#include <QWidget>
#include <QLabel>
#include <QIntValidator>

class MyWidget : public QWidget {
    Q_OBJECT
public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
        QVBoxLayout *layout = new QVBoxLayout(this);
        
        // 普通文本输入
        QLabel *label1 = new QLabel("用户名:", this);
        QLineEdit *usernameEdit = new QLineEdit(this);
        usernameEdit->setPlaceholderText("请输入用户名");
        
        // 密码输入
        QLabel *label2 = new QLabel("密码:", this);
        QLineEdit *passwordEdit = new QLineEdit(this);
        passwordEdit->setEchoMode(QLineEdit::Password);
        passwordEdit->setPlaceholderText("请输入密码");
        
        // 数值输入
        QLabel *label3 = new QLabel("年龄:", this);
        QLineEdit *ageEdit = new QLineEdit(this);
        ageEdit->setValidator(new QIntValidator(0, 150, this));  // 限制0-150
        ageEdit->setPlaceholderText("请输入年龄");
        
        // 带输入掩码的输入
        QLabel *label4 = new QLabel("日期:", this);
        QLineEdit *dateEdit = new QLineEdit(this);
        dateEdit->setInputMask("9999-99-99");
        dateEdit->setPlaceholderText("YYYY-MM-DD");
        
        // 添加到布局
        layout->addWidget(label1);
        layout->addWidget(usernameEdit);
        layout->addWidget(label2);
        layout->addWidget(passwordEdit);
        layout->addWidget(label3);
        layout->addWidget(ageEdit);
        layout->addWidget(label4);
        layout->addWidget(dateEdit);
        layout->addStretch();
        
        // 连接信号
        connect(usernameEdit, &QLineEdit::textChanged, this, &MyWidget::onTextChanged);
        connect(passwordEdit, &QLineEdit::editingFinished, this, &MyWidget::onPasswordFinished);
    }
    
private slots:
    void onTextChanged(const QString &text) {
        qDebug() << "用户名变化:" << text;
    }
    
    void onPasswordFinished() {
        qDebug() << "密码输入完成";
    }
};

2.4 注意事项

  • 多行文本:若需要多行文本输入,应使用 QTextEditQPlainTextEdit
  • 验证器与输入掩码:两者可同时使用,但验证器优先级更高。
  • 性能考虑:在大量文本输入场景下,频繁触发 textChanged 信号可能影响性能,可考虑使用 editingFinished 信号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值