我正在开展Qt4项目。我有一个QLineEdit
我希望重新使用我在QLineEdit
内单击Escape键时看到的行为,但我不确定如何。
当我按下转义键时,我将该字段重置为我开始编辑之前的值。这对我很有用,我希望手头有这种行为。
理想情况下,我想要一个可以触发的信号,触发QLineEdit
重置为之前的值。我宁愿不尝试假冒逃生钥匙事件。我可以缓存行编辑的旧值,但是如果单击escape时行为已经存在,这似乎更有效。谢谢。
答案 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键,则可以在此之后立即添加一个事件过滤器,以检查是否按下了其他键。我已经尝试过了,而且行得通。