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

时间:2016-06-28 01:42:39

标签: c++ qt qt4

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

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

理想情况下,我想要一个可以触发的信号,触发QLineEdit重置为之前的值。我宁愿不尝试假冒逃生钥匙事件。我可以缓存行编辑的旧值,但是如果单击escape时行为已经存在,这似乎更有效。谢谢。

2 个答案:

答案 0 :(得分:1)

  

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

通过使用QWidget::event的子项覆盖QLineEdit虚函数或者更多“本地”,例如安装事件过滤器:

    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按下来重置上一个文本,您可以使用不同的方法,但是您需要以某种方式获取指向包含该字符串的对象的指针。没有看到你的代码就很难回答。

答案 1 :(得分:0)

您还可以使用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键,则可以在此之后立即添加一个事件过滤器,以检查是否按下了其他键。我已经尝试过了,而且行得通。