37436


**参考にしたサイト**  
[(本家)レクトを描画できた例](https://stackoverflow.com/questions/19232882/nice-text-
formatting-in-qtextedit-like-qt-creator-does)  
[日本語での説明](http://d.hatena.ne.jp/mrbonze/comment?date=20110417#c)  
**リファレンスの実行手順**  
[PySide Documentation
QTextObjectInterface](https://pyside.github.io/docs/pyside/PySide/QtGui/QTextObjectInterface.html)  
の導入方法をまねしました。  
1.まずTypeを決定。(UserObjectと同値かそれ以上)  
2.`QTextCharFormat.setObjectType()`の引数に1をセット  
3.`QTextObjectInterface`を導入  
4.1で決定したタイプと同じタイプと、3のインスタンスを、  
`QAbstractTextDocumentLayout.registerHandler()`  
に登録。  
5.`QChar.ObjectReplacementCharacter`(`PySide`では`u"\uFFFC"`を、上記`charFormat`で挿入。  
この`ReplacementCharacter`と衝突するたびに`drawObject`と`IntrinsicSize`が呼び出されると書いてありました。

**試作コード**

[code]

    from PySide import QtGui
    from PySide import QtCore
    import sys
    
    class MainWindow(QtGui.QMainWindow):
        def __init__(self,parent=None):
            super(MainWindow,self).__init__(parent=None)
            try:
                self.textedit = TextEdit()  
                self.setGeometry(200,200,500,500)           
                self.setCentralWidget(self.textedit)
            except Exception as e:
                print(54,e)
    class TextEdit(QtGui.QTextEdit):
        def __init__(self,parent=None):
            super(TextEdit,self).__init__(parent=None)
            self.setParent(parent)
            try:
                self.example_charFormat = QtGui.QTextCharFormat()
                self.example_charFormat.setObjectType(QtGui.QTextFormat.UserObject+1)
                self.example_charFormat.setProperty(1,"どうすればいいんだ？")    
                self.fm = TextObjectInterface(self)
                self.document().documentLayout().registerHandler(self.example_charFormat.objectType(),self.fm)                     
            except Exception as e:
                print(106,e)
        def keyPressEvent(self,event):
            try:
                if event.key() == QtCore.Qt.Key_At:                
                    tc = self.textCursor()
                    char = self.example_charFormat
                    char.setBackground(QtCore.Qt.green)
                    tc.insertText("\uFFFC",char)
                    return
                return QtGui.QTextEdit.keyPressEvent(self,event)
            except Exception as e:
                print(65,e)        
    class TextObjectInterface(QtCore.QObject, QtGui.QTextObjectInterface):
        def __init__(self,parent=None):
            super(TextObjectInterface, self).__init__(parent=None)        
        def intrinsicSize(self,doc, posInDocument, charformat):  
            try:            
                print(43)
                tf = charformat
                s = str(charformat.property(1))       
                fn = tf.font()
                fm = QtGui.QFontMetrics(fn)
                return fm.boundingRect(s).size()
            except Exception as e:
                print(33,e)                        
        def drawObject(self,painter,rect,doc,posInDocument,charformat):
            try:            
                print(47)
                s = str(charformat.property(1))
                painter.drawText(rect,s)
                painter.drawRect(rect)       
            except Exception as e:
                print(24,e)      
    def main():
        try:
            QtGui.QApplication([])
        except Exception as e:
            print(65,e)    
        textediter = MainWindow()
        textediter.show()
        sys.exit(QtGui.QApplication.exec_())
    if __name__ == "__main__":
        main()
    
[/code]

しかし、これではインターフェース自体呼び出されませんでした。  
`PySide`で上記のコードが動く方法はあるのでしょうか？どこが間違っているのでしょうか。


CC BY-SA 4.0
2017-08-13T10:24:03.950
37162
2018-08-31T01:02:10.127
2018-08-31T01:02:10.127
24284
24284
question
python python3 qt pyside
QTextObjectInterface PySideでの導入方法について


pyside用のコード(上段)について、2点変更すると動作しないでしょうか?

  1. 以下の箇所の「"\uFFFC"」を「u"\uFFFC"」に変更  
(python 2系ではunicode文字の記載は接頭句として「u」をつけると聞いたので)

[code]     # 修正前

    tc.insertText("\uFFFC",char)
    # 修正後
    tc.insertText(u"\uFFFC",char)
    
[/code]

  2. `TextObjectInterface`の継承元クラスとして[`QPyTextObject`](https://srinikom.github.io/pyside-docs/PySide/QtGui/QPyTextObject.html#qpytextobject)にする。  
(`QPyTextObject`の説明だと`QtCore.QObject`と`QtGui.QTextObjectInterface`を多重継承したクラスとあるので、内容は一緒に見えるのですが、これで試すと`registerHandler`が成功するようです)

[code]     #変更前

    class TextObjectInterface(QtCore.QObject, QtGui.QTextObjectInterface):
    #変更後
    class TextObjectInterface(QtGui.QPyTextObject):
    
[/code]


CC BY-SA 3.0
2017-08-23T10:13:15.490
37436
2017-08-23T10:13:15.490
20098
37162
answer