【自分用】 Qt Detailed Description翻訳

自分用。なんせセンター英語64点叩き出した人間だから、他の人はこれを読まずに原文読んだほうがいいと思われる。

QTextDocument

QTextDocumentクラスはQTextEditを使うとき編集表示が出来るフォーマットのテキストを保持します。

もしテキストを視覚効果処理したりリストやテーブル、フレーム、画像のような様々な種類のドキュメントをサポートする場合、QTextDocumentはリッチテキストで構築されたのドキュメントを含みます。They can be created for use in a QTextEdit, or used independently.

それぞれのドキュメントの要素は関連したフォーマットオブジェクトによって描写されます。それぞれのフォーマットオブジェクトはQTextDocumentごとにユニークなオブジェクトとして扱われ、それに適応するドキュメントの要素を得るためにobjectForFormat()に通すことができます。

QTextDocumentはQTextCursorを使ってプログラムチックに編集することができ、its contents can be examined bu traversing the document structure.ドキュメント全体の構造はrootFrame()を使うと見ることが出来るルートフレームを根にしたドキュメントの要素のヒエラルキーのように保存されている。あるいはまた、もしあなたがちょうどドキュメントの原文全体をイテレーターにかけたいなら、あなたはbegin(),end(),findBlock()を使うことが出来る。

ドキュメントのレイアウトはdocumentLayout()によって決定される。もしあなたがあなた自身のレイアウトロジックを使いたいならば、あなた自身のQAbstractTextDoxumentLayoutのサブクラスを作りそれをsetDocumentLayout()でセットすることができます。ドキュメントのタイトルと他のメタ情報はmetaInformation()を呼ぶことによって得ることができます。For documents that are exposed to users through the QTextEdit class, the document title is also available via the QTextEdit.documentTitle() function.

toPlainText()とtoHtml()の便利な関数はあなたにプレインテキストとHTMLのドキュメントのコンテンツを取ってくることを許可します。ドキュメントのテキストはfind()を使って検索することができます。

ドキュメント上で実行されるUndo/redoの操作はsetUndoRedoEnabled()を使うことでコントロールすることができます。Undo/redoの機構はundo()、redo()スロットを通してエディタウィジットごとにコントロールできます。ドキュメントはundo/redoの機構の状態についてコネクトされたエディタウィジットに通知するcontentsChanged(),undoAvailable(),redoAvailable()シグナルも提供しています。以下はQTextDocumentのundo/redo操作について:

  1. 文字の挿入または削除。いくつかのテキストブロックで行われた一連の挿入または削除はひとつのundo/redo操作としてみなされます。
  2. テキストブロックの挿入または削除。一つの操作(例えばテキストの選択からの削除)中での一連の挿入または削除はひとつのundo/redo操作としてみなされます
  3. Text character format changes.
  4. Text block format changes.
  5. Text block group format changes.

QPlainTextDocumentLayout

QPlainTextDocumentLayoutクラスはQTextDocumentの為にプレーンテキストレイアウトを提供します。

QPlainTextDocumentLayoutはQPlainTextEdit内で表示したり編集したり出来るテキストドキュメントのために必要とされます。See QTextDocument.setDocumentLayout().

QPlainTextDocumentLayoutはQTextDocumentが要求するQAbstractTextDocumentLayoutのAPIを使いますが、プレインテキストをより良くサポートするために一部再定義されています。For instances, it does not operate on vertical pixels, but on paragraphs(called blocks) instead.ドキュメントの高さはそれが含むパラグラフの数に一致する。レイアウトもまたテーブルやネストしたフレームに対応していませんし、シンタックスハイライトを使ったパラグラフのリスト以上の何らかの種類の進んだテキストレイアウトには対応していません。

QAbstracttextDocumentLayout

QAbstracttextDocumentLayoutはQTextDocumentのためのインプリメントカスタムレイアウトとして用いられる抽象的なベースクラスです。

Qtによって提供される標準のレイアウトはインラインの画像・リスト・テーブルを含んだシンプルなワードプロセッサです。

ワードプロセッサやDTPアプリケーション等のいくつかのアプリケーションはQtレイアウトエンジンによって提供される物以上の機能を必要とするかもしれません、その場合あなたはカスタマイズされたレイアウトの振る舞いを提供するQAbstratTextDocumentLayoutのサブクラスを用いることができます。

QAbstractTextDocumentLayoutのサブクラスのインスタンスはsetDocumentLayout()を用いてQTextDocumentオブジェクトにインストールすることができます。

あなたはQTextDocumentにカスタムオブジェクトを挿入することができます。QTextObjectInterfaseクラスのdescription for detailsを見てください。

QTextObjectInterface

