使用Qt时如何阻止android中的后退键

Posted

技术标签:

【中文标题】使用Qt时如何阻止android中的后退键【英文标题】:How to block the back key in android when using Qt 【发布时间】:2012-02-09 22:21:36 【问题描述】:

如果有人在 android 设备上按下后退键,我需要阻止我正在执行的应用退出,以便我可以发送一个消息框询问用户是否要离开应用,我发现使用:

@Override
void MainWindow::onBackPressed()

    ...

我可以处理那个事件,我在我的 necessitas 项目中尝试过,但没有成功。 qtkeyevent 可以处理这个吗?还是有其他方法可以做到?

我用这个来阻止它:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)

  if ( (keyCode == KeyEvent.KEYCODE_BACK) )
   
     //moveTaskToBack(true); 
     return true;
   
if (QtApplication.m_delegateObject != null && 
        QtApplication.onKeyDown != null)
   return (Boolean) 
QtApplication.invokeDelegateMethod(QtApplication.onKeyDown, keyCode, event);
   else
   return super.onKeyDown(keyCode, event);

现在我需要在 Qt 上捕获事件,以便发送消息

【问题讨论】:

【参考方案1】:

解决方法如下:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    
        int newKeyCode = keyCode;
        if ( (keyCode == KeyEvent.KEYCODE_BACK) )
        
           newKeyCode = KeyEvent.KEYCODE_MEDIA_PREVIOUS;
        
        if (QtApplication.m_delegateObject != null &&
QtApplication.onKeyDown != null)
            return (Boolean)
QtApplication.invokeDelegateMethod(QtApplication.onKeyDown, newKeyCode,
event);
        else
            return super.onKeyDown(newKeyCode, event);
    
    public boolean super_onKeyDown(int keyCode, KeyEvent event)
    
        return super.onKeyDown(keyCode, event);
    

//---------------------------------------------------------------------------

    @Override
    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent
event)
    
        int newKeyCode = keyCode;
        if ( (keyCode == KeyEvent.KEYCODE_BACK) )
        
            newKeyCode = KeyEvent.KEYCODE_MEDIA_PREVIOUS;
        
        if (QtApplication.m_delegateObject != null &&
QtApplication.onKeyMultiple != null)
            return (Boolean)
QtApplication.invokeDelegateMethod(QtApplication.onKeyMultiple ,newKeyCode,
repeatCount, event);
        else
            return super.onKeyMultiple(newKeyCode, repeatCount, event);
    
    public boolean super_onKeyMultiple(int keyCode, int repeatCount,
KeyEvent event)
    
        return super.onKeyMultiple(keyCode, repeatCount, event);
    

//---------------------------------------------------------------------------

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event)
    
        int newKeyCode = keyCode;
        if ( (keyCode == KeyEvent.KEYCODE_BACK) )
        
            newKeyCode = KeyEvent.KEYCODE_MEDIA_PREVIOUS;
        
        if (QtApplication.m_delegateObject != null  &&
QtApplication.onKeyDown != null)
            return (Boolean)
QtApplication.invokeDelegateMethod(QtApplication.onKeyUp, newKeyCode,
event);
        else
            return super.onKeyUp(newKeyCode, event);
    
    public boolean super_onKeyUp(int keyCode, KeyEvent event)
    
        return super.onKeyUp(keyCode, event);
     

然后在 Qt 中:

void MainWindow::keyPressEvent(QKeyEvent *k)

    if( k->key() == Qt::Key_MediaPrevious )
    
        int ret = messageBox( QMessageBox::Yes | QMessageBox::No, "¿Desea salir de la aplicación?", QMessageBox::Question);

        switch(ret)
        
        case QMessageBox::Yes:
            this->close();
            break;

        case QMessageBox::No:
            break;
        
    

感谢 Koying 在此处发布此解决方案 http://groups.google.com/group/android-qt/browse_thread/thread/676c24e94bb9a200?pli=1

【讨论】:

【参考方案2】:

您可以为 Activity 编写 onKeyListener,检查键码,如果它们是您想要的,使用它们。至少,在Java中。当然,C++ 的可能性也不小。

【讨论】:

【参考方案3】:

不太确定这是否适用于您的情况,但通常在 Android 中,在每个感兴趣的 Activity 中,您将使用以下内容来覆盖后退按钮的按下:

@Override
public void onBackPressed()

    // Make sure to NOT call super!
    ...

【讨论】:

以上是关于使用Qt时如何阻止android中的后退键的主要内容,如果未能解决你的问题,请参考以下文章

按下后退按钮未触发

android webView 当用loadDataWithBaseURL加载本地html时如何实现后退到上一页面

如何防止laravel 5.2中的浏览器后退按钮

如何覆盖android中的操作栏后退按钮?

Xamarin.Forms Android 保留汉堡包/菜单图标而不是后退按钮

如何在JQM中全屏显示Fancybox图像时阻止后退按钮上的页面更改?