2

每次我QFontDialog.getFont()用来获取字体时,它都会返回相同的QFont对象。

font, ok = QFontDialog.getFont()
print(font)
if ok:
    self.lbl.setFont(font)
print(self.lbl.font())

上面是代码段,下面是结果(我做了不同的选择,但QLabel我得到的字体和我得到的字体getFont()总是一样的)。

/Users/yao/PycharmProjects/QT_test/venv/bin/python /Users/yao/PycharmProjects/QT_test/test/4_2.py
<PyQt5.QtGui.QFont object at 0x10b428748>
<PyQt5.QtGui.QFont object at 0x10b4287b8>
<PyQt5.QtGui.QFont object at 0x10b428748>
<PyQt5.QtGui.QFont object at 0x10b4287b8>

更新

以下是有关我的环境的一些信息:

  • macOS 莫哈韦
  • PyQt5
  • 蟒蛇 3.6

我已经通过@ekhumoro 测试了代码,结果很奇怪:

BEFORE:
  string:.SF NS Text, 13,-1,5,50,0,0,0,0,0
  family:.SF NS Text
   size:13

AFTER:
  string:.SF NS Text, 13,-1,5,50,0,0,0,0,0
  family:.SF NS Text
   size:13
4

2 回答 2

1

更新

这似乎是由仅影响 macOS 的错误引起的:请参阅QTBUG-6071QTBUG-69878。这应该已在 Qt-5.12 中修复,因此您需要确保已安装 Qt5 和 PyQt5 的最新版本才能解决此问题。


下面是一个测试脚本,其中包含我在 Linux 上使用 Qt-5.12.0 和 PyQt-5.11.3 获得的输出截图。如您所见,一切都按预期进行。如果您有不同的行为,您应该编辑您的问题并说明您正在使用的 Qt 和 PyQt 的确切版本、您正在测试的平台,并显示测试脚本的一些示例输出。

测试脚本

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.button = QtWidgets.QPushButton('Change Font')
        self.button.clicked.connect(self.updateLabel)
        self.label = QtWidgets.QLabel()
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.label)
        layout.addWidget(self.button)
        self.updateLabel()

    def updateLabel(self):
        if self.label.text():
            new = QtWidgets.QFontDialog.getFont()[0]
        else:
            new = QtGui.QFont(self.label.font())
        before = self.label.font()
        self.label.setFont(new)
        after = self.label.font()
        text = []
        for font in before, after:
            info = QtGui.QFontInfo(font)
            text.append('BEFORE:' if font is before else 'AFTER:')
            text.append('  string: %s' % font.toString())
            text.append('  family: %s' % info.family())
            text.append('    size: %s' % info.pointSize())
            text.append('')
        text = '\n'.join(text)
        self.label.setText(text)
        print(text)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(800, 100, 500, 100)
    window.show()
    sys.exit(app.exec_())

输出

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

于 2019-02-05T18:00:19.300 回答
0

<PyQt5.QtGui.QFont object at 0x10b4287b8>只为您提供对象在内存中的位置,它基本上是一个内存单元编号,但是是十六进制的。您可以将不同的对象(此处为不同的 QFont 对象)存储在相同的内存空间中。

您可以通过以下方式检查 QFont 对象是否是您选择的对象:

font, ok = QFontDialog.getFont()
print(font.toString())

更新:你能试试下面的代码并告诉我们你得到了什么吗?

import sys
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QLabel, QApplication, QDialog, QVBoxLayout

app = QApplication(sys.argv)

dlg = QDialog()
layout = QVBoxLayout()

for fontname in ["Verdana", "Arial", "Consolas"]:
    widget = QLabel(fontname)
    font = QFont(fontname)
    widget.setFont(font)
    layout.addWidget(widget)

dlg.setLayout(layout)
dlg.show()

r = app.exec_()
于 2019-02-04T10:21:26.030 回答