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

标签 android c++ qt

如果有人在 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 上捕获事件以便发送消息

最佳答案

解决方法如下:

@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

关于android - 使用Qt时如何在android中阻止后退键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9219747/

相关文章:

android - Glide 在旋转(方向改变)时第一次不从内存加载图像,然后从内存加载

android - 更改当前正在播放的声音的频率 (Android)

c++ - 当我们在 C++ 中分配同一个类的 Object1 = Object2 时,后台发生了什么?

c++ - 内存编辑: Can't get right address (3 offsets)

c++ - 为什么按值传递 QStringView 比引用常量更快?

android - 在 React Native 中更改 Android 的包名称

java - ExceptionInInitializerError - 服务和库

c++ - 为什么我们可以直接拷贝指针,而不能在c++中直接拷贝数组

c++ - QLayoutItem与QWidget的Qt Layout关系

c++ - 如何将输入焦点设置到 Qt 中显示的对话框?