c++ 从QQmlApplicationEngine加载时,QML窗口不可见

krcsximq  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(185)

问题

问题是,我有一些C++代码加载了一个名为gui.qml的QML文件,它编译时没有问题,但运行时它不会显示QML应用程序窗口,也不会给予任何错误。

代码

下面是我用来加载qml的C++代码(编辑:使用qrc加载qml):

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    const QUrl url("qrc:/components/gui.qml");

    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app,
                     [url](QObject *obj, const QUrl &objUrl) {
                         if (!obj && url == objUrl)
                             QCoreApplication::exit(-1);
                     },
                     Qt::QueuedConnection);
    
    engine.load(url);

    return app.exec();
}

下面是我想要显示的QML代码:

import QtQuick 6.4
import QtQuick.Controls 6.4
import QtQuick.Controls.Material 6.0
import QtQuick.Layouts 6.0

import "components"

ApplicationWindow {
    visible: true
    width: 856
    height: 482

    title: "ModVault"

    Material.theme: Material.Dark

    QtObject{
        id: funtions

        function switch_screen(screen_index) {
            stack_layout.currentIndex = screen_index
        }

        function toggle_menu() {
            menu_animation.running = true

            if (menu.width === 50) {
                menu_button.icon_source = "qrc:/menu_icons/menu_icons/menu_2.png"
            } else {
                menu_button.icon_source = "qrc:/menu_icons/menu_icons/menu.png"
            }
        }
    }

    Rectangle {
        id: main
        color: "#3d3d3d"

        anchors.fill: parent

        Rectangle {
            id: menu
            width: 50
            opacity: 0.478
            color: "#3d3d3d"
            anchors.left: parent.left
            anchors.top: parent.top
            anchors.bottom: parent.bottom
            anchors.leftMargin: 0
            anchors.bottomMargin: 0
            anchors.topMargin: 0
            clip: true

            PropertyAnimation {
                id: menu_animation
                target: menu

                property: "width"
                to: if (menu.width === 50)
                        return 300
                    else
                        return 50

                duration: 500
                easing.type: Easing.InOutQuint
            }

            MenuButton {
                id: menu_button
                onClicked: funtions.toggle_menu()
            }
        }
    }
}

下面是我用来构建应用程序的qmake文件:

######################################################################
# Automatically generated by qmake (3.1) Wed May 3 17:38:34 2023
######################################################################

TEMPLATE = app
TARGET = ModVault
INCLUDEPATH += .

# You can make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# Please consult the documentation of the deprecated API in order to know
# how to port your code away from it.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_UP_TO=0x060000 # disables all APIs deprecated in Qt 6.0.0 and earlier

# Input
SOURCES += src/main.cpp
QT += quick
DESTDIR = ./build
RESOURCES += src/resources.qrc

qrc代码:

<!DOCTYPE RCC>
<RCC version="1.0">
<qresource prefix="/components">
    <file>gui.qml</file>
    <file>components/MenuButton.qml</file>
</qresource>
<qresource prefix="/menu_icons">
    <file>menu_icons/menu.png</file>
    <file>menu_icons/menu_2.png</file>
    <file>menu_icons/home.png</file>
    <file>menu_icons/download.png</file>
    <file>menu_icons/github.png</file>
    <file>menu_icons/repository.png</file>
    <file>menu_icons/update.png</file>
    <file>menu_icons/close.png</file>
    <file>menu_icons/minimize.png</file>
    <file>menu_icons/settings.png</file>
</qresource>
</RCC>

What I Have Tried

我尝试过的事情包括:
1.使用QQuickView代替,但它没有改变任何东西
1.添加了visible: true,但没有更改
1.使用qrc加载qml
其他信息:我正在使用make和qmake来构建应用程序。
我应该怎么做才能解决这个问题?

uemypmqf

uemypmqf1#

我终于找到了答案,这完全是我的错。感谢所有试图帮助我们的人,很抱歉浪费了你的时间。

答案:当我第一次运行这个应用程序时,我得到了这个错误:

"qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found."

我在谷歌上搜索了一下,Github问题的第一个答案是设置这个环境变量:

export QT_QPA_PLATFORM=offscreen

现在我意识到这也会阻止应用程序实际显示。因此,为了解决这个问题,我删除了环境变量,并得到了与以前相同的错误消息,所以我只是通过这样做安装了libxcb-cursor

sudo apt install libxcb-cursor

原来如此。
再次感谢所有试图帮助的人。抱歉浪费了你的时间

相关问题