推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家: Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

Qt android打开web网页

用Qt在安卓中开发,用到了web网页,这里面,但是安卓没有QWebEngine,等一些库(Qt版本:Qt5.15.2),但是有QtWebView,但是这个只能在qml中使用。所以需要qml和c++混合开发
Qt 安卓环境搭建问题可以参考请移步 《Qt android 开发环境搭建》

Qt c++和qml混合开发

Qt C++和qml混合开发,主要用到了C++和qml之前的通信,之间的数据传递。

Qt android网页代码

测试网页

在安卓下,可以打开网页,进行跳转。

测试代码

主要在安卓下实现一个简易的浏览器功能

实例代码

main.qml

import QtQuick 2.15
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtWebView 1.1
import QtQuick.Layouts 1.1
import QtQuick.Controls.Styles 1.2


Item {
    visible: true
//    title: qsTr("Hello World")
    Rectangle {
        Text {
            text: webView.url
        }
    }

    Connections {
        target: widget
        onSigGo: {
            console.log("url: " + url);
            webView.url = url
            widget.setText(webView.url)
        }

        onSigReflash: {
            webView.reload()
            widget.setText(webView.url)
            console.log("url: " + webView.url)
        }

        onSigForward: {
            webView.goForward()
            widget.setText(webView.url)
            console.log("url: " + webView.url)
        }

        onSigBack: {
            webView.goBack()
            widget.setText(webView.url)
            console.log("url: " + webView.url)
        }

    }

    WebView {
        id: webView
        anchors.fill: parent
        onLoadingChanged: {
            widget.setText(webView.url)
            console.log("url changed: " + webView.url)
            if (loadRequest.errorString)
                console.error(loadRequest.errorString)
        }
    }

}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QtQml/QQmlContext>
#include <QtQuick/QQuickView>
#include <QVBoxLayout>
#include <QTimer>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_pWebView = new QQuickWidget(QUrl("qrc:/main.qml"));
    m_pWebView->setResizeMode(QQuickWidget::SizeRootObjectToView);
    m_pWebView->rootContext()->setContextProperty("widget", this);
    QVBoxLayout *layout = new QVBoxLayout(ui->wgtWeb);
    layout->addWidget(m_pWebView);
    QTimer::singleShot(2000, this, [this](){
        emit sigGo(QUrl::fromUserInput(ui->lineEdit->text()));
    });
}

Widget::~Widget()
{
    delete ui;
}

void Widget::setText(QString url)
{
    ui->lineEdit->setText(url);
}

void Widget::on_btnBack_clicked()
{
    emit sigBack();
}


void Widget::on_btnRefresh_clicked()
{
    emit sigReflash();
}


void Widget::on_btnForward_clicked()
{
    emit sigForward();
}


void Widget::on_btnGo_clicked()
{
    emit sigGo(QUrl::fromUserInput(ui->lineEdit->text()));
}

main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQuickWidget>
#include <QtQuick/QQuickView>
#include <QtQml/QQmlContext>
#include <QtWebView>
#include <QHBoxLayout>
#include "Widget.h"

int main(int argc, char *argv[])
{
    QtWebView::initialize();
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QApplication a(argc, argv);
    Widget w;

    w.show();

    return a.exec();
}

实例运行结果

可以前进,后退,刷新,和转到功能
测试结果

代码下载地址:
链接: https://pan.baidu.com/s/1YcG52wZweMKGwKQVzqHzLQ 提取码: hwfk

参考博客

Qt Quick 之 QML 与 C++ 混合编程详解

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