QTextObjectInterfaceはQTextDocumentの中のカスタムテキストオブジェクトの描写を許可します。

テキストオブジェクトはテキストドキュメントの中のひとつ以上の要素の構成物を表現します。例えばHTMLからインポートされた画像はテキストオブジェクトを使ってインプリメントされます。テキストオブジェクトはドキュメントがレンダリングされるときそのエレメントをどのようにレイアウトし描写するかを知っています。

QtはQTextCharFormatを使ってカスタムオブジェクトタイプを登録することによってドキュメントの中にカスタムテキストオブジェクトを挿入することができます。QTextObjectInterfaceも必ずこのタイプのためにインプリメントされそのドキュメントのQAbstractTextDocumentLayoutを使って登録されます。QTextDocumentをレンダリングする間にオブジェクトタイプに遭遇するときそのインターフェースのintrinsicSize()とdrawObject()が呼ばれます。

以下のリストはドキュメントの中にカスタムテキストオブジェクトを挿入するステップを説明します。

  1. オブジェクトタイプを選んでください。そのオブジェクトタイプはQTextFormat.UserObjectとイコールかより大きい値を持った整数です。
  2. Create a QTextCharFormat object and set the object type to the chosen type using the setObjectType() function.
  3. QTextObjectInterfaceをインプリメントしてください
  4. QAbstractTextDoxumentLayout.registerHandler()をあなたのオブジェクトタイプを登録するためにQQTextObjectInterfaceのサブクラスのインスタンスを用いて呼んでください
  5. QChar.ObjectReplacementCharacterを前述の選ばれたオブジェクトタイプのQTextCharFormatと共にそのドキュメントの中に挿入してください。QTextObjectInterfaceのintrinsicSize()とdrawObject()はその入れ替えられた文字に出会うごとのパラメータのQTextFormatと共にその時呼ばれるでしょう。

テキストオブジェクトをインプリメントしたクラスはQObjectとQTextObjectInterfaceを共に継承する必要があります。QObjectは必ず最初に継承されなければなりません。以下例

class SvgTextObject : public QObject, public QTextObjectInterface
{
Q_OBJECT
Q_INTERFACES(QTextObjectInterface)
}

テキストオブジェクトのデータはいつもQTえxtCharFormat.setProperty()を使うQTextCharFormatの中に保存され、QTextCharFormat.property()を使って取り出すことができます。

警告:コピー&ペーストの操作はカスタムオブジェクトを無視します。

QTextCharFormat

QTextCharFormatクラスはQTextDocument内の文字のためのフォーマット情報を提供します

ドキュメント内のテキストの文字フォーマットはハイパーテキストドキュメント内の役割についての情報と言うよりもむしろテキストの視覚属性を指す。

使うフォントはsetFont()に供給することによってセットすることが出来、each aspect of its appearance can be adjusted to give the desired effect.setFontFamily()とsetFontPointSize()はそのフォントファミリー(Timesなど)とプリントサイズを定義します。setFontWeight()とsetFontItalic()はフォントのスタイル全般のコントロールを提供します。setFontUnderline(), setFontOverline(), setFontStrikeOut(), setFontFixedPitch()はテキストのための追加のエフェクトを提供します。

カラーはsetForeground()を使ってセットします。もしテキストがハイパーリンクのためのアンカーとして利用する目的ならばsetAnchor()を使うことで可能です。setAnchorHref()とsetAnchorNanems()はハイパーリンクの行き先とアンカーの名前についての情報を指し示すのに使われます。

QTextObject

The QTextObject class is a base class for different kinds of objects that can group parts of a QTextDocument together.

テキストオブジェクトに分類される一般的なものはリスト(QTextList)、フレーム(QTextFrame)、テーブル(QTextTable)です。テキストオブジェクトは関連付けられたformat()とdocument()を持っています。

テキストオブジェクトには主に2つの種類が存在します。ブロックを用いたものと文字列を用いたものです。一つ目はQTextblockGroupに由来2つ目はQTextFrameに由来します。

あなたは稀にこのクラスを直接使う必要があるでしょう。カスタムテキストオブジェクトを作るときに、あなたはまたテキストオブジェクトを作るための生成メソッドの役割を果たすQTextDocument.createObject()をリインプリメントする必要があるでしょう。

QTextFormat

QTextFormatはQTextDOcumentのためのフォーマット情報を提供します、

QTextFormatはQTextDocumentの一部のフォーマットを記述するために使われる一般的なクラスです。これを元にしたクラス(QTextCharFormat,QTextBlockFormat,QTextListFormat,QTextTableFormat)は必ずより便利でドキュメントの一部に扱われたフォーマットを記述します。

