Qt QWebEngineView在发布但在调试中找不到javascript文件

Posted

技术标签:

【中文标题】Qt QWebEngineView在发布但在调试中找不到javascript文件【英文标题】:Qt QWebEngineView can not find javascript file in release but in debug 【发布时间】:2019-07-05 09:18:11 【问题描述】:

使用带有 QWebEngineView 的 googlemap,我想在 html 文件中添加 myscript.js。它在调试中工作得很好,但在发布时却不行。在发布模式下,找不到 myscript.js 并出现错误 js: Uncaught (in promise) ReferenceError: myscriptNameSpace is not defined

我正在使用 Qt 5.12.2,MSVC 2017

我的 qrc 文件

<RCC>
    <qresource prefix="/">
        <file>html/googlemap.html</file>
        <file>js/myscript.js</file>
    </qresource>
</RCC>

我的 .h 文件

class GoogleMapWebEngine : public QWidget

    Q_OBJECT

public:
    explicit GoogleMapWebEngine(QWidget *parent = nullptr);
    virtual ~GoogleMapWebEngine() override;

protected:
    virtual void wheelEvent(QWheelEvent * event) override;

private:
    Ui::GoogleMapWebEngine *ui;
    QWebEngineView* m_webview;
    QWebChannel* m_webChannel;
;

我的 .cpp 文件

GoogleMapWebEngine::GoogleMapWebEngine(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::GoogleMapWebEngine)

    qputenv("QTWEBENGINE_REMOTE_DEBUGGING", "1234");
    ui->setupUi(this);

    m_webview = new QWebEngineView();
    m_webChannel = new QWebChannel();
    m_webChannel->registerObject("goolemainWindow", this);
    m_webview->page()->setWebChannel(m_webChannel);

    QUrl url = QUrl("qrc:/html/googlemap.html");
    m_webview->setUrl(url);
    ui->verticalLayout->addWidget(m_webview);

我的 googlemap.html 文件

<html>
    <head>
        ...
        <script src="qrc:/js/myscript.js"></script>

        <script type="text/javascript">           
            function initMap()
            
                var
                    mapCenter = [32.794488, -96.780372],
                    mapOptions = 
                        zoom: 18,
                        center: new google.maps.LatLng(mapCenter[0], mapCenter[1]),
                        mapTypeId: google.maps.MapTypeId.SATELLITE

                    ,
                    map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
                    myscriptNameSpace.test();
            
        </script>        
    </head>

    <body ondragstart="return false">
        <div id="map-canvas" />
        <script async defer src="https://maps.googleapis.com/maps/api/js?key=myKey&callback=initMap"></script>
    </body>
</html>

myscript.js

var myscriptNameSpace = 
myscriptNameSpace.test = function()
    alert('test');

预期:必须显示警报消息

当前错误:js: Uncaught (in promise) ReferenceError: myscriptNameSpace is not defined

我的完整源代码在这里:github.com/hunglxtp/googlemapTest

【问题讨论】:

你确定qt真的在页面中加载了“myscript.js”吗?似乎它在您的“myscript.js”中不起作用“myscriptNameSpace”和“.test”之间实际上有一个空格,或者它是一个错字? 是的,在调试中,它运行良好。但在发布时,我怀疑它是否已加载,但我不知道为什么。该空间只是页面上的编辑错误。我编辑了问题并删除了空格 不幸的是,我从未使用过 qt,但我投了赞成票,祝你好运! 谢谢玛贡。 @LEXuanHung:我无法构建您的示例。缺少头文件。我没有Ui::GoogleMapWebEngine。请创建一个可重现的最小示例。 【参考方案1】:

我终于从qt documentation 找到了问题。 我的解决方案是在 .pro 文件中添加:QTQUICK_COMPILER_SKIPPED_RESOURCES += testgooglemapwebengine.qrc

【讨论】:

以上是关于Qt QWebEngineView在发布但在调试中找不到javascript文件的主要内容,如果未能解决你的问题,请参考以下文章

qt.webChannelTransport 在 QWebEngineView 中未定义

QWebEngineView 立即崩溃,尤其是在滚动后 - Qt5.8

如何从 Qt QWebEngineView 获取 HTTP 状态码?

QWebEngineView 触摸滚动

Qt 5.7 - QWebEngineView - 将 HTML 按钮单击事件连接到 C++/Qt 插槽

QT 调用QWebEngineView显示网页