如何按Escape键重置QLineEdit文本

How to reset QLineEdit text by pressing Escape key?

本文关键字:QLineEdit 文本 何按 Escape      更新时间:2023-10-16

我正在做一个Qt4项目。我有一个QLineEdit,我想重用的行为,我看到当我点击转义键内的QLineEdit,但我不确定如何。

当我按下转义键时,我让字段重置为开始编辑之前的值。这对我很有用,我想要这个行为。

理想情况下,我想要一个信号,我可以发射触发QLineEdit重置到它之前的值。我宁愿不要尝试假装一个逃脱键事件。我可以缓存行编辑的旧值,但如果单击转义时行为已经存在,则这似乎需要更多的工作。谢谢。

如何通过设置使QLineEdit小部件响应Escape键程序化的文本?

通过用QLineEdit的子函数重写QWidget::event虚函数或更"本地"一点,如安装事件过滤器:

    class MyLineEditEventFilter : public QObject
    {
    public:
        explicit MyLineEditEventFilter(QLineEdit *parent) : QObject(parent)
        {}
        bool eventFilter(QObject *obj, QEvent *e)
        {
            switch (e->type())
            {
                case QEvent::KeyPress:
                {
                    QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
                    if (keyEvent->key() == Qt::Key_Escape)
                    {
                        // or set the other text from the variable
                        reinterpret_cast<QLineEdit *>(parent())->setText("Escape!");
                    }
                    break;
                }
            }
            // standard event processing
            return QObject::eventFilter(obj, e);
        }
    };

调用者是这样的:

m_pLineEditSearch = new QLineEdit;
auto* pLineEditEvtFilter = new MyLineEditEventFilter(m_pLineEditSearch);
m_pLineEditSearch->installEventFilter(pLineEditEvtFilter);

在按下Escape键后重置前面的文本,你可以使用不同的方法,但是你需要以某种方式获得保存字符串的对象的指针。如果不看代码,很难回答这个问题。

您也可以使用QDataWidgetMapper并将您的QLineEdit映射到它的模型。你提到的Esc键行为已经内置在那里了。您还可以利用QDataWidgetMapper提供的其他功能。

你可以这样使用它:

//Your model can have multiple rows and columns, let's assume it's just one
//QLineEdit, that will mean one row and one column
QStandardItemModel *model = new QStandardItemModel(1,1,this);
QStandardItem* item = new QStandardItem("QLineEdit initial value");
QLineEdit* myLineEdit = new QLineEdit(this);
QDataWidgetMapper* dataWidgetMapper = new QDataWidgetMapper(this);
dataWidgetMapper->setModel(model);
dataWidgetMapper->addMapping(myLineEdit, 0);
dataWidgetMapper->toFirst();

希望对你有帮助。

UPDATE:

关于QDataWidgetMapper,的一些缺陷,在我的部分的评论中提出了一些有效的担忧,即它不仅响应转义键,还响应其他键,如Enter/Return。因此,在调用QDataWidgetMapper::addMapping(QWidget*, int)之后,将在小部件上安装一个事件过滤器,该过滤器将使用Escape和Enter/Return键。如果您仍然想知道是否按下了Enter或Escape,您可以在此之后添加一个事件过滤器,以便检查是否按下了其他键。