| ■ | Python+Qt=PyQt |
PyQtの現在のバージョンは3.2.4で、着実に進化の道を歩み続けています。 PyQt 3.2.4はPython 1.5〜2.2.1とQt 1.42〜3.0.4に対応しています。 こちらが現在の総本山です。 PyQtはQtと全く同じ方法で日本語の文字も扱うことができます。
| ■ | PyQtのインストール |
| Python | Qt | sip | PyQt |
|---|---|---|---|
| 1.6α2 | 2.1.1 | 0.12 | 0.12 |
| 2.0β1 | 2.1.1 | 2.0 | 2.0 |
| 2.1.1 | 2.3.1 | 2.5 | 2.5 |
| 2.1.1 | 3.0.1 | 3.0 | 3.0 |
| 2.2.1 | 3.0.4 | 3.2.4 | 3.2.4 |
●sip(2.5〜3.2.4)のインストール手順
% tar xozf sip-3.2.4.tar.gz % cd sip-3.2.4
% sh configure --with-qt-dir=/usr/local/qt \ --with-python=/usr/local/bin/pythonsip-2.0の場合は、 Pythonのヘッダファイルのディレクトリ(python.hがあるディレクトリ) をスイッチで指定します。
% sh configure --with-qt-dir=/usr/local/qt \ --with-python-includes=/usr/local/include/python2.0
% make % su root # make install
●PyQt(2.5〜3.2.4)のインストール
% tar xozf PyQt-3.2.4.tar.gz % cd PyQt-3.2.4
% sh configure --with-qt-dir=/usr/local/qt \ --with-python=/usr/local/bin/pythonPyQt-2.0ではもっと長くなります。
% sh configure --with-qt-dir=/usr/local/qt \ --with-python-includes=/usr/local/include/python2.0 \ --with-python-modules=/usr/local/lib/python2.0 \ --with-sip-includes=/usr/local/include/sip \ --with-sip-libraries=/usr/local/lib
% make % su root # make install
% cd /the/path/of/PyQt-3.0/examples % ./tut2.py &
実は、PyQt 2.5を「make install」しようとすると、 「libsip.so.6.0.0: undefined symbol: translate_QApplication...」 というエラーで止まってしまいました。 しかし、通常ユーザーに戻ってPythonインタープリタから「import qt」 とすると普通に動いたので、よしとしませうか…(おーい)
| ■ | Hello, PyQt World |
# PyQtの決まり文句はこれ。
import sys
from qt import *
a = QApplication(sys.argv)
w = QWidget()
w.resize(200, 80)
la = QLabel('Hello, World.', w)
cmda = QPushButton('OK', w)
la.resize(100, 20)
la.move(50, 10)
# ↓PyQt 0.12の場合
#la.setFont(QFont('Helvetica', 14, QFont.Weight.Normal))
# ↓PyQt 2.0〜の場合
la.setFont(QFont('Helvetica', 14, QFont.Normal))
cmda.resize(40, 20)
cmda.move(130, 40)
QObject.connect(cmda, SIGNAL('clicked()'), a, SLOT('quit()'))
a.setMainWidget(w)
w.show()
a.exec_loop()
# end.
|
ちょっとメモ(1) - 載せる処理は?
C++でQtを使ったらおなじみですが、Qtでは、
ウィジェットを作るときのコンストラクタで自分を載せる親ウィジェットを引数で指定
(Qtのクラスには大抵複数のコンストラクタがありますが大抵最後の引数です)
するのですが、その後「載せる」というアクションを書く必要はなく、
一番土台になるウィジェット(=ウィンドウ)が出ると自動的に全部のウィジェットが表示されます。
| ■ | さっそくクラス |
import sys
from qt import *
# QWidgetを継承します。
class HelloWidget(QWidget):
# いわゆるスロットですが、まったく普通のメソッドとして
# 定義すればOKです。特別なキーワードは不要です。
def hello(self):
print 'Hello, World.'
# コンストラクタ。仮引数の形はこれで固定です
def __init__(self, *args):
# この apply は定石ということで使い回しOK
apply(QWidget.__init__, (self,)+args)
self.resize(200, 80)
la = QLabel(self)
la.setText('Hello, World.')
cmda = QPushButton(self)
cmda.setText('Push Me!')
la.resize(100, 20)
la.move(50, 10)
# ↓PyQt 0.12の場合
#la.setFont(QFont('Helvetica', 14, QFont.Weight.Normal))
# ↓PyQt 2.0〜の場合
la.setFont(QFont('Helvetica', 14, QFont.Normal))
cmda.resize(60, 20)
cmda.move(130, 40)
# スロットに特別な宣言は不要です。単にメソッドの名前を
# 指定するだけでシグナル/スロット機構に登録されます。
self.connect(cmda, SIGNAL("clicked()"), self.hello)
# アプリケーションを初期化
a = QApplication(sys.argv)
# 定義したクラスのインスタンスをつくり、あとは決まりきった処理です
w = HelloWidget()
a.setMainWidget(w)
w.show()
a.exec_loop()
# end.
|
上の例のように、Qtの標準クラスQWidgetを継承した独自のクラスを 1つ作り、それをQApplicationのメインウィジェットとする形が最も一般的でしょう。 ナニをもって一般的と呼ぶかというのは、 ちょうどJavaのAWT/Swingアプリケーションがこのような構造をとるので、 PyQtでも同じような書き方をするのがより多くの方に理解しやすいと思われると思ったからです。 実際このコード例を見ると、なんだか本当にJava言語のプログラムみたいですね。 おおっと、PythonもQtもJavaより先に生まれていますから、この言い方はよくないですね。 まあ、あまり堅いことを言うと、例のWindowsがMacに似ているのか、 MacがWindowsに似ているのか、というような不毛な議論になってしまいますから、 堅苦しいのは抜きにしましょう。
セクションのサブメニューに戻る
(first uploaded 2000/04/09 last updated 2002/05/21)