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

Posted

技术标签:

【中文标题】如何通过按 Escape 键重置 QLineEdit 文本?【英文标题】:How to reset QLineEdit text by pressing Escape key? 【发布时间】:2016-06-28 01:42:38 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

如何通过设置使 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 的情况下重置先前的文本,您可以使用不同的方法,但您需要以某种方式获取指向保存字符串的对象的指针。没有看到你的代码就很难回答。

【讨论】:

这对我来说很清楚。我将 QLineEdit 子类化,因此覆盖事件行为是有意义的。我想我只是希望我能在这个对象上获得一个信号或方法来重现该行为,因为它已经存在。谢谢!【参考方案2】:

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

【讨论】:

QDataWidgetMapper 不仅监听escape键,还监听其他键,你觉得你的回答够吗? @eyllanesc,你是对的,确实如此。我想如果有人想要 QDataWidgetMapper 提供的 Escape 键的特定行为,他们也可能对它的其他功能感兴趣...... 一个高质量的响应应该响应 OP,在你的情况下那个类是超大的,你不觉得吗?答案无助于推广其他课程。 我想我们已经讨论过行数,行数与答案无关,您的功能将与其他键一起启动,您不认为会产生问题吗? 您希望某个问题在 2 年后得到解答吗?提问者可能不活跃。

以上是关于如何通过按 Escape 键重置 QLineEdit 文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Escape上的输入字段重置为上一个值

DataGridView如何通过按下escape来检测用户何时从编辑控件中出来?

centos恢复默认也要密码?

如何在Vim中将菜单键(“应用程序键”)映射到Escape键?

在array_filter()之后,我如何重置键以从0开始按数字顺序排列

Macbook 按开机键无任何反应,重置系统管理控制器