yu00’s blog

プログラミングに関する備忘録です

イベント処理

PyQt5入門 PythonでGUI作成 - yu00’s blog

イベント処理の方法

PyQt5でキーボードやマウスなどのイベントを扱う処理の説明です.
ウィジェットでキーボードやマウスの入力などのイベント起こると,それぞれに対応する関数が呼ばれます.
例えばキーボード入力が起こるとQWidget.keyPressEvent()という
関数が呼ばれます.

イベントが起こったとき何か処理をしたい場合には,
ウィジェットを継承し対応する関数を再実装(オーバーライド)することで実現します.

イベント処理の例

例としてエスケープキーが押されたらウィンドウを閉じるプログラムを書いてみます.

#! /usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import Qt

# QWidgetを継承
class MyWidget(QWidget):
    # キーボードイベントをオーバーライド
    def keyPressEvent(self, e):
        if e.key() == Qt.Key_Escape: # キーがエスケープなら
            self.close() # 閉じる
            
if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    window = MyWidget() # 継承したウィジェットを使う
    window.show()
    
    sys.exit(app.exec_())

シグナルとスロット

PyQt5入門 PythonでGUI作成 - yu00’s blog

シグナルとスロットとは

シグナルとスロットの例として,
ボタンを押したときに何か処理をするプログラムを考えます.
そのときの流れは次のようになります.

  1. ボタンを押す
  2. ボタンが押されたというイベントが発行される
  3. そのイベントに紐づけされた処理が実行される

この流れの2がシグナル,3がスロットになります.

このように,シグナルは何かが起こったときに発行されるイベント,
スロットはシグナルが起こったとき実行される処理です.

シグナルとスロットの特徴

シグナルとスロットには次のような特徴があります.

ウィジェットにはシグナルが設定されている

ウィジェットにはもともといくつかのシグナルが設定されています.
例えばボタンウィジェットにはボタンが押されたときに発行される
シグナルが設定されています.

シグナルとスロットは自分で作ることもできる

シグナル,スロットはもともとあるものを利用することもできますが,
自分で作ることもできます.

シグナルとスロットの例

シグナルとスロットの例としてボタンが押されたときに
アプリを終了するプログラムを書いてみます.

#! /usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton) 

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QWidget()
    button = QPushButton('button', window)
    
    # スロットを設定
    button.clicked.connect(app.quit)
    
    window.show()
    sys.exit(app.exec_())

ボタンが押されたときQPushButton.clicked()というシグナル関数が呼ばれます.
QApplication.quit()はアプリを終了する関数です.
上のプログラムのようにconnect関数を実行するすることで,
clickedシグナルのスロットにquitが設定されます.
そして,ボタンが押されたときclicked()が呼ばれ,quit()が呼ばれることで
アプリが終了します.

レイアウトを使った配置

PyQt5入門 PythonでGUI作成 - yu00’s blog

レイアウトとは

レイアウトはウィジェットを簡単に配置する仕組みです.
ウィジェットを横に並べたり,マス目に並べたりできます.
ウィジェットの位置は自動的に計算されるので,
自分でピクセルの位置を設定する必要はありません.

レイアウトの例

例として,ウィジェットを横に並べるQHBoxLayoutを使って
ボタンを3つ横に並べてみます.

サンプルコード

#! /usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout

if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    window = QWidget()
    #  ボタンを作成
    button1 = QPushButton('1')
    button2 = QPushButton('2')
    button3 = QPushButton('3')
    
    # レイアウト作成
    layout = QHBoxLayout()
    # レイアウトにボタンを追加
    layout.addWidget(button1)
    layout.addWidget(button2)
    layout.addWidget(button3)
    
    # レイアウトをセット
    window.setLayout(layout)
    
    window.show()
    sys.exit(app.exec_())

実行例

f:id:yu00:20150902173318p:plain

このようにレイアウトを作成した後addWidgetを使いウィジェットを配置し,
setLayoutを使ってレイアウトをウィジェットにセットします.

レイアウトの組み合わせ

レイアウトを複数組み合わせることによって複雑なレイアウトを作ることができます.

例として,横に配置するQHBoxLayoutと縦に配置するQVBoxLayoutを
組み合わせてみます.

サンプルコード

#! /usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, 
                             QHBoxLayout, QVBoxLayout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    window = QWidget()

    button1 = QPushButton('1')
    button2 = QPushButton('2')
    button3 = QPushButton('3')
    
    # ボタン配置
    hbox = QHBoxLayout()
    hbox.addWidget(button1)
    vbox = QVBoxLayout()
    vbox.addWidget(button2)
    vbox.addWidget(button3)
    hbox.addLayout(vbox)
    
    window.setLayout(hbox)
    
    window.show()
    sys.exit(app.exec_())

