【问题标题】:Qt QQmlApplicationEngine refuse to display qml codeQt QQmlApplicationEngine拒绝显示qml代码
【发布时间】:2014-07-05 09:28:48
【问题描述】:

我有这个专业文件

QT += qml quick widgets
TARGET = sPassKeeper
include(src/src.pri)
include(qml/qml.pri)
RESOURCES += \
    resources.qrc

在 src pri 和 qml pri 中只有单行 qml.pri

OTHER_FILES += \
    qml/main.qml

src.pri

SOURCES += \
    src/main.cpp

在 main.cpp 中得到了这个代码

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtDebug>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QQmlApplicationEngine engine(QUrl("qrc:/new/prefix1/qml/main.qml"));
    qDebug() << "Ok engine created";
//    Q_UNUSED(engine)
    return app.exec();
}

main.qml

import QtQuick 2.0
import QtQuick.Controls 1.1

ApplicationWindow{
    title: "sPassKeeper"
    Button{
        text: "Hello"
    }
}

结果得到了这个输出

QML 调试已启用。仅在安全的环境中使用。行 引擎创建

没有显示任何内容,并且过程未完成。

【问题讨论】:

    标签: qt qml


    【解决方案1】:

    你错过了这个:

    ApplicationWindow {
        visible: true
    

    Qt Creator 的新项目向导 (New File or Project... &gt; Qt Quick Application) 有一个步骤,您可以在其中选择组件集 (Select Qt Quick Component Set)。如果您选择 Qt Quick Controls(使用 ApplicationWindow 所必需的),Creator 会为您生成正确的代码:

    import QtQuick 2.2
    import QtQuick.Controls 1.1
    
    ApplicationWindow {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
    
        menuBar: MenuBar {
            Menu {
                title: qsTr("File")
                MenuItem {
                    text: qsTr("Exit")
                    onTriggered: Qt.quit();
                }
            }
        }
    
        Text {
            text: qsTr("Hello World")
            anchors.centerIn: parent
        }
    }
    

    【讨论】:

    • 谢谢。你的回答漂亮一点
    【解决方案2】:

    您需要从引擎创建的对象创建 QQuickWindow。这是我项目中关于它的peace of code

      engine.load(QUrl(QString(String_val(_qmlpath))));
      QList<QObject*> xs = engine.rootObjects();
      if (xs.count() == 0) {
        Q_ASSERT_X(false, "Creating C++ runtime", "Your QML file seems buggy");
      }
      QQuickWindow *window = qobject_cast<QQuickWindow*>(xs.at(0) );
      window->showMaximized();
      app.exec();
    

    【讨论】:

    • 很好的答案。谢谢。
    • 对不起,但我不同意这是一个很好的答案。它可能会解决问题,但正确的解决方案要简单得多,也不那么hacky。请看我的回答。
    【解决方案3】:

    如果你想在傻瓜屏模式下显示根对象(WindowApplicationWindow),那么你可以这样做:

    import QtQuick.Window 2.3
    import QtQuick.Controls 2.2
    
    ApplicationWindow {
        visible: true
        visibility: Window.FullScreen
    }
    

    visibility 可能有用的值是:Window.FullScreenWindow.Windowed

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 2023-01-09
      • 2015-11-18
      • 1970-01-01
      • 2015-11-03
      • 2014-09-12
      • 2013-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多