sudo apt устанавливает python3-pyqt5 и другие методы установки apt

#python #python-3.x #pyqt #pyqt5 #qwebview

#python #python-3.x #pyqt #pyqt5 #qwebview

Вопрос:

вот ошибка.

 QWebView is not defined
  

Я следую из учебника PyQt4 по адресу https://wiki .python.org/moin/PyQt/Embedding Widgets in Web Pages .

Я понимаю определение, но что именно я должен определить здесь и где я должен это определить?

Где я должен установить QWebView?

Я знаю, что предоставленная ссылка является примером PyQt4, и я использую PyQt5. Я знаю, что произошли изменения, но я не нашел точно, каким может быть ответ сейчас.

Вот некоторый код:

 import sys
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtGui import *
from PyQt5.QtWebKit import *
from PyQt5.QtWidgets import *

html = 
"""<html>
<head>
<title>Python Web Plugin Test</title>
</head>

<body>
<h1>Python Web Plugin Test</h1>
<object type="x-pyqt/widget" width="200" height="200"></object>
<p>This is a Web plugin written in Python.</p>
</body>
</html>
"""

class WebWidget(QWidget):

    def paintEvent(self, event):
        painter = QPainter()
        painter.begin(self)
        painter.setBrush(Qt.white)
        painter.setPen(Qt.black)
        painter.drawRect(self.rect().adjusted(0, 0, -1, -1))
        painter.setBrush(Qt.red)
        painter.setPen(Qt.NoPen)
        painter.drawRect(self.width()/4, self.height()/4,
                         self.width()/2, self.height()/2)
        painter.end()

    def sizeHint(self):
        return QSize(100, 100)

class WebPluginFactory(QWebPluginFactory):

    def __init__(self, parent = None):
        QWebPluginFactory.__init__(self, parent)

    def create(self, mimeType, url, names, values):
        if mimeType == "x-pyqt/widget":
            return WebWidget()

    def plugins(self):
        plugin = QWebPluginFactory.Plugin()
        plugin.name = "PyQt Widget"
        plugin.description = "An example Web plugin written with PyQt."
        mimeType = QWebPluginFactory.MimeType()
        mimeType.name = "x-pyqt/widget"
        mimeType.description = "PyQt widget"
        mimeType.fileExtensions = []
        plugin.mimeTypes = [mimeType]
        print("plugins")
        return [plugin]

if __name__ == "__main__":

    app = QApplication(sys.argv)
    QWebSettings.globalSettings().setAttribute(QWebSettings.PluginsEnabled, True)
    view = QWebView()
    factory = WebPluginFactory()
    view.page().setPluginFactory(factory)
    view.setHtml(html)
    view.show()
    sys.exit(app.exec_())
  

Ответ №1:

Чтобы использовать QtWebKit, вам необходимо установить пакет python3-pyqt5.qtwebkit . С другой стороны, основным изменением с Qt4 на Qt5 была реорганизация модулей, и это произошло с QtWebKit, который был разделен на QtWebKit и QtWebkitWidgets, поэтому QWebView принадлежит последнему подмодулю:

 import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtWebKit import QWebPluginFactory, QWebSettings
from PyQt5.QtWebKitWidgets import QWebView

html = """<html>
<head>
<title>Python Web Plugin Test</title>
</head>

<body>
<h1>Python Web Plugin Test</h1>
<object type="x-pyqt/widget" width="200" height="200"></object>
<p>This is a Web plugin written in Python.</p>
</body>
</html>
"""


class WebWidget(QWidget):
    def paintEvent(self, event):
        painter = QPainter()
        painter.begin(self)
        painter.setBrush(Qt.white)
        painter.setPen(Qt.black)
        painter.drawRect(self.rect().adjusted(0, 0, -1, -1))
        painter.setBrush(Qt.red)
        painter.setPen(Qt.NoPen)
        painter.drawRect(
            self.width() / 4, self.height() / 4, self.width() / 2, self.height() / 2
        )
        painter.end()

    def sizeHint(self):
        return QSize(100, 100)


class WebPluginFactory(QWebPluginFactory):
    def __init__(self, parent=None):
        QWebPluginFactory.__init__(self, parent)

    def create(self, mimeType, url, names, values):
        if mimeType == "x-pyqt/widget":
            return WebWidget()

    def plugins(self):
        plugin = QWebPluginFactory.Plugin()
        plugin.name = "PyQt Widget"
        plugin.description = "An example Web plugin written with PyQt."
        mimeType = QWebPluginFactory.MimeType()
        mimeType.name = "x-pyqt/widget"
        mimeType.description = "PyQt widget"
        mimeType.fileExtensions = []
        plugin.mimeTypes = [mimeType]
        print("plugins")
        return [plugin]


if __name__ == "__main__":

    app = QApplication(sys.argv)
    QWebSettings.globalSettings().setAttribute(QWebSettings.PluginsEnabled, True)
    view = QWebView()
    factory = WebPluginFactory()
    view.page().setPluginFactory(factory)
    view.setHtml(html)
    view.show()
    sys.exit(app.exec_())
  

Примечание: Поскольку Qt 5.6 QtWebKit больше официально не поддерживается (сообщество поддерживает форк), поскольку он был заменен QtWebEngine, поэтому для использования QtWebKit вы должны использовать официальные репозитории каждого дистрибутива или скомпилировать его вручную. Функциональность QWebPluginFactory не может быть реализована QtWebEngine, поскольку рендеринг выполняется не Qt, а chromium.

Комментарии:

1. Здравствуйте… Я получил страницу, чтобы отразить что-то из этой информации здесь: pywebview. flowrl.com/guide/usage.html#http-server на странице установки.

2. Но да … ничто не работает правильно по сравнению с тем, что было когда-то сделано. Вы правы. Я скоро снова протестирую с помощью PyQt5.QtWebKitWidgets импортирует QWebView.

3. @DeFunct Я не понимаю, какое отношение pywebview имеет к вопросу. Это разные технологии

4. Я не знал о том, что QWebView все еще предлагается. Я изменил технологии, чтобы протестировать вещи.

5. eyllanesc: Здравствуйте, правильный ответ, который вы дали, хороший. Спасибо. Теперь я могу двигаться дальше в своем обучении. Это сильно меня раздражало. В любом случае, удачи. Я поддержал это.