无法在 Pyqt5 的 Qtext 编辑中使用 jinja2 设置表格的 CSS(文本换行和水平滚动条)

Posted

技术标签:

【中文标题】无法在 Pyqt5 的 Qtext 编辑中使用 jinja2 设置表格的 CSS(文本换行和水平滚动条)【英文标题】:Unable to set CSS of table (text-wrap and horizontal scroll-bar)using jinja2 inside Qtext edit in Pyqt5 【发布时间】:2019-09-24 10:00:40 【问题描述】:

我正在尝试使用 jinja2 在 Qtextedit 中显示一个表格。我的表格包含几个标题,它做了什么,它尝试在单个显示器上一次显示所有标题,因为它将文本包装在表格中。 我尝试添加一个 x-scroll bar 和 white-space: nowrap,但它没有任何区别。

由于 Qtextedit 或任何我无法理解的问题,是否有任何具体问题。这是我正在使用的代码

table = """
                        <style>
                        .table_wrapper
                                        display: block;
                                        overflow-x: auto;
                                        white-space: nowrap;
                                    
                        table 
                            font-family: arial, sans-serif;
                            border-collapse: collapse;
                            width: 100%;
                            overflow-x: auto;
                            border: 1px solid black;
                            table-layout: fixed
                        

                        td 
                            border: 1px solid #dddddd;
                            text-align: center;
                            padding: 8px;
                            white-space: nowrap;
                            width: 100px;

                        
                        th  
                            border: 1px solid #dddddd;
                            text-align: center;
                            padding: 8px;
                            white-space: nowrap;
                            width: 100px;
                          
                        div 
                              overflow: auto;;
                            
                        </style>

                    <div class="table_wrapper">
                        <table border="1">
                            <tr>% for header in headers %<th>header</th>% endfor %</tr>
                            % for row in rows %<tr>
                                % for element in row %<td>
                                    element
                                </td>% endfor %
                            </tr>% endfor %
                        </table>
                    </div>
                        """

【问题讨论】:

Qt 文档:Supported html Subset. 【参考方案1】:

QTextDocument(在 QTextEdit 中呈现的类)仅支持 CSS 2.1,因此您使用的样式可能使用了更高版本的属性,例如“overflow-x”是 CSS3 的一部分。

在这种情况下,一个可能的解决方案是使用 QWebEngineView。

在下面的示例中,我展示了如何在 QTextEdit 和 QWebEngineView 中呈现相同的 html:

from jinja2 import Environment
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets

template = """
<style>
    .table_wrapper
        display: block;
        overflow-x: auto;
        white-space: nowrap;
    
    table 
        font-family: arial, sans-serif;
        border-collapse: collapse;
        width: 100%;
        overflow-x: auto;
        border: 1px solid black;
        table-layout: fixed
    
    td 
        border: 1px solid #dddddd;
        text-align: center;
        padding: 8px;
        white-space: nowrap;
        width: 100px;
    
    th 
        border: 1px solid #dddddd;
        text-align: center;
        padding: 8px;
        white-space: nowrap;
        width: 100px;
    
    div 
        overflow: auto;;
    
</style>

<div class="table_wrapper">
    <table border="1">
    <tr>% for header in headers %<th>header</th>% endfor %</tr>
    % for row in rows %<tr>
        % for element in row %<td> 
            element
            </td>
        % endfor %
        </tr>
    % endfor %
    </table>
</div>"""


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    app.setStyle("fusion")

    headers = "Stack Overflow".split()
    rows = [("col-1", "col-2") for i in range(100)]
    html = Environment().from_string(template).render(headers=headers, rows=rows)

    w = QtWidgets.QSplitter()

    te = QtWidgets.QTextEdit()
    te.setHtml(html)

    view = QtWebEngineWidgets.QWebEngineView()
    view.setHtml(html)

    w.addWidget(te)
    w.addWidget(view)
    w.show()
    sys.exit(app.exec_())

【讨论】:

我还通过设置 QTextedit().setWordWrapMode(False) 找到了相同的解决方法

以上是关于无法在 Pyqt5 的 Qtext 编辑中使用 jinja2 设置表格的 CSS(文本换行和水平滚动条)的主要内容,如果未能解决你的问题,请参考以下文章

CAD命令qtext怎么用?

使用 QText 浏览器打开桌面

PyQt5 - 使用 Line Edit 从编辑窗口更新标签

如何在pyqt5 Python中的行编辑中添加背景文本

PyQt5允许在编辑时选择QListView项

6.20