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
で上記のコードが動く方法はあるのでしょうか?どこが間違っているのでしょうか。