如何通过按 Escape 键重置 QLineEdit 文本?

How to reset QLineEdit text by pressing Escape key?

我正在做一个 Qt4 项目。我有一个 QLineEdit,我想重新使用我在 QLineEdit 中单击 Escape 键时看到的行为,但我不确定如何。

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

理想情况下,我想要一个我可以触发的信号,触发 QLineEdit 重置为之前的值。我不想尝试伪造转义键事件。我可以缓存行编辑的旧值,但如果当我单击转义时行为已经存在,这似乎更有效。谢谢。

How can I make QLineEdit widget to respond on Escape key by setting the text programmatically?

QLineEdit 的子函数覆盖 QWidget::event 虚函数或多一点 "local",比如安装事件过滤器:

    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, 的一些陷阱的有效担忧,即它不仅响应 Escape 键而且还响应其他键,如 Enter/Return .所以发生的事情是在调用 QDataWidgetMapper::addMapping(QWidget*, int) 之后将在您的小部件上安装一个事件过滤器,它将使用 Escape 和 Enter/Return 键。如果您仍然对确定是否按下了 Enter 或 Escape 感兴趣,您可以在之后再添加一个事件过滤器,您可以在其中检查是否按下了其他键。我试过了,效果很好。