フォーマットはすることの出来るテキストアイテムの種類を指し示すFormatTypeを持ちます。例えばテキストのブロック・リスト・テーブル等。フォーマットは様々なプロパティ(some specific to particular format types)を持ち、as described by the Property enum.どのプロパティもPropertyと一致しています。

フォーマットタイプはtype()によって得られ、そのフォーマットはisCharFormat(),isBlockFormat(),isListFormat(),isTableFormat(),isFrameFormat(),isImageFormat()でテストすることができます。もしタイプが決定したならば、toCharFormat(),toBlockFormat(),toListFormat(),toTableFormat(),toFrameFormat(),toImageFormat()を使って得ることができます。

フォーマットのプロパティはsetProperty()を使ってセットすることができ、boolProperty(),intProperty(),doubleProperty(),stringProperty()で得ることができます as appropriate. フォーマットの中で使われたすべてのプロパティIDはallPropertyIds()で得ることができます。merge()を使うことで一つのフォーマットを別のフォーマットにマージすることができます。

フォーマットオブジェクトのインデックスはsetObjectIndex()でセットすることができ、objectIndex()で取り出すことができます。それらのメソッドはQTextObjectとそのフォーマットの関連付けに使われます。It is used to represent lists, frames, and tables inside the document.

QTextLine

QTextLineはQTextLayout内のテキストの一つのラインを表します。

テキストラインは通常QTextLayoutcreateLine()を使って作られます。

After being created, the line can be filled using the setLineWidth() or setNumColumns() functions. ラインはそれが占めている領域を含んだ多くの属性を持っています。rect(),それと一致するx(),y(),そのtextLength(),width(),naturalTextWidth(),ascent(),decent()。そのラインに基づいたカーソルの位置はcursorToX()から利用可能で、xToCursor()からその逆が利用可能です。ラインはsetPosition()で動かすことが可能です。

最も気楽にブログを書ける環境とは

JavaScript + XMLで動作するブログシステム「FeedBlog Script」 - MOONGIFT|オープンソース・ソフトウェア紹介を軸としたITエンジニア、Webデザイナー向けブログ

Dropboxのスペースを利用してブログが公開できる「Calepin」 | Blog.IKUBON.com

Qt資料(主にPyQt)

サンプルとか詰まりどころの解決法を検索から探そう見つけようとすると、PyQtだけでなくてQtとかRubyでの実装とかPySideとかも含めて調べないとあんまり見つからない。詰まりどころに関してはリファレンスをしっかり読めば大体は解決するけど、読むスピードが足りなかったり意味がよく理解できなかったりで一つのことで一日潰れたりする。

PyQt

Qt-Ruby

Qt

PyQt テキストエディタ試作

f:id:togari_takamoto:20120320163442p:plain
現時点では、D&Dでファイル開く、行番号表示、タブ表示、ファイル終端表示(EOF)のみ

