2016-08-19 17 views
0

pyQtのQTextEditにユニコードテキストを表示しようとしています。pyQtとQTextEdit:ユニコード文字が表示されるのはなぜですか?

Mac OSX El CapitanではPython 2.7とPyQt4です。

私はいくつかのQ &を読んでいますが、Python、QString、unicodeについては、次の実行例がありました。

実行すると、2つのユニコード文字列が端末に出力され、メインウィンドウのQTextEditにも表示されます。 最初の文字列は大丈夫です(Q & Aここからstackoverflowでコピーしましたが、実際には英語の意味が分かりません)。 私の端末とQTextEditにすべての文字が正しく表示されています。

しかし、2番目の文字列の絵文字はQTextEditにはありませんが、端末で正しく表示されます。 QTextEditには、 '---'の間に2つの空白があります。空白をQTextEditにコピーして端末に貼り付けると、その絵文字が表示されます。だから、コンテンツはそこにあるようだが、グラフィック表現ではないようだ。

フォントファミリーはMonacoに設定されています。これは開発用に使用するEclipseのテキスト端末のフォントです。 Eclipseはエモーティコンをエディタにも正しく表示します。

だから私は、モナコフォントファミリーが顔文字をサポートすると仮定しました。

どうしたのですか?任意のヘルプ

アーミン

実行例えば

ありがとう:...長さのため申し訳ありませんが、これは既存のコードからこまごまとした中にコピーされたとpyuicは、UIクラスを生成

# -*- coding: utf-8 -*- 
''' 
''' 
# Importing the necessary Qt classes. 
import sys 
import re 
import sip 
import time 

from PyQt4 import QtCore 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

from PyQt4 import QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_Dialog(object): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName(_fromUtf8("Dialog")) 
     Dialog.resize(550, 350) 
    self.ExitButton = QtGui.QPushButton(Dialog) 
    self.ExitButton.setGeometry(QtCore.QRect(420, 310, 100, 35)) 
    self.ExitButton.setObjectName(_fromUtf8("ExitButton")) 
    self.logView = QtGui.QTextEdit(Dialog) 
    self.logView.setGeometry(QtCore.QRect(20, 30, 500, 280)) 
    self.logView.setReadOnly(False) 
    self.logView.setObjectName(_fromUtf8("logView")) 

    self.retranslateUi(Dialog) 
    QtCore.QMetaObject.connectSlotsByName(Dialog) 

def retranslateUi(self, Dialog): 
    Dialog.setWindowTitle(_translate("Dialog", "Dialog", None)) 
    self.ExitButton.setText(_translate("Dialog", "Exit", None)) 

class MainWindow(QMainWindow, Ui_Dialog): 

    # quit 
    def finish(self): 
     quit() 

    def __init__(self): 
     QMainWindow.__init__(self) 

     # set up User Interface (widgets, layout...) 
     self.setupUi(self) 

     # custom slots connections 
     QtCore.QObject.connect(self.ExitButton, QtCore.SIGNAL("released()"), self.finish) 

     self.logView.setFontFamily("Monaco") 

     print("Zażółć gęślą jaźń") 
     print("Xc--") 

     t = QString.fromUtf8("---Zażółć gęślą jaźń---") 
     self.logView.append(t) 

     t = QString.fromUtf8("------") 
     self.logView.append(t) 


     print("family is " + self.logView.fontFamily()) 
     self.logView.append("family is " + self.logView.fontFamily()) 


# Main entry to program. Sets up the main app and create a new window. 
def main(argv): 

    # create Qt application 
    app = QApplication(argv,True) 

    # create main window 
    wnd = MainWindow() # classname 
    wnd.show() 

    # Connect signal for app finish 
    app.connect(app, QtCore.SIGNAL("lastWindowClosed()"), app, QtCore.SLOT("quit()")) 

    # Start the app up 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main(sys.argv) 

答えて

1

あなたが使用しているpythonのsys.maxunicodeの出力は何ですか?それが(1114111ではなく)65535の場合はのpythonビルドを使用しています。これはBMP以外の文字をサポートしていません。

ユニコードコードポイントは128525で、65535は128537で、どちらも65535を超えています。狭いビルドでは、サロゲートペアとして表現されます。これはおそらくQtにはレンダリングする。

PEP-261以降、BMP以外の文字をサポートするPythonの幅広いビルド(--enable-unicode=ucs4オプションを使用)をコンパイルすることができます。 (Python> 3.3の場合、ワイドビルドのみ可能です)。

+0

ありがとうございました。 sys.maxunicodeの出力は実際65535なので、これは私のコードの動作を説明しています。 – arminphys

+0

OK、私はpython3(バージョン3.5.2)をhomebrewでインストールし、sip&pyqtを再インストールし、python3を使用するようEclipseを更新して再試行しました。現在、sys.maxunicodeの出力は1114111ですが、実行例の動作は同じですが、QTextEditの顔文字はありませんが、まだEclipseと端末では、QTextEditから端末に2つの空白をコピーして貼り付けても、ターミナルで。他に何を試すことができますか? – arminphys

+0

@arminphys。 Pythonの幅広いビルドに対してコンパイルされたpyqtをインストールする必要があります。 – ekhumoro

関連する問題