如何通过按 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 感兴趣,您可以在之后再添加一个事件过滤器,您可以在其中检查是否按下了其他键。我试过了,效果很好。
我正在做一个 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 感兴趣,您可以在之后再添加一个事件过滤器,您可以在其中检查是否按下了其他键。我试过了,效果很好。