実行例

f:id:yu00:20150902175819p:plain:h119

このようにaddLayoutを使うことでレイアウトに
別のレイアウトを追加できます.

ウィジェット

PyQt5入門 PythonでGUI作成 - yu00’s blog

ウィジェットとは

ウィンドウ,ボタン,ラベルなどのユーザーインターフェースを構成する部品を
ウィジェットと呼びます.
PyQt5ではQWidgetクラスがウィジェットを表しています.

ウィジェットの機能・特徴

ウィジェットには次のような機能・特徴があります.

ウィジェットの中に別のウィジェットを埋め込める

QWidgetクラスにはウェジェットの中に別のウェジェットを埋め込む機能があります.
PyQt5のプログラムではまずベースとなるウィンドウのウィジェットを作り,
その中にボタンやラベルなどのウィジェットを埋め込んでいくことで
GUIを作ります.

ウィジェットを埋め込むことで親子関係ができる

外側のウィジェットが親,埋め込んだ内側のウィジェットが子になります.

親がないウィジェットはウィンドウになる

親がない,つまりいちばん外側のウィジェットがウィンドウになります.

ウィジェットの例

例としてウィンドウにボタン用のクラスであるQPushButtonを埋め込んでみます.

#! /usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    window = QWidget()
    button = QPushButton('button', window) # ボタンを埋め込み
    window.show()

    sys.exit(app.exec_())

QPushButton()の第一引数が表示するテキスト,
第二引数が親のウィジェットです.
実行すると次のようになります.
f:id:yu00:20150901211049p:plain

PyQt5でのプログラミングの基本

PyQt5入門 PythonでGUI作成 - yu00’s blog


PyQt5で必要最小限のプログラミングは次のようになります.

サンプルコード

#! /usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5 import QtWidgets

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    
    window = QtWidgets.QWidget()
    window.show()
    
    sys.exit(app.exec_())

これはウィンドウを作成し表示するプログラムです.

実行結果

f:id:yu00:20150901011559p:plain

サンプルコード解説

アプリケーション作成

app = QtWidgets.QApplication(sys.argv)

PyQt5のプログラムでは最初に上のように
アプリケーションオブジェクトを作る必要があります.
sys.argvはコマンドライン引数のリストです.

ウィジェットの作成

window = QtWidgets.QWidget()

PyQt5ではウィジェットユーザーインターフェースを提供する
基本的なクラスになっています.
QWidgetオブジェクトを作成することでウィンドウが作成されます.

ウィジェットの表示

window.show()

QWidget.show()を呼ぶことでウィンドウが表示されます.

アプリケーション実行

sys.exit(app.exec_())

最後にアプリケーションのメインループに入り,
アプリケーションを実行します.

PyQt5入門 PythonでGUI作成

PythonGUIを作成できるPyQt5について,使い方を説明していきます.

注意

  • Pythonの基本を知っていることを前提としています
  • Pythonは3.x系です
  • 情報,プログラムの正確さには細心の注意を払っていますが,それらの正確性は保証できません.間違いがありましたら指摘してくださるとありがたいです

リンク・参考資料

PyQt5の基本

基本ウィジェット

(作成中)

基本レイアウト

(作成中)

シグナルとスロット

スタイル

関連クラス

  • QPixmapクラス

VisualStudio2013でEmacsキーバインド

VisualStudio2013をEmacsキーバインドにするさいのメモです.

emacs.vsixのインストール

まず次のリンク先からemacs.vsixをダウンロードします.
owainlewis/emacs-visual-studio-2013 · GitHub

そして,ダウンロードしたemacs.vsixを実行します.
インストール画面が表示されるので手順にそって進めていけば
VisualStudio2013にインストールされます.

Emacs.vskを配置

ダウンロードしたemacs.vsixの拡張子をvsixからzipに変更し,
展開します.
展開したファイルの中にEmacs.vskというファイルがあるので,それを
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE
にコピーします.

VisualStudioの設定

VisualStudioを起動し,
[ツール]->[オプション]->[環境]->[キーボード]の
[次の追加キーボードマップスキームを適用]で[Emacs]を選択します.

その下にショートカットを変更できる項目があるので,
ショートカットを自分好みに変えることもできます.

これでVisualStudioでEmacsキーバインドが使用できます.