QWebEngineView添加自定义网址协议UrlScheme

QWebEngineView可以和js交互需要使用QWebChannel,如果不使用的话,js可以请求自定义网址协议,相当于请求服务器,但是不用Qt专门做服务器,不占用系统端口。

如果结合系统自定义URL注册,可以达到访问自定义URL,启动我们的Qt程序,程序里再处理自定义URL网址

1.继承QWebEngineUrlSchemeHandler 创建协议处理类

class AMUrlSchemeHandler : public QWebEngineUrlSchemeHandler
{
    Q_OBJECT

public:
    AMUrlSchemeHandler(QObject *parent);
    ~AMUrlSchemeHandler();


    virtual void requestStarted(QWebEngineUrlRequestJob* pReqJob);
};

2. 在requestStarted编写响应内容

void AMUrlSchemeHandler::requestStarted(QWebEngineUrlRequestJob* pReqJob)
{
    QJsonObject jsonObj;
    jsonObj.insert("requestUrl", pReqJob->requestUrl().toString());
    jsonObj.insert("requestMethod", QString(pReqJob->requestMethod()));
    jsonObj.insert("initiator", pReqJob->initiator().toString());

    if (pReqJob->requestUrl().toString() == "amurl://www.baidu.com")
    {
        if (pReqJob->requestMethod() == "GET")
        {
            jsonObj.insert("result", "GET 0");
        }
        else if (pReqJob->requestMethod() == "POST")
        {
            jsonObj.insert("result", "POST 1");
        }
        else
        {
            pReqJob->fail(QWebEngineUrlRequestJob::RequestDenied);
            return;
        }
    }


    QBuffer* buffer = new QBuffer;
    connect(pReqJob, SIGNAL(destroyed()), buffer, SLOT(deleteLater()));
    buffer->open(QIODevice::WriteOnly);
    QString strJson = QJsonDocument(jsonObj).toJson(QJsonDocument::Indented);
    buffer->write(strJson.toUtf8());
    
from PyQt5.Qt import * from PyQt5.QtWebEngineWidgets import * class WebEngineView(QWebEngineView): def __init__(self): super(WebEngineView, self).__init__() def createWindow(self, QWebEnginePage_WebWindowType): return self class Main(QMainWindow): def __init__(self): super(Main, self).__init__() self.web = WebEngineView() self.setCentralWidget(self.web) self.web.load(QUrl('http://www.baidu.com')) if __name__ == '__main__': app = QApplication([]) win = Main() win.show() app.exec()和代码 from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QLineEdit, QPushButton, QHBoxLayout, QFileDialog from PyQt5.QtWebEngineWidgets import QWebEngineView from PyQt5.QtCore import QUrl class SimpleBrowser(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Simple Browser") # 主窗口部件和布局 central_widget = QWidget() main_layout = QVBoxLayout(central_widget) # 地址栏和按钮布局 url_layout = QHBoxLayout() self.url_input = QLineEdit() self.url_input.returnPressed.connect(self.load_url) # 按下回车键时加载网址 source_button = QPushButton("Source") source_button.clicked.connect(self.load_url) close_button = QPushButton("Close") close_button.clicked.connect(self.close_page) quit_button = QPushButton("Quit") quit_button.clicked.connect(self.quit_app) url_layout.addWidget(self.url_input) url_layout.addWidget(source_button) url_layout.addWidget(close_button) url_layout.addWidget(quit_button) # 添加地址栏和按钮到主布局 main_layout.addLayout(url_layout) # 网页视图 self.web_view = QWebEngineView() self.web_view.load(QUrl("https://www.example.com")) # 默认加载的网页 main_layout.addWidget(self.web_view) # 设置主窗口的中心部件 self.setCentralWidget(central_widget) def load_url(self): """加载输入框中的网址""" url = self.url_input.text() if not url.startswith("http"): url = "http://" + url self.web_view.load(QUrl(url)) def close_page(self): """关闭当前页面""" self.web_view.stop() # 停止加载当前页面 self.web_view.setHtml("") # 清空网页内容 def quit_app(self): """退出应用程序""" QApplication.quit() if __name__ == "__main__": app = QApplication([]) browser = SimpleBrowser() browser.resize(800, 600) browser.show() app.exec_() 代码整理然后放到一起,保存后面这个代码界面设计
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值