Qt/pyQt/PySide - 创建打印文档模板

-1 投票
2 回答
1698 浏览
提问于 2025-04-18 08:09


大家好
我是新手,这是我第一个小项目,希望大家多多包容。 我需要为一个文档创建一个布局,这个文档将作为模板,最后会用从数据库收集的数据填充并打印出来。现在还没有创建数据库,所以我先设置了一些本地变量来理清思路。我希望这些小数据能放在非常特定的位置。我查了一下QTextDocument的文档,感觉它是个不错的工具,但我不知道怎么为它创建布局。
如果有人能给点建议,我会非常感激。

编辑:网上关于这个主题的信息不多。虽然我找到了一些资料,这个帖子

这几乎就是我想要的。不过,我有很多变量想放进HTML里,所以“.format”的选项让我觉得有点复杂。有没有人知道更好的解决办法?

2 个回答

0

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当用户点击一个按钮时,我们希望程序能够做出反应。这种情况下,我们就会用到“事件”这个概念。

事件就像是生活中的一些触发点,比如你按下电灯开关,灯就亮了。在编程里,事件可以是用户的点击、键盘输入,或者其他一些动作。当这些动作发生时,程序会“监听”这些事件,并根据预设的规则来执行相应的代码。

为了让程序能够处理这些事件,我们通常会定义一些“事件处理函数”。这些函数就像是专门负责处理某个事件的工作人员。当事件发生时,这些工作人员就会被叫来,执行他们的任务。

总之,事件和事件处理函数是让程序能够对用户的操作做出反应的重要部分。理解这些概念后,你就能更好地控制程序的行为了。

from PyQt4 import QtGui
from PyQt4 import QtWebKit

class DisplayHTML(QtWebKit.QWebView):

    def __init__(self, html, parent=None):
        super().__init__(parent)
        self.setHtml(html)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    html_template = "<html><p>Hello, {first}, how {second} you {third}?</p></html>"
    values_dict = {
        'first': 'Joe',
        'second': 'are',
        'third': 'today',
    }
    html_ready_to_render = html_template.format(**values_dict)
    window = DisplayHTML(html_ready_to_render)
    window.show()
    sys.exit(app.exec_())
1

在Qt中,有很多可以使用HTML的组件。比如QTextDocument和QLabel都可以用。不过在我的项目里,我用了QtWebKit里的QWebView,因为我需要用到表格,我觉得其他组件可能不支持这个功能(不过我现在也不太确定了,如果你需要的话可以查查文档)。

我觉得使用“.format”并不会让人感到困惑,特别是当你用命名参数的时候,这对我来说已经足够用了。用字典来存放参数值也可能会很有帮助。

示例代码:

from PyQt4 import QtGui
from PyQt4 import QtWebKit

class DisplayHTML(QtWebKit.QWebView):

    def __init__(self, html, parent=None):
        super().__init__(parent)
        self.setHtml(html)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    html_template = "<html><p>Hello, {first}, how {second} you {third}?</p></html>"
    values_dict = {
        'first': 'Joe',
        'second': 'are',
        'third': 'today',
    }
    html_ready_to_render = html_template.format(**values_dict)
    window = DisplayHTML(html_ready_to_render)
    window.show()
    sys.exit(app.exec_())

补充一下:你不需要为了做这么简单的事情而创建一个新类,只需使用QWebView()并调用setHtml()就可以了……

撰写回答