Qt控件:输入控件
输入控件
- 1. 下拉列表框 QComboBox
- 1.1 创建 ComboBox
- 1.2 常用属性和方法
- 1.3 信号与槽连接
- 1.4 注意事项
- 2. 编辑框 QLineEdit
- 2.1 创建和基本设置
- 2.2 常用属性和方法
- 2.3 示例
- 2.4 注意事项
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中添加
- 在Qt Designer的控件面板中找到 QLineEdit。
- 拖到界面上,在"属性编辑器"中设置
text
、placeholderText
、maxLength
等属性。
方法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-150ageEdit->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 注意事项
- 多行文本:若需要多行文本输入,应使用
QTextEdit
或QPlainTextEdit
。 - 验证器与输入掩码:两者可同时使用,但验证器优先级更高。
- 性能考虑:在大量文本输入场景下,频繁触发
textChanged
信号可能影响性能,可考虑使用editingFinished
信号。