QQuickView,切换窗口后没有键盘焦点

时间:2016-11-28 16:37:30

标签: qt user-interface qml keyboard-events qtquick2

我的cpp应用程序有一个QMainWindow派生类,在ui中有QQuickView小部件。视图内部有许多接受键盘输入的QML项目。单击某个项目时,我会在单击的项目上调用forceActiveFocus()。这一切都从我启动应用程序开始,直到我切换到另一个窗口。

如果我切换到另一个应用程序并返回,或切换到我的应用程序中的另一个窗口并返回,则调用forceActiveFocus()无效。这些项目有几种不同的类型,但这里有一个示例项目:

TextInput {
            id: textInput
            anchors.fill: parent
            inputMethodHints: Qt.ImhFormattedNumbersOnly
            onActiveFocusChanged: console.log(activeFocus)
            onEditingFinished:
            {

            }

            MouseArea {
                anchors.fill: textInput
                onClicked: {
                    textInput.forceActiveFocus()
                    console.log("clicked")
                }
            }
        }

切换时,我看到activeFocus记录到控制台为false。当我再次切换回来并单击该项目时,“clicked”将记录到控制台,因此正在处理鼠标事件。但是,永远不会再调用onActiveFocusChanged。

我还尝试使用FocusScope作为项目的父项进行实现,得到相同的行为,焦点跟随我的点击,直到我切换到其他窗口然后再返回。

更新

在阅读@ user2436719的评论后,我尝试了两个最小的例子。只有在使用QQuickView时才会出现此问题。以下是使用带有以下Window的QML main.qrc的QML应用,效果很好:

import QtQuick 2.7
import QtQuick.Window 2.2

Window {
    color: "lightblue"

    Rectangle {
        id: textInputRect
        color: "white"
        height: 50
        width: 150
        anchors.centerIn: parent

        TextInput {
            id: textInput
            anchors.fill: parent
            inputMethodHints: Qt.ImhFormattedNumbersOnly
            onActiveFocusChanged: console.log(activeFocus)
            onEditingFinished:
            {

            }
        }
    }

}

第二个是CPP应用程序,其中QMainWindow派生类在ui中有一个QQuickView小部件。此版本显示问题行为。这是main.qrc

import QtQuick 2.7
import QtQuick.Window 2.2

Rectangle {
    anchors.fill: parent
    color: "lightblue"

    Rectangle {
        id: textInputRect
        color: "white"
        height: 50
        width: 150
        anchors.centerIn: parent

        TextInput {
            id: textInput
            anchors.fill: parent
            inputMethodHints: Qt.ImhFormattedNumbersOnly
            onActiveFocusChanged: console.log(activeFocus)
            onEditingFinished:
            {

            }
        }
    }
}

从QQuickView版本,这里是main

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));

    MainWindow window;
    QQuickView* view = new QQuickView;

    window.setView(view);

    window.show();

    return app.exec();
}

以下是我在QQuickView中设置MainWindow的方法:

void MainWindow::setView(QQuickView *value)
{
    view = value;
    QWidget *container = QWidget::createWindowContainer(view, this);
    view->setSource(QUrl("qrc:/main.qml"));
    ui->verticalLayout->addWidget(container);
}

1 个答案:

答案 0 :(得分:2)

好的,这是QTBUG-34414。在该错误的评论的底部,发布了一种解决方法。在我切换到我的应用程序的其他窗口或其他应用程序的情况下,已发布的解决方法为我解决了问题。关闭对话框后仍然没有焦点。将这个覆盖放在我的窗口类中修复了两种情况的问题:

shouldComponentUpdate(nextProps, nextState){
  if(validate()){
    return true
  }
  return false;
}

这个覆盖对我来说在OSX Sierra上使用Qt 5.7。