当且仅当文本框具有焦点并且按下“输入”时才实现插槽功能?
Posted
技术标签:
【中文标题】当且仅当文本框具有焦点并且按下“输入”时才实现插槽功能?【英文标题】:Implementing a slot function if and only if a a text box has focus and "enter" is pressed? 【发布时间】:2014-05-17 18:06:19 【问题描述】:基本上,我只想在用户“单击”文本字段并且按下回车键的情况下清除文本字段。经过一番研究,我发现您必须首先为每个小部件设置focusPolicy
。完毕。
dataSend_area->setFocusPolicy(Qt::ClickFocus);
从这一点开始,我迷路了。据我所知,当满足这些条件时,我需要实现一个slot
函数来实现一个自定义函数。下面给出的伪代码是我所得到的。我搜索了 Qt 文档,发现零散的信息很少,但几乎没有任何关于所有功能合并的信息。
keyPressEvent(enter/return Key)
if ( textBox has focus )
//do
else
return
【问题讨论】:
【参考方案1】:您应该重写 keyPressEvent 函数。这些代码可能会有所帮助。
void MainWidget::keyPressEvent(QKeyEvent *event)
if(event->key() == Qt::Key_Return && my_text_widget->hasFocus())
my_text_widget->setText("");
这里是如何覆盖事件的示例 http://programmingexamples.wikidot.com/qt-events
【讨论】:
也许if(event->key() == Qt::Key_Return && my_text_widget.hasFocus())
?
我正在这样做,但收到一个无法解释的 invalid use of incomplete type 'class QKeyEVent'
错误。感谢您的帮助!
添加#include <QKeyEvent>
嗯,就是这样!谢谢!【参考方案2】:
是的,您的概念或多或少是正确的。您确实需要以下操作:
1) 重新实现key press event handler。
2) 检查是否按下了回车键。
3) 检查小部件是否有焦点。
然而,你不需要搞砸的是你提到的信号槽。事件与层上的信号槽的管理略有不同。
你的伪代码可以这样变成真正的代码:
#include <QKeyEvent>
...
void MyWidget::keyPressEvent(QKeyEvent *event)
if (hasFocus())
if(event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter)
clear();
【讨论】:
enter
和 return
键之间有区别吗?它可能与不同的平台有关吗?
@sherrellbc:enter 通常位于键盘上。有关详细信息,请参阅以下内容:qt-project.org/doc/qt-5/qt.html#Key-enum 您要求返回并输入,所以我假设这就是您的意思。有些人更喜欢使用那个输入,所以恕我直言,如果应用程序支持它会更好,否则你会很快收到用户的投诉。 :)
我没有台式机,也没有带键盘的笔记本电脑,所以我不知道。这是一个有趣的观点,我的印象是输入/返回键是对同一个键的可互换引用。
@sherrellbc:这取决于你如何定义它们。在 Qt 上下文中,这似乎是基于官方文档的差异。我个人认为它们是可以互换的,所以我个人会将该项目命名为更具描述性。顺便说一句,我认为您将能够摆脱 hasFocus() 调用,因为只有在您拥有焦点时才会调用此方法,前提是 myWidget 是您的文本小部件的子类。
我不确定你最后的陈述。也许我们没有考虑同样的事情,因为我看不出keyPressEvent
和focusEvent
之间有任何联系。以上是关于当且仅当文本框具有焦点并且按下“输入”时才实现插槽功能?的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate HQL:当且仅当所有子实体都具有相同值的属性时,如何选择父实体?