【问题标题】: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 
}

【问题讨论】:

    标签: c++ qt qwidget qtgui qevent


    【解决方案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();
    }
    

    【讨论】:

    • enterreturn 键之间有区别吗?它可能与不同的平台有关吗?
    • @sherrellbc:enter 通常位于键盘上。有关详细信息,请参阅以下内容:qt-project.org/doc/qt-5/qt.html#Key-enum 您要求返回并输入,所以我假设这就是您的意思。有些人更喜欢使用那个输入,所以恕我直言,如果应用程序支持它会更好,否则你会很快收到用户的投诉。 :)
    • 我没有台式机,也没有带键盘的笔记本电脑,所以我不知道。这是一个有趣的观点,我的印象是输入/返回键是对同一个键的可互换引用。
    • @sherrellbc:这取决于你如何定义它们。在 Qt 上下文中,这似乎是基于官方文档的差异。我个人认为它们是可以互换的,所以我个人会将该项目命名为更具描述性。顺便说一句,我认为您将能够摆脱 hasFocus() 调用,因为只有在您拥有焦点时才会调用此方法,前提是 myWidget 是您的文本小部件的子类。
    • 我不确定你最后的陈述。也许我们没有考虑同样的事情,因为我看不出keyPressEventfocusEvent 之间有任何联系。
    猜你喜欢
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多