1

我认为这个问题与设计决定有关(我认为这在某种程度上是错误的),但我更愿意在提交可能的错误报告之前在这里询问。

我有一个 QTextEdit,它继承了父窗口的默认字体颜色的调色板,如果用户想要更改该文本编辑窗口的颜色,该调色板可能会在运行时更改。

虽然这适用于标准文本,但QPalette.Link颜色存在问题:一旦我更改了调色板Text属性,未格式化的文本就会正确更新,但如果我更改Link属性,结果将无法按预期工作。

from PyQt5 import QtWidgets

class Test(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        layout = QtWidgets.QGridLayout(self)
        paletteBtn = QtWidgets.QPushButton('Set palette')
        paletteBtn.clicked.connect(self.selectPalette)

        palette = self.palette()
        palette.setColor(palette.Link, palette.color(palette.Text))
        QtWidgets.QApplication.setPalette(palette)

        self.textEdits = []

        self.baseEdit = QtWidgets.QTextEdit()
        layout.addWidget(self.baseEdit, 1, 0)

        self.preTextEdit = QtWidgets.QTextEdit()
        layout.addWidget(self.preTextEdit, 1, 1)

        self.paletteTextEdit = QtWidgets.QTextEdit()
        layout.addWidget(self.paletteTextEdit, 1, 2)

        self.staticTextEdit = QtWidgets.QTextEdit()
        layout.addWidget(self.staticTextEdit, 1, 3)

        for textEditName in ('baseEdit', 'preTextEdit', 'paletteTextEdit', 'staticTextEdit'):
            textEdit = getattr(self, textEditName)
            self.textEdits.append(textEdit)
            textEdit.setHtml('''
                <html>
                    <body>
                        <b>{}</b><br/>
                        simple text<br/>
                        <a href="link">unformatted link!</a>
                    </body>
                </html>
            '''.format(textEditName))

        self.preTextEdit.document().setDefaultStyleSheet('a {color: green;}')

        layout.addWidget(paletteBtn, 0, 0, 1, layout.columnCount())

    def selectPalette(self):
        palette = self.palette()
        new = QtWidgets.QColorDialog.getColor(palette.color(palette.Text), self)
        palette.setColor(palette.Text, new)
        palette.setColor(palette.Link, new)
        for textEdit in self.textEdits:
            if textEdit == self.paletteTextEdit:
                self.paletteTextEdit.document().setDefaultStyleSheet('a {color: palette(text);')
            elif textEdit == self.staticTextEdit:
                self.staticTextEdit.document().setDefaultStyleSheet('a {{color: rgb{};}}'.format(
                    palette.text().color().getRgb()))
            textEdit.setPalette(palette)
            cursor = textEdit.textCursor()
            cursor.movePosition(cursor.End)
            textEdit.setTextCursor(cursor)
            textEdit.insertHtml('<br/><a href="link">another link!</a>')


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    test = Test()
    test.show()
    sys.exit(app.exec_())

在下图中,您可以看到应用于四种不同方法的起点。调色板(应用于应用程序)是一致的。

开始情况

如果我为调色板选择不同的颜色(TextLink),我希望默认字体颜色链接颜色都将被应用,至少对于那些使用该调色板设置的小部件。不幸的是,这只发生在最后一个使用当前palette.text().color().getRgb()作为文档默认样式表的小部件中,并且它只适用于新锚点。

应用红色

此时,每当我将颜色再次更改为蓝色时,我们都可以期待结果:

应用蓝色

同样,默认文本颜色适用于所有 QTextEdit 小部件,但它仅适用于添加到最后文本编辑的最新链接。

在对所有小部件进行了一些简单toHtml()的检查并浏览了 Qt 源代码之后,我意识到每当添加新的锚点时,实际的 html 代码嵌入锚文本的文本样式(而不是将文本格式保留为默认设置并在指定时覆盖它)。

虽然我可能会提交一份报告,正如开头所写的那样,但我知道在考虑并最终(如果有的话)修复之前需要一些时间。
所以,问题是:我是否遗漏了什么/做错了什么,或者有没有办法避免这种行为并确保所有未格式化的锚点实际上使用小部件(或应用程序)的调色板集?
显然,我不是在谈论手动解析/硬修复现有代码。

4

0 回答 0