#encoding:utf-8
import sys
from see import see
from PyQt4 import QtGui,QtWebKit,QtCore
class Main(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.resize(800, 500)
        self.setAcceptDrops(True)
        self.setWindowTitle("CuteEditor")
        self.editor = Editor()
        self.openAction = QtGui.QAction('&Exit', self)
        self.openAction.setShortcut('Ctrl+F')
        self.menubar = self.menuBar()
        self.fileMenu = self.menubar.addMenu("ファイル")

        self.statusBar()
        self.fileMenu.addAction(self.openAction)
        self.setCentralWidget(self.editor)
    def dragEnterEvent(self, e):
        if e.mimeData().hasUrls():
            e.accept()
        else:
            e.ignore()
    def dropEvent(self, e):
        print("c")
        for u in e.mimeData().urls():
            p = u.toLocalFile()
        self.fileOpen(p)
    def fileOpenByDialog(self,e):
        p = QtGui.QFileDialog.getOpenFileName(self ,"テキストを開く", "/Users/", "All (*)" )
        self.fileOpen(p)
    def fileOpen(self,filePath):
        with open(filePath,"r") as f:
            self.editor.setPlainText(f.read())

class Editor(QtGui.QTextEdit):
    def __init__(self, parent=None):
        super(Editor,self).__init__(parent)
        self.setViewportMargins(self.fontMetrics().width("8")*8,0,0,0)
        self.side = QtGui.QWidget(self)
        self.side.installEventFilter(self)
        self.side.setGeometry(0,0,self.fontMetrics().width("8")*8,self.height())
        self.setAcceptDrops(False)
    def paintEvent(self,e):
        super(Editor,self).paintEvent(e)
        self.drawEOF()
        if self.side.height() == self.height():
            num = 1
        else:
            num = 0
        self.side.setGeometry(0,0,self.fontMetrics().width("8")*8,self.height()+num)
        self.drawTab()
    def eventFilter(self,o,e):
        if e.type() == QtCore.QEvent.Paint and o == self.side:
            self.drawLineNumber(o)
            return True
        return False
    def drawEOF(self):
        c = self.textCursor()
        c.movePosition(c.End)
        r = self.cursorRect(c)
        paint = QtGui.QPainter(self.viewport())
        paint.setPen(QtGui.QColor(255, 0, 0))
        paint.setFont(self.currentFont())
        paint.drawText(QtCore.QPoint(r.left(),r.bottom()-3), "[EOF]")
    def drawTab(self):
        tabchar = "›"
        c = self.cursorForPosition(QtCore.QPoint(0,0))
        paint = QtGui.QPainter()
        paint.begin(self.viewport())
        paint.setPen(QtGui.QColor(150,150,150))
        paint.setFont(self.currentFont())
        c = self.document().find("	",c)
        while not c.isNull():
            c.movePosition(QtGui.QTextCursor.Left)
            r = self.cursorRect(c)
            if r.bottom() > self.height()+10: break
            paint.drawText(QtCore.QPoint(r.left(),r.bottom()-3),tabchar)
            c.movePosition(QtGui.QTextCursor.Right)
            c = self.document().find("	",c)
        paint.end()
    def drawLineNumber(self,o):
        c = self.cursorForPosition(QtCore.QPoint(0,0))
        block = c.block()
        paint = QtGui.QPainter()
        paint.begin(o)
        paint.setPen(QtGui.QColor(0,0,0))
        paint.setFont(self.currentFont())
        while block.isValid():
            c.setPosition(block.position())
            r = self.cursorRect(c)
            if r.bottom() > self.height()+10: break
            paint.drawText(QtCore.QPoint(10,r.bottom()-3),str(block.blockNumber()+1))
            block = block.next()
        paint.end()
def main():
    app = QtGui.QApplication(sys.argv)
    m = Main()
    m.openAction.triggered.connect(m.fileOpenByDialog)
    m.show()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()

PyQt Most simple browser

#encoding:utf-8
import sys
from PyQt4 import QtGui,QtWebKit,QtCore
class Example(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)
        self.resize(150, 150)
        self.setWindowTitle("msb")
        self.web = QtWebKit.QWebView(self)
        self.web.load(QtCore.QUrl("http://google.com"))
        #self.web.setUrl(QtCore.QUrl("http://google.com")) #代替になると書かれているけどどこかに差があったりするのかな
        self.show()

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()

最も簡素なモノ

#encoding:utf-8
import sys
from PyQt4 import QtGui,QtWebKit,QtCore
class Example(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)
        self.setAcceptDrops(True)
        self.resize(150, 150)
        self.setWindowTitle("msb")
        self.layout = QtGui.QHBoxLayout(self)
        self.web = QtWebKit.QWebView()
        self.web.load(QtCore.QUrl("http://google.com"))
        #self.web.setUrl(QtCore.QUrl("http://google.com")) #代替になると書かれているけどどこかに差があったりするのかな
        self.web.settings().setAttribute(
            QtWebKit.QWebSettings.DeveloperExtrasEnabled,True)
        self.inspector = QtWebKit.QWebInspector()
        self.layout.addWidget(self.web)
        self.layout.addWidget(self.inspector)
        self.inspector.setPage(self.web.page())
        self.show()
def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()

Firebugっぽいあれを付けれる。
ここでのポイントはself.web.settings().setAttribute(QtWebKit.QWebSettings.DeveloperExtrasEnabled,True)の書き方

#encoding:utf-8
import sys
from see import see
from PyQt4 import QtGui,QtWebKit,QtCore
class Example(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)
        self.resize(150, 150)
        self.layout = QtGui.QHBoxLayout(self)
        self.web = QtWebKit.QWebView()
        self.inspector = QtWebKit.QWebInspector()
        self.web.settings().setAttribute(QtWebKit.QWebSettings.DeveloperExtrasEnabled,True)
        self.web.load(QtCore.QUrl("http://google.com"))
        self.web.titleChanged.connect(self.titleChange)
        self.layout.addWidget(self.inspector)
        self.layout.addWidget(self.web)
        self.inspector.setPage(self.web.page())
        self.setWindowTitle("msb:"+self.web.title())
        self.show()
    def titleChange(self,e):
        self.setWindowTitle("msb:"+self.web.title())
def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()

サイトのタイトルをウィンドウのタイトルに載せるようにした。Signal練習。
titleChangedをurlChangedに帰ると動かない。理由がわからない。。