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 类并实现你自己的验证逻辑来创建自定义验证器。

以下是创建自定义验证器的步骤:

  1. 继承 QValidator:创建一个新的类并继承自 QValidator
  2. 实现 validate 方法:在你的子类中实现 validate(QString &input, int &pos) const 方法。这个方法应该检查输入的合法性,并返回一个 QValidator::State 值(Invalid, Intermediate, 或 Acceptable)。
  3. (可选)实现 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();
}



相关推荐

一、概述 QT是一个跨平台的C++库,主要用来开发图形界面(GUI)程序,它支持多种操作系统 ,如Windows、Linux、Android、ios、gnx、vxworks。 官网:https://w

一、预览 通过窗体-预览 或者 ctrl+R打开预览。 可以使用不同的内置风格、新式表、设备皮肤进行预览。在应用程序可以通过调用QApplication::setStyleSheet()来加载样式表实

代码编辑: Ctrl + Space: 激活代码补全 Ctrl + /: 注释/取消注释当前行或选定代码 Ctrl + I: 自动缩进选定代码 Ctrl + Shift + U: 转换选定文本为大写

在 Qt 中,输出变量值通常是用于调试目的,你可以使用多种方法来打印或显示变量的值。以下是一些常见的方法: 1、使用 qDebug: qDebug 是 Qt 中用于输出调试信息的宏。它可以将输出发送到

在 Qt 中全局加载一个 TTF 字体文件并使用它,你可以在程序初始化时期,比如在 main 函数中加载字体。以下是加载全局字体的步骤: 加载字体文件:使用 QFontDatabase::addAp

一、对于窗口 (QMainWindow, QDialog, 等): 1、move() 方法: 使用 move() 方法可以将窗口移动到屏幕上的指定位置。 QMainWindow *window = n

Qt框架中使用new关键字创建的对象通常需要手动释放,但是Qt提供了一种父子关系机制,可以自动管理对象的内存。当你使用new创建一个对象并将其分配给一个父QObject时,这个对象将会在父对象被销毁时

在Qt中,border-radius 在样式表中不会对顶层窗口生效。顶层窗口是指没有父窗口的窗口,通常是您的应用程序的主窗口或者独立的弹出窗口。由于安全性和平台兼容性的原因,很多样式表中的属性在顶层窗

在Qt中,connect函数用于连接信号和槽。从Qt 5开始,你可以使用C++11的lambda表达式作为槽函数,这样可以使你的代码更加简洁,尤其是当你想要对信号进行一些简单的处理时,而不想去定义一个

1. 定义全局常量 全局常量可以在一个头文件中使用 const 关键字或 #define 预处理器来定义: // constants.h #ifndef CONSTANTS_H #define CO