繁体   English   中英

如何在PySide QLabel中编写指数?

[英]How can I write exponents in a PySide QLabel?

我正在为计算程序编写Qt接口,我想以单位为单位写一个区域(即LaTex输出m^2或m²)。

如果我在此代码中使用特殊的²字符: area_label = QtGui.QLabel("m²") ,它将在GUI中显示以下内容: m²

我怀疑这可能是编码问题,写我要寻找的平方指数的方法是什么?

另一个问题:是否有一种方法可以输出任何未定义为特殊字符的指数(例如m^8 )?

附加信息:我正在使用PySide 1.1.1和Qt 4.7.4开发python 2.7.2。 在Windows 7 SP1中工作,但是我希望我的代码尽可能跨平台。

另外,当我在Windows上工作并且使用法语口音(例如àé )时,我在文件开头使用了以下编码行: # -*-coding:Latin-1 -*

您的编码问题似乎是您传递的是UTF-8字符串,PySide / Qt试图根据您的系统编码来解释该字符串,这与Latin-1兼容(例如cp1252,这是西欧语言的传统Windows默认设置)而不是UTF-8。 您可以很容易地看到这一点:

>>> print u'm\u00b2'.encode('utf-8').decode('latin-1')
m²

PySide可以在任何地方使用unicode字符串。 因此,如果只在各处使用unicode而不是str / bytes ,包括在PySide的接口上使用unicode ,那应该没问题。


有没有一种方法可以输出任何指数,任何没有定义为特殊字符的指数(例如m ^ 8)?

好吧,⁸(U + 2078) 定义为特殊字符,这一点证明了我能够在此处键入的事实。

但是,您将必须编写自己的代码来解析表达式并生成正确的上标字符。

U + 2070至U + 209F中的上标和下标块具有您需要的所有字符,但2和3除外,它们保留在U + 00B2和U + 00B3上与Latin-1兼容的位置。 (某些字体会将U + 2072和U + 2073显示为等效字符,但是这些字体不正确,因此您不应该依赖于此。而且,U + 2071和U + 00B9都显示为1,有些字体可以区分您可能需要打印出整个列表,然后查看哪些列表更适合您。)

将每个数字变成上标的函数如下所示:

def superscript(digit):
    if digit in (2, 3):
        return unichr(0x00B0 + digit)
    else:
        return unichr(0x2070 + digit)

因此,一个非常简单的包装将是:

def term(base, exponent):
    return base + u''.join(superscript(int(digit)) for digit in exponent)

现在:

>>> print term('x', '123')
xⁱ²³

但是,如果您想要更灵活的东西,则可能要生成HTML而不是纯文本。 Qt的最新版本可以直接在QLabel使用HTML。

如果可以从表达式中生成MathML,Latex等,则有一些工具可以从这些格式中生成HTML。

但举一个非常简单的例子:

def term(base, exponent):
    return u'{}<sup>{}</sup>'.format(base, exponent)

打印出来时,它只会显示x<sup>123</sup> ,但是当卡在QLabel (或堆栈溢出答案)中时,它将显示为x 123


我使用以下编码行: # -*-coding:Latin-1 -*

为什么? 如果您完全可以使用UTF-8编辑文本文件,那将使您的生活变得更加轻松。 一方面,Latin-1没有任何上标字符,但是1、2和3,这意味着您将不得不编写u'm\\2074'类的东西,而不仅仅是写u'm⁴'

另外,使用几乎(但不是完全)emacs格式的编码声明也有误导性。 可以使用emacs格式(带有最终的连字符和适当的间距):

# -*- coding: Latin-1 -*-

……或者不:

# coding=Latin-1

无论如何,所有编码行所做的就是告诉Python如何解释字符串文字。 如果创建非unicode文字(不带u前缀),则仍然必须在某些时候对其进行decode 而且,如果您不自己进行解码,PySide将不得不猜测,并且它将猜测您的系统编码(可能是cp1252-上标足够接近Latin-1,但还不够接近UTF-8 )。

因此,要解决所有问题:

  • 如果可能,请使用UTF-8编码。
  • 如果无法使用UTF-8编码,请使用显式Unicode转义或动态生成字符串来处理文字中缺少的Latin-1字符。
  • 使所有文字都变为Unicode。
  • 在代码中尽可能使用Unicode字符串。
  • 如果您确实需要在任何地方使用字节字符串,请对其进行显式编码/解码,而不要让Python / PySide / Qt为您猜测。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM