如何在 Qt 应用程序中呈现 Jira 问题

How to render a Jira Issue in Qt Application

我正在使用 Jira Python API 并且有一个 PySide2 (Qt5) 应用程序 需要在用户从视图中选择项目。

如果可能,我想在您浏览任何问题时准确显示它的样子,减去问题侧面和顶部的导航栏。屏幕空间是这个应用程序的一个问题,所以这很重要。

我不太清楚执行此操作的最佳方法。在我看来,我有两个选择:

  1. 使用QWebEngineView直接显示URL。但是我目前找不到任何关于如何在没有导航栏的情况下检索 URL 的文档。对我来说,这是最简单的选择,也是更可取的。
  2. 我自己在 QLabelQTextEdit 或一些自定义小部件中呈现问题。

#1 更可取,原因有很多,那么有没有 URL 我可以提供给 QWebEngineView,它可以在没有导航栏的情况下呈现?

from PySide2.QtWebEngineWidgets import QWebEngineView
url = 'https://jira.atlassian.com/browse/JRASERVER-26418'
view = QWebEngineView()
view.load(url)
view.show()

如果这不可能,那么在类似布局中自己呈现问题的最直接方法是什么?

有没有我没有考虑的更简单的第三种选择?

我将添加免责声明 - 我从事更多的桌面应用程序开发,并且在 Web 开发方面的经验有限。因此,我将不胜感激关于我需要在 python/PySide/Qt.

之外使用的任何细节

正如 OP 指出的那样,一种可能的选择是使用 QWebEngineView 并且 javascript 可用于删除导航栏等组件:

from PySide2 import QtCore, QtWidgets, QtWebEngineWidgets


class QJiraViewer(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.view = QtWebEngineWidgets.QWebEngineView()
        self.setCentralWidget(self.view)
        self.resize(640, 480)

        source_code = """
// @include https://jira.atlassian.com/browse/JRASERVER-*

var target = document.getElementById("page");
var e = document.getElementById("header");
e.hidden = true;
if( target != null){
    var observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            var elements = mutation.target.getElementsByClassName("aui-sidebar projects-sidebar fade-in");
            for (var i = 0; i < elements.length; i++) {
                var e = elements.item(i);
                e.hidden = true;
                e.parentNode.removeChild(e);
            }
        });
    });
    var config = {
      childList: true,
      subtree: true
    };
    observer.observe(target, config);
}
"""

        script = QtWebEngineWidgets.QWebEngineScript()
        script.setInjectionPoint(QtWebEngineWidgets.QWebEngineScript.DocumentReady)
        script.setName("remove_elements")
        script.setRunsOnSubFrames(False)
        script.setSourceCode(source_code)
        self.view.page().profile().scripts().insert(script)

    def load(self, url):
        self.view.load(url)


def main():
    import sys

    app = QtWidgets.QApplication(sys.argv)
    view = QJiraViewer()
    view.load(QtCore.QUrl("https://jira.atlassian.com/browse/JRASERVER-26418"))
    view.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()