gpt4 book ai didi

qt - 使用 ApplicationWindow 时热重载 QML

转载 作者:行者123 更新时间:2023-12-03 22:09:52 24 4
gpt4 key购买 nike

有没有人在使用 ApplicationWindow 时能够热重载所有 QML 文件? ?我发现了一些例子,如 https://qml.guide/live-reloading-hot-reloading-qml/https://www.slideshare.net/ICSinc/how-best-to-realize-a-runtime-reload-of-qml ,但大多数情况下他们使用 Loader并作为 ApplicationWindow需要是根项目,这不起作用(没有窗口出现)只是重新加载所有 QML 内容。

我试过:

ApplicationWindow {
id: window
visibility: "FullScreen"

Shortcut {
sequence: "F5"
context: Qt.ApplicationShortcut
onActivated: {
window.close();
app.loadQml();
}
}
...
}

哪里 app是我在 C++ 端设置的上下文属性,该函数执行以下操作:
void App::loadQml()
{
qml_engine_.clearComponentCache();
// Use "qrc:/Main.qml" for Qt Resource System.
// Use "Main.qml" for file system.
qml_engine_.load(QUrl(QStringLiteral("Main.qml")));
}

这段代码只能工作一次,窗口消失并重新出现,但快捷方式只能工作一次而不能第二次......

任何想法如何实现这一点?

最佳答案

这是我所做的,并且工作正常:
主.cpp:

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "app.h"

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

QApplication app(argc, argv);

QQmlApplicationEngine engine;

App appp;
appp.setEngine(&engine);

engine.rootContext()->setContextProperty("app", &appp);

engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;

return app.exec();
}

应用程序.cpp:
#include "app.h"

App::App(QObject *parent): QObject (parent)
{

}

App::~App(){}

void App::loadQml()
{
m_engine->load(QUrl(QStringLiteral("qrc:/main.qml")));
}

应用程序.h:
#ifndef APP_H
#define APP_H
#include <QObject>
#include <QQmlApplicationEngine>

class App: public QObject
{

Q_OBJECT
public:
App(QObject* parent = Q_NULLPTR);
~App();

Q_INVOKABLE void loadQml();
void setEngine(QQmlApplicationEngine *engine) { m_engine = engine; }

private:
QQmlApplicationEngine* m_engine;
};

#endif // APP_H

主.qml:
import QtQuick 2.11
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.11
import QtQuick.Window 2.11

Window {
id: window
width: 1000
height: 1000
visible: true

Shortcut {
sequence: "F5"
onActivated: {
window.close()
app.loadQml()
}
}
}

关于qt - 使用 ApplicationWindow 时热重载 QML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55147206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com