在QtQml中全屏打开新组件

Open new Component in Fullscreen in QtQml

本文关键字:新组件 组件 QtQml      更新时间:2023-10-16

我有一个使用qml和c++的Qt应用程序。桂是几个组成部分深。我想在全屏模式下打开一个新的组件(虚拟键盘),但打开这个新模块,不应该破坏打开的组件,只是以全屏大小显示在它们上面。

我已经尝试使用相同的QQuickView对象使用c++扩展打开这个键盘。它是有效的,但我正在努力将键盘的焦点转移到新的元素上。

这就是我从c++回调函数打开虚拟键盘的方式:

QQmlComponent component(viewer->engine(), QUrl::fromLocalFile("qml/VirtualKeyboard.qml"));
keyboard = component.create();
QQmlProperty::write(keyboard, "parent", QVariant::fromValue<QObject*>(static_cast<QObject*>(viewer->rootObject())));
QQmlEngine::setObjectOwnership(keyboard, QQmlEngine::CppOwnership);

有没有更简单的方法可以将新组件作为子元素但在全屏中打开?或者我应该怎么做才能将焦点转移到新元素上。我试过使用以下代码,但都不起作用。

    viewer->rootObject()->childItems()[0]->setEnabled(false);   //original components
    viewer->rootObject()->childItems()[0]->setFocus(false);
    viewer->rootObject()->childItems()[1]->forceActiveFocus();  //virtual keyboard component

有什么建议吗?提前感谢

终于解决了这个问题。我不确定错误是什么,但可能我忘记了将VirtualKeyboard.qml作为FocusScope元素。

我还修改了GUI的结构,以便在全屏模式下更容易地删除弹出窗口和其他消息框窗口。我写下我的最终解决方案,以后可能对其他人有用。

首先,我有一个main.qml,它在启动时运行

Rectangle {
    id: mainWindow
    width: 800
    height: 600
    objectName: "mainWindow"
    Loader {
        objectName: "mainLoader"
        anchors.fill: parent
        source: ""
        onLoaded: item.objectName="loadedMain";
    }
    Loader {
        objectName: "popupLoader"
        anchors.fill: parent
        source: ""
        onLoaded: item.objectName="loadedPopup";
    }
}

在c逻辑中,使用了以下函数。

//How to open main windows
void MainUserSelection::showWindow(QString type) {
    QObject *main = viewer->rootObject()->findChild<QObject*>("mainLoader",Qt::FindChildrenRecursively);
    if (main==NULL)
        return;
    if (type=="SettingsWindow") {
        main->setProperty("source", "qml/Settings.qml");
        return;
    }
}
//how to open popups
void MainUserSelection::showPopup(QString type, QStringList params) {
    if (type=="PictureSelect") {
        QObject *main = viewer->rootObject()->findChild<QObject*>("popupLoader",Qt::FindChildrenRecursively);
        if (main!=NULL) {
            main->setProperty("source", "qml/Popups/PictureSelect.qml");
            QQuickItem *item = viewer->rootObject()->findChild<QQuickItem *>("loadedPopup");
            if (item!=NULL)
                item->forceActiveFocus();
            if (params.count()>0)
                item->setProperty("textEnglish",params[0]);
            if (params.count()>1)
                item->setProperty("textHungarian",params[1]);
        }
        return;
    }
    if (type=="Keyboard") {
        QObject *main = viewer->rootObject()->findChild<QObject*>("popupLoader",Qt::FindChildrenRecursively);
        if (main!=NULL) {
            main->setProperty("source", "qml/Popups/VirtualKeyboard.qml");
            QQuickItem *item = viewer->rootObject()->findChild<QQuickItem *>("loadedPopup");
            if (item!=NULL) {
                item->forceActiveFocus();
                if (params.count()>0)
                    item->setProperty("text",params[0]);
                if (params.count()>1)
                    item->setProperty("placeholder",params[1]);
            }
        }
        return;
    }
}
//popup windows returns by calling this function
void MainUserSelection::popupReturned(QString type, QStringList params) {
    QObject *main = viewer->rootObject()->findChild<QObject*>("popupLoader",Qt::FindChildrenRecursively);
    if (main!=NULL)
        main->setProperty("source", "");
    QQuickItem *item = viewer->rootObject()->findChild<QQuickItem *>("loadedMain");
    if (item!=NULL)
        item->forceActiveFocus();
    //also emit finish signal to main window qml
    emit popupFinished(type,params);
}

MainUserSelection类中的somewher

viewer->engine()->rootContext()->setContextProperty("userselection",this);

最后,我打开qml弹出窗口,再见:

userselection.showPopup("PictureSelect","")
userselection.popupFinished.connect(someQmlReturnFunction);  //don't forget to disconnect