标签: qtwebengine

在QtWebEngine中处理下载

我们目前正在将项目从一个项目迁移QtWebkitQWebEngine.但是,处理下载会引起一些麻烦.以前我们使用QWebPage::unsupportedContent信号处理这个,如下所示:

QWebPage* webPage = new QWebPage(this);

QObject::connect(webPage, &QWebPage::unsupportedContent, [] (QNetworkReply* reply) {
    // do stuff with the reply
    reply->readAll();
});
Run Code Online (Sandbox Code Playgroud)

使用时QtWebEngine,我唯一能想到的是使用QWebEngineView::urlChanged信号向服务器发出请求,我甚至不确定这是否有效.

QNetworkAccessManager* accessManager = new QNetworkAccessManager(this);
QWebEngineView* webView = new QWebEngineView(this);

QObject::connect(webView, &QWebEngineView::urlChanged, [=] (const QUrl& url) {
    if (url.path().endsWith("some_endpoint_which_results_in_a_download") {
        QNetworkReply* reply = accessManager->get(url);
        // do the same stuff to the reply
        reply->readAll();
    }
})
Run Code Online (Sandbox Code Playgroud)

显然,这种方法非常有限,因为导致下载的端点必须硬编码到应用程序中.但是,我看不出更好的解决方案.谁有人想出更好的东西?

- 更新 -

Qt的5.5发布计划中的文档概述了开发人员对Web缓存和cookie的控制的其他改进,以下功能.

添加了用于管理文件下载的API

5.5 beta计划于2015年4月9日发布,最终发布于2015年5月26日.

为了防止任何进一步的头部创伤,可能值得等待这些改进.

话虽如此,如果有人的话,我仍然会对我的清洁解决方案感兴趣.

c++ qt qt5.4 qtwebengine

30
推荐指数
1
解决办法
3202
查看次数

QWebView或QWebEngineView

今天开始新项目(好吧,不是今天,但是在一两周内),应该使用什么?QWebView或QWebEngineView?

这两者之间是否有任何功能差异?如果我理解正确,QWebView是webkit,而QWebEngineView是闪烁的.程序员有什么不同吗?最重要的是,是否提供了更多的外观和感觉定制?

PS:如果有人链接到比较这两者的文章,我们将不胜感激

qt qtwebkit qt5 qt5.4 qtwebengine

26
推荐指数
2
解决办法
3万
查看次数

QtWebEngine调试

最近Qt介绍了该QtWebEngine模块.有没有办法调用开发人员工具并在里面调试JavaScript代码QWebEngineView?有可能QWebView使用

page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
Run Code Online (Sandbox Code Playgroud)

但我找不到任何类似的选项QWebEngineView.

c++ qt qtwebengine

21
推荐指数
2
解决办法
9653
查看次数

QT QWebEnginePage :: setWebChannel()传输对象

I'm using the QT WebEngine framework to display web pages. I'm injecting javascript into a page when it loads, and want to allow the javascript to be able to access a QT object. Apparently, to do this a QWebChannel must exist that establishes some IPC between chromium (the javascript) and the rest of my C++/QT project. I came across the QWebEnginePage::setWebChannel (QWebChannel*channel) function, however I can't find any examples of its use. The documentation (http://doc.qt.io/qt-5/qwebenginepage.html#setWebChannel) mentions that qt.webChannelTransport …

c++ qt qtwebengine qt5.5

12
推荐指数
1
解决办法
7464
查看次数

QByteArray通过QWebChannel在Javascript中看作是一个String

使用QWebChannel从QtWebKit迁移到QtWebEngine.

我有一个可调用的函数,它将QVariant对象发送到Javascript,它被视为JSON对象.因此,一个QString变成了string,一个QInt一个int,等等.

在没有QWebChannel的情况下使用QtWebKit,QByteArray被视为a Uint8ClampedArray,但现在直接转换为string使用UTF-8(我的QByteArray不是:())

我做错什么了吗 ?我该怎么办 ?

这是相关的代码部分:

//Qt Window class signal to javascript
void MyWindow::uplink(Response msg)
{
    emit _nativeToJs(msg->toJson());
}



//Response class toJson() method
QVariantMap Response::toJson() const
{
    QVariantMap map;

    map["id"] = m_id; //qulonglong
    map["src"] = QString(m_src);
    map["dst"] = QString(m_dst);
    map["status"] = m_status; //qint16
    map["result"] = m_result; //QVariant, can be a map of string, arrays, etc

    return map;
}


//Javascript 

var foo;
new QWebChannel(qt.webChannelTransport, function(channel) {
    //we connect …
Run Code Online (Sandbox Code Playgroud)

javascript qbytearray qtwebengine

12
推荐指数
1
解决办法
585
查看次数

Protobuf版本与Qt冲突

我正在尝试使用带有Qt 5.9.1的protobufs v 3.3.2.这适用于一些Qt应用程序,但仅限于它们是命令行程序.一旦我用Qt和protobufs创建GUI应用程序,我就会收到此错误:

[libprotobuf FATAL /home/mkraus/Documents/dev/star385/build/linux-desktop-debug-libs/protobuf/src/src/google/protobuf/stubs/common.cc:78] 该程序是针对2.6版编译的. Protocol Buffer运行时库中的1,与安装的版本(3.3.2)不兼容. 请与程序作者联系以获取更新.如果您自己编译了程序,请确保您的标题来自与链接时库相同的Protocol Buffers版本.("/build/mir-ui6vjS/mir-0.26.3+16.04.20170605/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc"中的版本验证失败.)

我应该澄清一下,我的部分代码肯定是使用版本3.3.2(我从git源下载和编译protobufs并静态链接).查看下面的堆栈跟踪,看看Qt正在引用的东西导致protobuf版本不匹配.

我正在开发Ubuntu 16.04并使用默认的桌面环境(Unity).

变通

我的故障排除揭示了这些症状和解决方法:

  • 使用KDE/KUbuntu.登录时更改桌面环境可以完全避免版本不匹配问题.

  • 运行Qt应用程序-platform eglfs.这使用OpenGL以全屏模式运行应用程序.程序运行,但窗口大小不正确.使用该-platform eglfs选项时,它甚至可以在Unity中运行,但如果没有此选项,它会给我上述错误.

  • 任何Qt应用程序都是命令行应用程序(使用QCoreApplication而不是QGuiApplication)可以使用protobufs 3.3.2.更改同一个应用程序以使用GUI会导致版本不匹配问题.

问题

如何在Qt GUI应用程序中使用protobufs 3.3.2,还不依赖于正在使用的桌面环境?Qt是否正在使用protobufs的2.6.1版本,如果是这样,编译Qt以使用protobufs 3.3.2是否可行?

调试信息

这是一个堆栈跟踪(程序在启动时几乎立即崩溃):

terminate called after throwing an instance of 'google::protobuf::FatalException'
  what():  This program was compiled against version 2.6.1 of the Protocol Buffer runtime library, which is not compatible with the installed version (3.3.2).  Contact the program author for an update.  If you compiled the program yourself, make …
Run Code Online (Sandbox Code Playgroud)

c++ ubuntu qt protocol-buffers qtwebengine

12
推荐指数
1
解决办法
2248
查看次数

如何将人工QKeyEvent发送到QWebEngineView?

上下文:我正在创建一个带有自定义屏幕键盘的小型Web浏览器.

它与Qt WebKit(QWeb*类)的工作几乎没有关系,但是WebKit中存在错误导致的崩溃...在Qt 5.4.0之后将无法修复,因为它们正在转向Qt WebEngine.

所以我决定将这些东西移到Qt WebEngine(QWebEngine*类),遵循简短的webkit-> webengine过渡指南.在警告部分之后QWebElement,我一直在展示/隐藏屏幕键盘(现在需要运行异步.JS代码).但我正在摸索如何将人工关键事件发送到网页.

我试过一些东西:

  • QCoreApplication::postEvent(m_webview, event)什么都不做,当它与旧的QWeb东西一起工作;
  • 可以通过运行JavaScript来发送密钥,但我觉得这太脏了

谢谢,

c++ qt qwebview qtwebengine

10
推荐指数
1
解决办法
2008
查看次数

QtWebEngine - 同步执行JavaScript以读取函数结果

我在我的一个C++类中使用以下方法(使用QtWebEngine):

    QString get()
    {
        QString result;

        view->page()->runJavaScript("test();", [this](const QVariant &v)
            {
                result = v.toString();
            });

        return result;
    }
Run Code Online (Sandbox Code Playgroud)

它是执行test()JS函数并返回此调用的结果.

不幸的是,回调是异步的,程序崩溃了.我怎样才能使它工作?

c++ qt multithreading callback qtwebengine

10
推荐指数
1
解决办法
4056
查看次数

如何从Qt 5.5 git源构建qtwebengine

我已按照本页上的说明从Git构建Qt 5,从源代码构建Qt 5.5.源位于"〜/ qt5_source_built/qt5",Qt 5.5构建的系统位于"〜/ qt5_source_built/qt5.5-build"中.我使用了以下配置选项:

~/qt5_source_built/qt5/configure -developer-build -opensource -no-gtkstyle -nomake examples -nomake tests
Run Code Online (Sandbox Code Playgroud)

然后使用"make -j4"构建qt-5.5系统.系统构建正常.

我使用CMake为Qt 5.5构建的系统开发应用程序.它适用于通常的情况(例如可以使用qtwebkit).但是,当我想在新应用程序上测试qtwebengine模块时,我发现在"〜/ qt5_source_built/qt5.5-build/qtbase"目录下似乎没有qtwebengine包含文件和库文件.

我试图使用不同的目标重新制作系统:

make all -j4

make module-qtwebengine -j4

make module-qtwebengine-all -j4
Run Code Online (Sandbox Code Playgroud)

但控制台一直在输出

... Nothing to be done for ...
Run Code Online (Sandbox Code Playgroud)

重新制作后,仍然无法在"〜/ qt5_source_built/qt5.5-build/qtbase"目录下找到qtwebengine include和库文件.

我注意到qtwebengine源文件似乎可以在"〜/ qt5_source_built/qt5/qtwebengine/src"中找到,但我无法使用"make"命令构建它.

我刚刚错过了构建目录下的qtwebengine include和库文件吗?如果没有,有谁知道如何使用这个Qt 5.5 git源构建qtwebengine?

谢谢你的任何建议.

qt qt5 qtwebengine

9
推荐指数
1
解决办法
6831
查看次数

从QWebEngineView或QWebEnginePage中删除ScrollBars

有没有办法删除滚动条,QWebEngineView或者我可以以某种方式访问​​它的ScrollArea?

使用webkit就像它一样简单

WebView->page()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);
WebView->page()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
Run Code Online (Sandbox Code Playgroud)

但我没有在QWebEngine中看到任何类似的功能.我甚至没有在qwebengine来源中看到任何滚动区域.有什么东西我不见了吗?

更新:我想我可以尝试强制滚动条从某些通过页面传递给铬的CSS设置中消失

qt qt5 qtwebengine

9
推荐指数
2
解决办法
3931
查看次数