程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用 PyQt5 渲染 Markdown大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使用 PyQt5 渲染 Markdown?

开发过程中遇到使用 PyQt5 渲染 Markdown的问题如何解决?下面主要结合日常开发的经验,给出你关于使用 PyQt5 渲染 Markdown的解决方法建议,希望对你解决使用 PyQt5 渲染 Markdown有所启发或帮助;

如何在我的 PyQt5 应用程序中呈现降价文件?

Here 我读到@R_660_10675@用 QWebENGIneVIEw 而不是 QTextEdit,因为 QTextEdit 无法呈现外部图像。

有人在评论中引用了 this 示例。然而,它是一个完整的 Markdown 文本编辑器,并且是用 C++ 编写的。我试图将所需的部分翻译成 Python,但我不太明白它是如何工作的。我只需要一个最小的例子。

我现在拥有的是以下内容:

from PyQt5.QtWebChAnnel import QWebChAnnel
from PyQt5.QtWebENGIneWidgets import QWebENGIneVIEw,QWebENGInePage
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
import sys

app = QApplication(sys.argv)

web_Widget = QWebENGIneVIEw()  
webChAnnel = QWebChAnnel()    # ?
page = QWebENGInePage()       # ?
web_Widget.setPage(pagE)      # ? 
my_url = QUrl("/index.HTML")
web_Widget.load(my_url)

# Now somehow replace the placeholder in the loaded HTML page with file contents?

file_url = QUrl("file.md")

# Help 


web_Widget.show()
app.exec_()

解决方法

QTextEdit 从 Qt 5.14 开始可以渲染 Markdown,但正如 OP 指出的那样,它有一个限制:它不能渲染远程图像。所以另一种方法是使用 QWebENGIneView + js 库,如 markdown.js 和marked.js,如官方示例所示。您还可以使用 QNetworkAccessmanager 下载远程 .md 文件。

import os.path
import sys

from PyQt5.QtCore import pyqtProperty,pyqtSignal,QObject,QTextCodec,QUrl
from PyQt5.QtNetwork import QNetworkAccessmanager,QNetworkReply,QNetworkrequest
from PyQt5.QtWebChAnnel import QWebChAnnel
from PyQt5.QtWebENGIneWidgets import QWebENGIneView,QWebENGInePage
from PyQt5.QtWidgets import QApplication

CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))


class Document(QObject):
    textChanged = pyqtSignal(str)

    def __init__(self,parent=NonE):
        super().__init__(parent)
        self.m_text = ""

    def get_text(self):
        return self.m_text

    def set_text(self,text):
        if self.m_text == text:
            return
        self.m_text = text
        self.textChanged.emit(self.m_text)

    text = pyqtProperty(str,fget=get_text,fset=set_text,notify=textChanged)


class DownloadManager(QObject):
    finished = pyqtSignal(str)

    def __init__(self,parent=NonE):
        super().__init__(parent)

        self._manager = QNetworkAccessmanager()
        self.manager.finished.connect(self.handle_finished)

    @property
    def manager(self):
        return self._manager

    def start_download(self,url):
        self.manager.get(QNetworkrequest(url))

    def handle_finished(self,reply):
        if reply.error() != QNetworkReply.NoError:
            print("error: ",reply.errorString())
            return
        codec = QTextCodec.codecForName("UTF-8")
        raw_data = codec.toUnicode(reply.readAll())
        self.finished.emit(raw_data)


def main():

    app = QApplication(sys.argv)

    filename = os.path.join(CURRENT_DIR,"index.html")

    document = Document()
    download_manager = DownloadManager()

    chAnnel = QWebChAnnel()
    chAnnel.registerObject("content",document)

    # remote file
    markdown_url = QUrl.fromUserInput(
        "https://raw.githubusercontent.com/eyllanesc/stackoverflow/master/README.md"
    )
    # local file
    # markdown_url = QUrl.fromUserInput(/path/of/markdown.md)

    download_manager.finished.connect(document.set_text)
    download_manager.start_download(markdown_url)

    view = QWebENGIneView()
    view.page().setWebChAnnel(chAnnel)
    url = QUrl.fromLocalFile(fileName)
    view.load(url)
    view.resize(640,480)
    view.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

index.html

<!doctype html>
<html lang="en">
<meta charset="utf-8">
<head>
  <link rel="stylesheet" type="text/css" href="3rdparty/markdown.css">
  <script src="3rdparty/marked.js"></script>
  <script src="qrc:/qtwebchAnnel/qwebchAnnel.js"></script>
</head>
<body>
  <div id="placeholder"></div>
  <script>
  'use Strict';

  var placeholder = document.getElementById('placeholder');

  var updateText = function(text) {
      placeholder.innerHTML = marked(text);
  }

  new QWebChAnnel(qt.webChAnnelTransport,function(chAnnel) {
      var content = chAnnel.objects.content;
      updateText(content.text);
      content.textChanged.connect(updateText);
    }
  );
  </script>
</body>
</html>
├── 3rdparty
│   ├── markdown.css
│   ├── MARKDOWN-LICENSE.txt
│   ├── marked.js
│   ├── MARKED-LICENSE.txt
│   └── qt_attribution.json
├── index.html
└── main.py

使用 PyQt5 渲染 Markdown

注意:3rdparty文件夹中的文件在the official Qt repository.

大佬总结

以上是大佬教程为你收集整理的使用 PyQt5 渲染 Markdown全部内容,希望文章能够帮你解决使用 PyQt5 渲染 Markdown所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:使用渲染