PyQt4
やばいよPtQt4。PythonとQtがこんなにも相性が良かったとは。
まずQt Designerとの相性が良い。Designerはシグナル/スロットの管理は出来るけど、低レベルイベントのカスタマイズが出来ないんだよね。Qtのイベント処理はウィジェットクラスの継承とprotectedメソッドのオーバーライドによって行なうんだけど、Designerを使うとそれが面倒くさい(これがザウルスのQt開発でDesignerを使ってない理由)。QFrameとかを継承したクラスを作ってDesignerに読み込ませたり(面倒)、eveneFilterを使ったり(面倒)。でもPythonなら動的にクラスをいじれるので、
mainwindow_form, mainwindow_base = uic.loadUiType('mainwindow.ui')
class MainWindow(mainwindow_base, mainwindow_form):
def __init__(self):
mainwindow_base.__init__(self)
## フォーム構築
self.setupUi(self)
## イベントハンドラのオーバーライド
self.inputFilesList.__class__.dragEnterEvent = self.dragEnterEvent
self.inputFilesList.__class__.dragMoveEvent = self.dragEnterEvent
self.inputFilesList.__class__.dropEvent = self.dropEvent
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction()
def dropEvent(self, event):
for url in event.mimeData().urls():
self.addInputFile(url)
こんな感じでDesignerで作成したウィジェットのイベントをオーバーライドできる。素晴しい。ついでにuiファイルをコードに変換しなくても直接読み込める。素晴しい(C++のほうでも出来るらしいけど)。
あとQStringとPythonの文字列、QPair とPythonのタプル、QListとPythonのリストの変換を暗黙的にやってくれたり。こんな複雑な型の引数を持つメソッドも、
>>> ## void QUrl::setQueryItems ( const QList> & query ); >>> url = QUrl() >>> url.setQueryItems([('action', 'view'), ('page', 'index')]) >>> unicode(url.toString()) ?action=view&page=index
って書ける。感動した。このへんはSIPの凄さなのかなぁ。
問題は配布するときのファイルサイズかな。py2exeを使うと、Python処理系+Qt+PyQtで10MBを越えそうな気がする。