たけし備忘録

自分の好奇心の赴くままに勉強メモ LL系が大好き Python bash Julia C

PyQt4メモ1

最近PyQt4を使い始めたのでテキトーにメモしていきます。


[参考にしているサイト]
PyQt's Modules
PyQt Class Reference

[環境]
OS: Windows7
IDE: Pyscripter
Python: Python2.7
PyQt: PyQt4

Pyscripterのモジュールのメソッドの補完については

(手順1)
Pyscripterの起動 -> ツールタブ -> Edit Start Scripts

とすると pyscripter_init.py と python_init.py が開かれるので
python_init.pyの方に

import sys
import PyQt4.QtGui as QtGui
import PyQt4.QtCore as QtCore

を追加してファイルを上書き保存。

(手順2)
Pyscripterの起動 -> ツールタブ -> オプション -> IDEオプション

とするとIDEオプションのウィンドウが開かれるので
Code Completionの表の中の Special packagesにPyQt4を追加する

Special packages os, wx, PyQt4

となっていればOK



numpy, scipy, matplotlibなどを使いたいって時も同じ手順で行います。
これは何をやっているのというと、
Pyscripter上にあるPythonインタプリタに、初期設定でpython_init.pyでimportしまっせということらしい。
そしてコード補完はPyscripter上のインタプリタで定義された変数やクラスにしか作用しないということらしいです。
なのでpython_init.pyを起動時に読み込んであげて、変数・クラスを定義しますよ ということらしいです。
外部モジュールをpython_init.pyで読み込むには,手順2で設定してあげましょうね、ということらしいです。
合ってるかはワカリマセン。


では以下よりPyQtの話題
まずは基本の雛形

[mamo1_1.py]

import sys
import PyQt4.QtGui as QtGui
import PyQt4.QtCore as QtCore

#基本のウィンドウの作成 これの上にボタンとかを載せていく
class MainWidget(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self, parent=None)
        self.initUI()

    def initUI(self):
        self.show()
   
def main():
    app = QtGui.QApplication(sys.argv)
    main_widget = MainWidget()
    sys.exit(app.exec_())  #app.exec_()でメインループの開始

if __name__=="__main__":
    main()

これでとりあえず画面は表示される。
何も設定しない状態でデスクトップのどこに表示されるのかなどを比較したかったのでデスクトップごと映しました。

f:id:takeshiD:20151114160732p:plain

何もしなくても中心あたりに表示された。
GUIを作るんだったら静的にではなく動的にいろいろいじくりたいのでまず、ウィンドウの状態や状態の変更の仕方を知りたいです。
そしてウィンドウの状態の定義の仕方はどんなウィジェットでも一貫性のあるもののはずです。きっと。応用が効きまくるはずです。
サイズだとか位置だとかが必ずクラスで定義されているはずだし、英語だとpositionだからそれっぽい名前だろうということで、上記の参考サイトで調べるとありました。
(GoogleChromeでのキーワードの検索はWebページ上で Ctrl+F で行えます。画像のようになります)

f:id:takeshiD:20151114164947p:plain

QWidgetの位置はQPointというクラスで定義されているようです。
さらにQPointクラスについて調べてみると
QPoint Class Reference
英語読めないよ、という方はWebブラウザの翻訳機能を使いましょう。少ししょぼい翻訳ですが英語だけで読み切るよりはマシなはずです。

Methodsの項目だけみてればとりあえずOK。それっぽいのがありました

QPoint.setX(self, int xpos)
QPoint.setY(self, int ypos)
QPoint.x(self)
QPoint.y(self)

setX,setYはウィジェットの位置を決めるメソッド
x,yはウィジェットの位置を返すメソッド
だと分かります。

QWidgetのサイズはQSizeというクラスで定義されているようです。
QSize Class Reference

QSize.setHeight(self, int h)
QSize.setWidth(self, int w)
QSize.height(self)
QSize.width(self)


確かめてみましょう。上記のmemo1_1.pyにprintを追加しただけです。

[memo1_2.py]

import sys
import PyQt4.QtGui as QtGui
import PyQt4.QtCore as QtCore

class MainWidget(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self, parent=None)
        self.initUI()

        print "x:",self.x()
        print "y;",self.y()
        print "widht:", self.width()
        print "height:", self.height()

    def initUI(self):
        self.show()
def main():
    app=QtGui.QApplication(sys.argv)
    main_class=MainWidget()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

f:id:takeshiD:20151114172200p:plain


これでなんとかウィンドウの状態が取得できました。めでたしめでたし。
今回はデスクトップ上での位置だったけど、ウィジェットウィジェットを入れ子にするのが普通なのでその場合は位置はどうなるのか気になるところです。
多分ウィジェット上での位置になるんだろうけど。