QTextObjectInterface PySideでの導入方法について
参考にしたサイト
(本家)レクトを描画できた例
日本語での説明
リファレンスの実行手順
PySide Documentation QTextObjectInterface
の導入方法をまねしました。
1.まずTypeを決定。(UserObjectと同値かそれ以上)
2.QTextCharFormat.setObjectType()の引数に1をセット
3.QTextObjectInterfaceを導入
4.1で決定したタイプと同じタイプと、3のインスタンスを、
QAbstractTextDocumentLayout.registerHandler()
に登録。
5.QChar.ObjectReplacementCharacter(PySideではu"\uFFFC"を、上記charFormatで挿入。
このReplacementCharacterと衝突するたびにdrawObjectとIntrinsicSizeが呼び出されると書いてありました。
試作コード
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()
しかし、これではインターフェース自体呼び出されませんでした。
PySideで上記のコードが動く方法はあるのでしょうか?どこが間違っているのでしょうか。