QWebEngineView: отображение хода загрузки

Я использую виджет QWebEngineView с PyQt5 и Python 3.6. Я хочу показать прогресс, когда страница загружается. В демонстрационных целях я просто делаю это с помощью операторов печати (позже я хочу, чтобы виджет индикатора выполнения отображался, показывал прогресс и исчезал, когда закончите).

Я подключился к событиям loadStarted, loadProgress, loadFinished.

Код выглядит следующим образом (self.browser — это виджет QWebEngineView):

def loadStartedHandler(self):
    print(time.time(), ": load started")

def loadProgressHandler(self, prog):
    print(time.time(), ":load progress", prog)

def loadFinishedHandler(self):
    print(time.time(), ": load finished")

# ....

self.browser.loadStarted.connect(lambda: self.loadStartedHandler())
self.browser.loadProgress.connect(lambda: self.loadProgressHandler(42))
self.browser.loadFinished.connect(lambda: self.loadFinishedHandler())

Теперь, конечно, вместо числа 42 я хотел бы получить фактическое значение прогресса события loadProgress. Как мне это получить?

Извините, если этот вопрос глуп. Я новичок, и я просто не могу перевести его на Python из документации C++. (К сожалению, я не могу найти приличную документацию по Python для Qt.)


person petro4213    schedule 28.06.2018    source источник


Ответы (1)


Нет необходимости передавать лямбду, вы можете подключить ее напрямую, используя новый синтаксис подключения:

def loadStartedHandler(self):
    print(time.time(), ": load started")

def loadProgressHandler(self, prog):
    print(time.time(), ":load progress", prog)

def loadFinishedHandler(self):
    print(time.time(), ": load finished")

   ....

    self.browser.loadStarted.connect(self.loadStartedHandler)
    self.browser.loadProgress.connect(self.loadProgressHandler)
    self.browser.loadFinished.connect(self.loadFinishedHandler)

Пример:

import sys
import time

from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self):
        super(Widget, self).__init__()
        lay = QtWidgets.QVBoxLayout(self)
        self.browser = QtWebEngineWidgets.QWebEngineView()
        lay.addWidget(self.browser)
        self.browser.setUrl(QtCore.QUrl("https://www.google.com"))
        self.browser.loadStarted.connect(self.loadStartedHandler)
        self.browser.loadProgress.connect(self.loadProgressHandler)
        self.browser.loadFinished.connect(self.loadFinishedHandler)

    @QtCore.pyqtSlot()
    def loadStartedHandler(self):
        print(time.time(), ": load started")

    @QtCore.pyqtSlot(int)
    def loadProgressHandler(self, prog):
        print(time.time(), ":load progress", prog)

    @QtCore.pyqtSlot()
    def loadFinishedHandler(self):
        print(time.time(), ": load finished")

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    view = Widget()
    view.show()
    sys.exit(app.exec_())
person eyllanesc    schedule 28.06.2018
comment
@eyllanesc Может ли функция loadProgressHandler() принимать дополнительные аргументы? Честно говоря, я уже пробовал это безуспешно... поэтому я пытаюсь найти правильный способ сделать это (если это вообще возможно). - person SilSur; 04.06.2019
comment
@eyllanesc Я хочу предоставить 3 внешних аргумента, которые являются входными данными для вторичной функции, которая выполняется только тогда, когда prog == 100 !! Я не знаю, как еще это объяснить - MRE, который у меня есть, недостаточно минимален (короткий), чтобы я мог публиковать его здесь. - person SilSur; 04.06.2019
comment
@eyllanesc Я только что провел рефакторинг кода, и ваше предложение участника класса работает на 100% !! Не знаю, почему я не увидел эту логику раньше?! Думаю, слишком много занятий... В любом случае спасибо. - person SilSur; 04.06.2019