【问题标题】:How to render a Jira Issue in Qt Application如何在 Qt 应用程序中呈现 Jira 问题
【发布时间】:2020-09-07 01:50:52
【问题描述】:

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

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

我有点不清楚最好的方法。在我看来,我有两个选择:

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

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

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

如果这不可能,那么以可比较的布局自己呈现问题的最直接方法是什么?

我没有考虑更简单的第三个选项吗?

我将添加免责声明 - 我从事更多桌面应用程序开发,但对 Web 开发的经验有限。因此,我将不胜感激任何我需要在 python/PySide/Qt 之外使用的任何细节。

【问题讨论】:

    标签: python qt pyqt5 jira pyside2


    【解决方案1】:

    正如 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()
    

    【讨论】:

    • 美丽、简单、优雅的解决方案。在我的独立实现中,在最新版本的 PySide2 中完美运行。对我来说,一个不幸的难题是这个应用程序也被嵌入到其他几个 Qt 应用程序中,其中一个(我只是在尝试了这段代码后才知道)使用的是旧版本的 PySide2,它似乎缺少脚本( ) 方法的 QWebEngineProfile (虽然似乎有所有其他组件)。如前所述 - 网络开发不是我的专长,因此对 QWebEngine 不太熟悉 - 你知道是否有旧方法被替换了吗?
    • @stowaway 如果你不告诉我你使用的 PySide2 的版本,那么很难提供帮助
    • 存在问题的应用使用的是 2.0.0~alpha0
    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2016-09-13
    • 1970-01-01
    相关资源
    最近更新 更多