QLineEdit
阅读数:57 评论数:0
跳转到新版页面分类
C/C++
正文
QLineEdit
是 Qt 中用于单行文本输入的控件。
设置和获取文本
设置 QLineEdit
的文本:
lineEdit->setText("Hello, World!");
获取 QLineEdit
当前的文本:
QString text = lineEdit->text();
设置边框颜色
QLineEdit *lineEdit = new QLineEdit(parent);
// 设置边框颜色为红色
lineEdit->setStyleSheet("QLineEdit {"
"border: 2px solid red;"
"border-radius: 5px;" // 可选:设置边框圆角
"padding: 5px;" // 可选:设置内边距
"}");
设置Placeholder颜色
QLineEdit *lineEdit = new QLineEdit(parent);
// 设置占位符文本和颜色
lineEdit->setPlaceholderText("Enter your text here");
lineEdit->setStyleSheet("QLineEdit::placeholder { color: #808080; }");
占位符文本
设置占位符文本,这是当 QLineEdit
为空时显示的灰色文本:
lineEdit->setPlaceholderText("Enter your name");
只读模式
设置 QLineEdit
为只读,防止用户编辑:
lineEdit->setReadOnly(true);
密码模式
设置 QLineEdit
以隐藏输入文本,常用于密码输入:
lineEdit->setEchoMode(QLineEdit::Password);
信号和槽
QLineEdit
提供了多种信号,可以连接到槽函数以响应用户的操作。例如,当文本改变时:
connect(lineEdit, &QLineEdit::textChanged, this, &MyClass::onTextChanged);
当用户按下回车键时:
connect(lineEdit, &QLineEdit::returnPressed, this, &MyClass::onReturnPressed);
校验器
为 QLineEdit
设置校验器(QValidator
),可以限制用户输入的字符类型:
QIntValidator *validator = new QIntValidator(100, 999, lineEdit);
lineEdit->setValidator(validator);
上面的代码创建了一个 QIntValidator
对象,它只允许用户输入从 100 到 999 的整数。
在 Qt 中,QLineEdit
控件可以通过设置一个验证器(QValidator
)来限制用户输入。Qt 提供了几种内置的验证器,如 QIntValidator
, QDoubleValidator
, 和 QRegExpValidator
。如果这些内置验证器不满足你的特定需求,你可以通过继承 QValidator
类并实现你自己的验证逻辑来创建自定义验证器。
以下是创建自定义验证器的步骤:
- 继承
QValidator
类:创建一个新的类并继承自QValidator
。 - 实现
validate
方法:在你的子类中实现validate(QString &input, int &pos) const
方法。这个方法应该检查输入的合法性,并返回一个QValidator::State
值(Invalid
,Intermediate
, 或Acceptable
)。 - (可选)实现
fixup
方法:如果需要,可以重写fixup(QString &input) const
方法来修正不合法的输入。
下面是一个简单的自定义验证器的例子,这个验证器只接受包含字母 "a" 或 "b" 的字符串:
#include <QValidator>
class CustomValidator : public QValidator {
public:
CustomValidator(QObject *parent = nullptr) : QValidator(parent) {}
State validate(QString &input, int &pos) const override {
Q_UNUSED(pos)
// 如果输入是空的,我们可能仍在输入过程中,因此状态是 Intermediate
if (input.isEmpty()) {
return QValidator::Intermediate;
}
// 检查字符串是否只包含 'a' 或 'b'
if (input.contains(QRegExp("^[ab]*$"))) {
return QValidator::Acceptable;
} else {
return QValidator::Invalid;
}
}
void fixup(QString &input) const override {
// 修正输入,移除所有不是 'a' 或 'b' 的字符
input.remove(QRegExp("[^ab]"));
}
};
内部距离
lineEdit->setStyleSheet("QLineEdit { padding-left: 10px; }");
依次设置了上、右、下、左方向的内边距
lineEdit->setStyleSheet("QLineEdit { padding: 5px 10px 5px 10px; }");
带后缀图标
1、使用QLineEdit的addAction方法
QLineEdit
提供了一个 addAction
方法,可以在输入框的右侧(或左侧)添加一个动作(QAction
),这个动作可以有一个图标。
QLineEdit *lineEdit = new QLineEdit(this);
QAction *action = lineEdit->addAction(QIcon(":/path/to/icon.png"), QLineEdit::TrailingPosition);
这个图标将显示在输入框的右侧。如果你想要这个图标是可点击的,可以连接动作的 triggered
信号。
connect(action, &QAction::triggered, this, &YourClass::onActionTriggered);
你可以在将图标添加到 QLineEdit
之前,使用 QIcon::pixmap()
方法来创建一个指定大小的 QPixmap
,然后使用这个 QPixmap
创建 QAction
。
QLineEdit *lineEdit = new QLineEdit(this);
// 创建一个指定大小的图标
QIcon icon(":/path/to/icon.png");
int iconWidth = 24; // 你想要的图标宽度
int iconHeight = 24; // 你想要的图标高度
QPixmap pixmap = icon.pixmap(iconWidth, iconHeight);
// 创建动作并添加到 QLineEdit
QAction *action = lineEdit->addAction(QIcon(pixmap), QLineEdit::TrailingPosition);
2、自定义QLineEdit
class IconLineEdit : public QLineEdit {
public:
IconLineEdit(QWidget *parent = nullptr) : QLineEdit(parent) {
// 设置图标和图标位置
setIcon(QIcon(":/path/to/icon.png"));
}
protected:
void paintEvent(QPaintEvent *event) override {
QLineEdit::paintEvent(event);
QPainter painter(this);
// 绘制图标
painter.drawPixmap(rect().right() - icon.width() - padding, (rect().height() - icon.height()) / 2, icon);
}
void setIcon(const QIcon &icon) {
this->icon = icon.pixmap(iconSize);
// 更新右边距以防止文本与图标重叠
setTextMargins(0, 0, icon.width() + padding, 0);
}
private:
QPixmap icon;
QSize iconSize = QSize(16, 16); // 图标尺寸,根据需要调整
int padding = 5; // 图标与输入框边缘的间距
};
监听回车
1、使用returnPressed信号
QLineEdit
有一个 returnPressed
信号,当用户在控件中按下回车键时会发射这个信号。你可以连接这个信号到你自己的槽函数来处理回车事件。
QLineEdit *lineEdit = new QLineEdit(this);
// 连接 returnPressed 信号到槽函数
connect(lineEdit, &QLineEdit::returnPressed, this, &YourClass::onReturnPressed);
// ...
void YourClass::onReturnPressed() {
// 处理回车按键事件
qDebug() << "Return pressed in line edit.";
}
2、重写keyPressEvent
如果你需要更多的控制,或者想在同一个控件中处理多个键盘事件,你可能需要通过继承 QLineEdit
并重写 keyPressEvent
方法来实现。
class MyLineEdit : public QLineEdit {
Q_OBJECT
public:
using QLineEdit::QLineEdit; // 继承构造函数
protected:
void keyPressEvent(QKeyEvent *event) override {
if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) {
// 处理回车按键事件
emit returnPressed();
} else {
// 对于其他按键,调用基类的 keyPressEvent
QLineEdit::keyPressEvent(event);
}
}
};
监听输入事件
#include <QApplication>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QDebug>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
// 创建一个 QLineEdit
QLineEdit *lineEdit = new QLineEdit();
// 监听 textChanged 信号
QObject::connect(lineEdit, &QLineEdit::textChanged, [&](const QString &text){
qDebug() << "输入内容变化为:" << text;
});
// 创建一个布局并将 QLineEdit 添加到布局中
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(lineEdit);
// 创建一个窗口并将布局设置为窗口的布局
QWidget window;
window.setLayout(layout);
window.show();
return a.exec();
}