Pyqt-quick-guide

提供:Dev Guides
移動先:案内検索

PyQt-はじめに

PyQtは、GUIウィジェットツールキットです。 最も強力で人気のあるクロスプラットフォームGUIライブラリの1つである Qt 用のPythonインターフェイスです。 PyQtは、RiverBank Computing Ltdによって開発されました。 PyQtの最新バージョンは、公式Webサイトからダウンロードできます-https://riverbankcomputing.com/software/pyqt/download[riverbankcomputing.com]

PyQt APIは、多数のクラスと関数を含むモジュールのセットです。 QtCore モジュールにはファイルやディレクトリなどを操作するための非GUI機能が含まれていますが、 QtGui モジュールにはすべてのグラフィカルコントロールが含まれています。 さらに、XML (QtXml)、SVG (QtSvg)、およびSQL *(QtSql)*などを操作するためのモジュールがあります。

サポート環境

PyQtは、Windows、Linux、Mac OSなど、一般的なすべてのオペレーティングシステムと互換性があります。 デュアルライセンスで、GPLおよび商用ライセンスで利用できます。

Windows

Pythonバージョン(2.7または3.4)およびハードウェアアーキテクチャ(32ビットまたは64ビット)に対応する上記のダウンロードリンクから適切なインストーラーをダウンロードしてインストールできます。 PyQtには、 PyQt 4.8PyQt 5.5 の2つのバージョンがあることに注意してください。

PyQt4はPython 3と同様にPython 2でも使用できますが、PyQt5はPython 3. *でのみ使用できます。

  • PyQt4 Windowsバイナリ*
PyQt4-4.11.4-gpl-Py3.4-Qt4.8.7-x64.exe Windows 64 bit installer
PyQt4-4.11.4-gpl-Py3.4-Qt4.8.7-x32.exe Windows 32 bit installer
PyQt4-4.11.4-gpl-Py3.4-Qt5.5.0-x64.exe Windows 64 bit installer
PyQt4-4.11.4-gpl-Py3.4-Qt5.5.0-x32.exe Windows 32 bit installer
PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x64.exe Windows 64 bit installer
PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe Windows 32 bit installer
  • PyQt5 Windowsバイナリ*
PyQt5-5.5-gpl-Py3.4-Qt5.5.0-x64.exe Windows 64 bit installer
PyQt5-5.5-gpl-Py3.4-Qt5.5.0-x32.exe Windows 32 bit installer

Linux

Ubuntuまたは他のDebian Linuxディストリビューションの場合、次のコマンドを使用してPyQtをインストールします-

sudo apt-get install python-qt4
or
sudo apt-get install pyqt5-dev-tools

「ダウンロード」ページで入手可能なソースコードからビルドすることもできます。

PyQt-x11-gpl-4.11.4.tar.gz Linux, UNIX source for PyQt4
PyQt-gpl-5.5.tar.gz Linux, UNIX, MacOS/X source for PyQt5

マックOS

PyQtXプロジェクト(* http://sourceforge.net/projects/pyqtx/*)は、PyQt for Macのバイナリをホストします。 次のコマンドに従ってHomebrewインストーラを使用します-

brew install pyqt

PyQt-Hello World

PyQtを使用して簡単なGUIアプリケーションを作成するには、次の手順を実行します-

  • QtGuiモジュールをインポートします。
  • アプリケーションオブジェクトを作成します。
  • QWidgetオブジェクトはトップレベルウィンドウを作成します。 QLabelオブジェクトを追加します。
  • ラベルのキャプションを「hello world」として設定します。
  • setGeometry()メソッドでウィンドウのサイズと位置を定義します。
  • * app.exec _()*メソッドでアプリケーションのメインループに入ります。
import sys
from PyQt4 import QtGui

def window():
   app = QtGui.QApplication(sys.argv)
   w = QtGui.QWidget()
   b = QtGui.QLabel(w)
   b.setText("Hello World!")
   w.setGeometry(100,100,200,50)
   b.move(50,20)
   w.setWindowTitle(“PyQt”)
   w.show()
   sys.exit(app.exec_())

if __name__ == '__main__':
   window()

上記のコードは、次の出力を生成します-

Hello World Pyqt-major-classes

PyQt-Qt Designerの使用

PyQtインストーラーには、 Qt Designer と呼ばれるGUIビルダーツールが付属しています。 シンプルなドラッグアンドドロップインターフェイスを使用して、コードを記述することなくGUIインターフェイスをすばやく構築できます。 ただし、Visual StudioなどのIDEではありません。 したがって、Qt Designerにはアプリケーションをデバッグおよびビルドする機能がありません。

Qt Designerを使用したGUIインターフェイスの作成は、アプリケーションのトップレベルウィンドウを選択することから始まります。

Qt Designer1

その後、必要なウィジェットを左ペインのウィジェットボックスからドラッグアンドドロップできます。 フォームに配置されたウィジェットのプロパティに値を割り当てることもできます。

Qt Designer2

設計されたフォームはdemo.uiとして保存されます。 このUIファイルには、デザイン内のウィジェットとそのプロパティのXML表現が含まれています。 この設計は、pyuic4コマンドラインユーティリティを使用して、同等のPythonに変換されます。 このユーティリティは、uicモジュールのラッパーです。 pyuic4の使用法は次のとおりです-

pyuic4 –x demo.ui –o demo.py

上記のコマンドで、-xスイッチは生成されたXMLに少量の追加コードを追加し、自己実行可能なスタンドアロンアプリケーションになります。

if __name__ == "__main__":
   import sys
   app = QtGui.QApplication(sys.argv)
   Dialog = QtGui.QDialog()
   ui = Ui_Dialog()
   ui.setupUi(Dialog)
   Dialog.show()
   sys.exit(app.exec_())

結果のPythonスクリプトは、次のダイアログボックスを表示するために実行されます-

ダイアログボックス

ユーザーは入力フィールドにデータを入力できますが、「追加」ボタンをクリックしても、機能に関連付けられていないため、アクションは生成されません。 ユーザー生成の応答に反応することは、*イベント処理*と呼ばれます。

PyQt-シグナルとスロット

順次実行されるコンソールモードアプリケーションとは異なり、GUIベースのアプリケーションはイベント駆動型です。 関数またはメソッドは、ボタンをクリックする、コレクションからアイテムを選択する、またはマウスクリックなど、 events と呼ばれるユーザーのアクションに応答して実行されます。

GUIインターフェースの構築に使用されるウィジェットは、そのようなイベントのソースとして機能します。 QObjectクラスから派生した各PyQtウィジェットは、1つ以上のイベントに応じて「 signal 」を送信するように設計されています。 シグナル自体はアクションを実行しません。 代わりに、「スロット」に「接続」されています。 スロットには、任意の*呼び出し可能なPython関数*を指定できます。

PyQtでは、信号とスロットの接続はさまざまな方法で実現できます。 以下は、最も一般的に使用される技術です-

QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)

ウィジェットによって信号が発行されたときに、slot_functionを呼び出すより便利な方法は次のとおりです-

widget.signal.connect(slot_function)

ボタンがクリックされたときに関数が呼び出されると仮定します。 ここで、クリックされた信号は呼び出し可能な関数に接続されます。 それは、次の2つの技術のいずれかで達成することができます-

QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)

or

button.clicked.connect(slot_function)

次の例では、2つのQPushButtonオブジェクト(b1およびb2)がQDialogウィンドウに追加されます。 それぞれb1とb2をクリックすると、関数b1_clicked()とb2_clicked()を呼び出します。

b1がクリックされると、clicked()シグナルがb1_clicked()関数に接続されます

b1.clicked.connect(b1_clicked())

b2がクリックされると、clicked()シグナルがb2_clicked()関数に接続されます

QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def window():
   app = QApplication(sys.argv)
   win = QDialog()
   b1 = QPushButton(win)
   b1.setText("Button1")
   b1.move(50,20)
   b1.clicked.connect(b1_clicked)

   b2 = QPushButton(win)
   b2.setText("Button2")
   b2.move(50,50)
   QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)

   win.setGeometry(100,100,200,100)
   win.setWindowTitle("PyQt")
   win.show()
   sys.exit(app.exec_())

def b1_clicked():
   print "Button 1 clicked"

def b2_clicked():
   print "Button 2 clicked"

if __name__ == '__main__':
   window()

上記のコードは、次の出力を生成します-

信号とスロットの出力

出力

Button 1 clicked
Button 2 clicked

PyQt-レイアウト管理

GUIウィジェットは、ピクセル単位で測定される絶対座標を指定することにより、コンテナウィンドウ内に配置できます。 座標は、setGeometry()メソッドで定義されたウィンドウの寸法に相対的です。

setGeometry()構文

QWidget.setGeometry(xpos, ypos, width, height)

次のコードスニペットでは、300 x 200ピクセルのサイズのトップレベルウィンドウがモニターの位置(10、10)に表示されます。

import sys
from PyQt4 import QtGui

def window():
   app = QtGui.QApplication(sys.argv)
   w = QtGui.QWidget()

   b = QtGui.QPushButton(w)
   b.setText("Hello World!")
   b.move(50,20)

   w.setGeometry(10,10,300,200)
   w.setWindowTitle(“PyQt”)
   w.show()
   sys.exit(app.exec_())

if __name__ == '__main__':
   window()
*PushButton* ウィジェットがウィンドウに追加され、ウィンドウの右に50ピクセル、左上の20ピクセル下の位置に配置されます。

ただし、この*絶対位置*は、次の理由により適切ではありません-

  • ウィンドウのサイズを変更しても、ウィジェットの位置は変わりません。
  • 解像度が異なるディスプレイデバイスでは、外観が均一でない場合があります。
  • フォーム全体の再設計が必要になる可能性があるため、レイアウトの変更は困難です。

元のウィンドウとサイズ変更されたウィンドウ

PyQt APIは、コンテナ内のウィジェットの配置をよりエレガントに管理するためのレイアウトクラスを提供します。 絶対配置に対するレイアウトマネージャーの利点は次のとおりです-

  • ウィンドウ内のウィジェットは自動的にサイズ変更されます。
  • 異なる解像度のディスプレイデバイスで均一な外観を保証します。
  • 再設計することなく、ウィジェットを動的に追加または削除できます。

以下に、この章で1つずつ説明するクラスのリストを示します。

Sr.No. Classes & Description
1

QBoxLayout

QBoxLayoutクラスは、ウィジェットを垂直または水平に並べます。 その派生クラスは、QVBoxLayout(ウィジェットを垂直に配置するため)およびQHBoxLayout(ウィジェットを水平に配置するため)です。

2

QGridLayout

GridLayoutクラスオブジェクトは、行と列に配置されたセルのグリッドで表示されます。 このクラスにはaddWidget()メソッドが含まれています。 セルの行と列の数を指定することにより、任意のウィジェットを追加できます。

3

QFormLayout

QFormLayoutは、各行がラベルに関連付けられた入力フィールドで構成される2列のフォームを作成する便利な方法です。 慣例として、左の列にはラベルが含まれ、右の列には入力フィールドが含まれます。

PyQt-基本的なウィジェット

以下に、この章で1つずつ説明するウィジェットのリストを示します。

Sr.No Widgets & Description
1

QLabel

QLabelオブジェクトは、編集不可能なテキストや画像、またはアニメーションGIFのムービーを表示するためのプレースホルダーとして機能します。 他のウィジェットのニーモニックキーとしても使用できます。

2

QLineEdit

QLineEditオブジェクトは、最も一般的に使用される入力フィールドです。 1行のテキストを入力できるボックスを提供します。 複数行のテキストを入力するには、QTextEditオブジェクトが必要です。

3

QPushButton

PyQt APIでは、QPushButtonクラスオブジェクトは、クリックすると特定の機能を呼び出すようにプログラムできるボタンを提供します。

4

QRadioButton

QRadioButtonクラスオブジェクトは、テキストラベル付きの選択可能なボタンを提供します。 ユーザーは、フォームに表示される多くのオプションのいずれかを選択できます。 このクラスはQAbstractButtonクラスから派生しています。

5

QCheckBox

QCheckBoxオブジェクトが親ウィンドウに追加されると、テキストラベルの前に長方形のボックスが表示されます。 QRadioButtonと同様に、選択可能なボタンでもあります。

6

QComboBox

QComboBoxオブジェクトは、選択するアイテムのドロップダウンリストを提供します。 現在選択されている項目のみを表示するために必要なフォーム上の最小画面スペースが必要です。

7

QSpinBox

QSpinBoxオブジェクトは、右側に上/下ボタンがある整数を表示するテキストボックスをユーザーに提示します。

8

QSlider Widget & Signal

QSliderクラスオブジェクトは、ハンドルを移動できる溝をユーザーに提示します。 境界値を制御するための古典的なウィジェットです。

9

QMenuBar, QMenu & QAction

QMainWindowオブジェクトのタイトルバーのすぐ下にある水平QMenuBarは、QMenuオブジェクトを表示するために予約されています。

10

QToolBar

QToolBarウィジェットは、テキストボタン、アイコン付きのボタン、または他のウィジェットで構成される移動可能なパネルです。

11

QInputDialog

これは、テキストフィールドと、[OK]と[キャンセル]の2つのボタンを備えた事前設定ダイアログです。 ユーザーが[OK]ボタンをクリックするか、Enterキーを押すと、親ウィンドウはテキストボックスに入力を収集します。

12

QFontDialog

一般的に使用されるもう1つのダイアログであるフォントセレクタウィジェットは、QDialogクラスの外観です。 このダイアログの結果はQfontオブジェクトになり、親ウィンドウで使用できます。

13

QFileDialog

このウィジェットは、ファイルセレクターダイアログです。 これにより、ユーザーはファイルシステムをナビゲートし、開くまたは保存するファイルを選択できます。 ダイアログは、静的関数を介して、またはダイアログオブジェクトでexec_()関数を呼び出すことにより呼び出されます。

14

QTab

フォームに同時に表示するフィールドが多すぎる場合は、タブ付きウィジェットの各タブの下に配置された異なるページに配置できます。 QTabWidgetは、タブバーとページ領域を提供します。

15

QStacked

QStackedWidgetの機能はQTabWidgetに似ています。 また、ウィンドウのクライアント領域を効率的に使用するのにも役立ちます。

16

QSplitter

フォームに同時に表示するフィールドが多すぎる場合は、タブ付きウィジェットの各タブの下に配置された異なるページに配置できます。 QTabWidgetは、タブバーとページ領域を提供します。

17

QDock

ドッキング可能ウィンドウは、フローティング状態のままにしたり、指定した位置でメインウィンドウに接続したりできるサブウィンドウです。 QMainWindowクラスのメインウィンドウオブジェクトには、ドッキング可能なウィンドウ用に予約された領域があります。

18

QStatusBar

QMainWindowオブジェクトは、ステータスバーとして下部に水平バーを予約します。 永続的またはコンテキストのステータス情報を表示するために使用されます。

19

QList

QListWidgetクラスは、リストに項目を追加または削除するための項目ベースのインターフェースです。 リスト内の各アイテムはQListWidgetItemオブジェクトです。 ListWidgetは複数選択可能に設定できます。

20

QScrollBar

スクロールバーコントロールを使用すると、ユーザーは表示可能領域外にあるドキュメントの部分にアクセスできます。 現在の位置を視覚的に表示します。

21

QCalendar

QCalendarウィジェットは、便利な日付選択コントロールです。 月単位のビューを提供します。 ユーザーはマウスまたはキーボードを使用して日付を選択できます。デフォルトは今日の日付です。

PyQt-QDialogクラス

*QDialog* ウィジェットは、ユーザーからの応答を収集するために主に使用されるトップレベルウィンドウを表示します。 *Modal* (親ウィンドウをブロックする)または *Modeless* (ダイアログウィンドウをバイパスできます)に構成できます。

PyQt APIには、InputDialog、FileDialog、FontDialogなどの多くの事前構成されたDialogウィジェットがあります。

次の例では、ダイアログウィンドウのWindowModality属性がモーダルかモードレスかを決定します。 ダイアログのいずれかのボタンをデフォルトに設定できます。 ユーザーがEscapeキーを押すと、ダイアログはQDialog.reject()メソッドによって破棄されます。

最上位のQWidgetウィンドウ上のプッシュボタンをクリックすると、ダイアログウィンドウが生成されます。 ダイアログボックスのタイトルバーには、最小化および最大化コントロールがありません。

WindowModalityがApplicationModalに設定されているため、ユーザーはこのダイアログボックスをバックグラウンドで委任できません。

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

def window():
   app = QApplication(sys.argv)
   w = QWidget()
   b = QPushButton(w)
   b.setText("Hello World!")
   b.move(50,50)
   b.clicked.connect(showdialog)
   w.setWindowTitle("PyQt Dialog demo")
   w.show()
   sys.exit(app.exec_())

def showdialog():
   d = QDialog()
   b1 = QPushButton("ok",d)
   b1.move(50,50)
   d.setWindowTitle("Dialog")
   d.setWindowModality(Qt.ApplicationModal)
   d.exec_()

if __name__ == '__main__':
   window()

上記のコードは、次の出力を生成します-

QDialogクラスの出力

PyQt-QMessageBox

*QMessageBox* は、いくつかの情報メッセージを表示し、オプションでユーザーに標準ボタンのいずれかをクリックして応答するように要求するために一般的に使用されるモーダルダイアログです。 各標準ボタンには、定義済みのキャプション、ロールがあり、定義済みの16進数を返します。

QMessageBoxクラスに関連付けられている重要なメソッドと列挙は、次の表に記載されています-

Sr.No. Methods & Description
1

setIcon()

メッセージの重大度に対応する事前定義されたアイコンを表示します

質問質問

情報情報

警告警告

クリティカルクリティカル

2

setText()

表示するメインメッセージのテキストを設定します

3

setInformativeText()

追加情報を表示します

4

setDetailText()

ダイアログには詳細ボタンが表示されます。 クリックするとこのテキストが表示されます

5

setTitle()

ダイアログのカスタムタイトルを表示します

6

setStandardButtons()

表示される標準ボタンのリスト。 各ボタンはに関連付けられています

QMessageBox.Ok 0x00000400

QMessageBox.Open 0x00002000

QMessageBox.Save 0x00000800

QMessageBox.Cancel 0x00400000

QMessageBox.Close 0x00200000

QMessageBox。はい0x00004000

QMessageBox.No 0x00010000

QMessageBox.Abort 0x00040000

QMessageBox.Retry 0x00080000

QMessageBox.Ignore 0x00100000

7

setDefaultButton()

ボタンをデフォルトとして設定します。 Enterが押されると、クリックされた信号を発します

8

setEscapeButton()

エスケープキーが押された場合にクリックされたものとしてボタンが処理されるように設定します

次の例では、トップレベルウィンドウのボタンの信号をクリックすると、接続された関数はメッセージボックスダイアログを表示します。

msg = QMessageBox()
msg.setIcon(QMessageBox.Information)
msg.setText("This is a message box")
msg.setInformativeText("This is additional information")
msg.setWindowTitle("MessageBox demo")
msg.setDetailedText("The details are as follows:")

setStandardButton()関数は、目的のボタンを表示します。

msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)

buttonClicked()シグナルは、シグナルのソースのキャプションを識別するスロット関数に接続されています。

msg.buttonClicked.connect(msgbtn)

例の完全なコードは次のとおりです-

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

def window():
   app = QApplication(sys.argv)
   w = QWidget()
   b = QPushButton(w)
   b.setText("Show message!")

   b.move(50,50)
   b.clicked.connect(showdialog)
   w.setWindowTitle("PyQt Dialog demo")
   w.show()
   sys.exit(app.exec_())

def showdialog():
   msg = QMessageBox()
   msg.setIcon(QMessageBox.Information)

   msg.setText("This is a message box")
   msg.setInformativeText("This is additional information")
   msg.setWindowTitle("MessageBox demo")
   msg.setDetailedText("The details are as follows:")
   msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
   msg.buttonClicked.connect(msgbtn)

   retval = msg.exec_()
   print "value of pressed message box button:", retval

def msgbtn(i):
   print "Button pressed is:",i.text()

if __name__ == '__main__':
   window()

上記のコードは、次の出力を生成します-

QMessageBox Output1 QMessageBox Output2

PyQt-複数ドキュメントインターフェイス

典型的なGUIアプリケーションには複数のウィンドウがあります。 タブ付きウィジェットとスタック済みウィジェットを使用すると、そのようなウィンドウを一度に1つアクティブにできます。 ただし、多くの場合、このアプローチは他のウィンドウの表示が非表示になるため、役に立たない場合があります。

複数のウィンドウを同時に表示する1つの方法は、それらを独立したウィンドウとして作成することです。 これはSDI(シングルドキュメントインターフェイス)と呼ばれます。 各ウィンドウには独自のメニューシステム、ツールバーなどがあるため、これにはより多くのメモリリソースが必要です。

MDI(Multiple Document Interface)アプリケーションは、より少ないメモリリソースを消費します。 サブウィンドウは、相互に関連してメインコンテナ内に配置されます。 コンテナウィジェットは QMdiArea と呼ばれます。

QMdiAreaウィジェットは通常、QMainWondowオブジェクトの中心ウィジェットを占有します。 この領域の子ウィンドウは、QMdiSubWindowクラスのインスタンスです。 QWidgetをsubWindowオブジェクトの内部ウィジェットとして設定することができます。 MDIエリアのサブウィンドウは、カスケード形式またはタイル形式で配置できます。

次の表は、QMdiAreaクラスとQMdiSubWindowクラスの重要なメソッドを示しています-

Sr.No. Methods & Description
1

addSubWindow()

MDIエリアにウィジェットを新しいサブウィンドウとして追加します

2

removeSubWindow()

サブウィンドウの内部ウィジェットであるウィジェットを削除します

3

setActiveSubWindow()

サブウィンドウをアクティブにします

4

cascadeSubWindows()

カスケード方式でMDiAreaのサブウィンドウを配置します

5

tileSubWindows()

MDiAreaのサブウィンドウをタイル状に配置します

6

closeActiveSubWindow()

アクティブなサブウィンドウを閉じます

7

subWindowList()

MDIエリアのサブウィンドウのリストを返します

8

setWidget()

QWidgetをQMdiSubwindowインスタンスの内部ウィジェットとして設定します

QMdiAreaオブジェクトはsubWindowActivated()シグナルを発行しますが、windowStateChanged()シグナルはQMdisubWindowオブジェクトによって発行されます。

次の例では、QMainWindowで構成される最上位ウィンドウにメニューとMdiAreaがあります。

self.mdi = QMdiArea()
self.setCentralWidget(self.mdi)
bar = self.menuBar()
file = bar.addMenu("File")

file.addAction("New")
file.addAction("cascade")
file.addAction("Tiled")

メニューのTriggered()シグナルはwindowaction()関数に接続されています。

file.triggered[QAction].connect(self.windowaction)

メニューの新しいアクションにより、MDIエリアにサブウィンドウが追加され、タイトルに増分番号が付けられます。

MainWindow.count = MainWindow.count+1
sub = QMdiSubWindow()
sub.setWidget(QTextEdit())
sub.setWindowTitle("subwindow"+str(MainWindow.count))
self.mdi.addSubWindow(sub)
sub.show()

メニューのカスケードボタンとタイルボタンは、現在表示されているサブウィンドウをそれぞれカスケード方式とタイル方式で配置します。

完全なコードは次のとおりです-

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MainWindow(QMainWindow):
   count = 0

   def __init__(self, parent = None):
      super(MainWindow, self).__init__(parent)
      self.mdi = QMdiArea()
      self.setCentralWidget(self.mdi)
      bar = self.menuBar()

      file = bar.addMenu("File")
      file.addAction("New")
      file.addAction("cascade")
      file.addAction("Tiled")
      file.triggered[QAction].connect(self.windowaction)
      self.setWindowTitle("MDI demo")

   def windowaction(self, q):
      print "triggered"

   if q.text() == "New":
      MainWindow.count = MainWindow.count+1
      sub = QMdiSubWindow()
      sub.setWidget(QTextEdit())
      sub.setWindowTitle("subwindow"+str(MainWindow.count))
      self.mdi.addSubWindow(sub)
      sub.show()

   if q.text() == "cascade":
      self.mdi.cascadeSubWindows()

   if q.text() == "Tiled":
      self.mdi.tileSubWindows()

   def main():
      app = QApplication(sys.argv)
      ex = MainWindow()
      ex.show()
      sys.exit(app.exec_())

   if __name__ == '__main__':
      main()

上記のコードは、次の出力を生成します-

Multiple Document Interface Output1 Multiple Document Interface Output2 Multiple Document Interface Output3

PyQt-ドラッグアンドドロップ

  • ドラッグアンドドロップ*の提供は、ユーザーにとって非常に直感的です。 ユーザーがオブジェクトをあるウィンドウから別のウィンドウにコピーまたは移動できる多くのデスクトップアプリケーションで見られます。

MIMEベースのドラッグアンドドロップデータ転送はQDragクラスに基づいています。 QMimeData オブジェクトは、データを対応するMIMEタイプに関連付けます。 クリップボードに保存され、ドラッグアンドドロッププロセスで使用されます。

次のQMimeDataクラス関数を使用すると、MIMEタイプを簡単に検出して使用できます。

Tester Getter Setter MIME Types
hasText() text() setText() text/plain
hasHtml() html() setHtml() text/html
hasUrls() urls() setUrls() text/uri-list
hasImage() imageData() setImageData() image/*
hasColor() colorData() setColorData() application/x-color

多くのQWidgetオブジェクトは、ドラッグアンドドロップアクティビティをサポートしています。 データのドラッグを許可するものには、trueに設定する必要があるsetDragEnabled()があります。 一方、ウィジェットは、ドラッグアンドドロップイベントに応答して、ドラッグされたデータを保存する必要があります。

  • DragEnterEvent は、ドラッグアクションが入力されるとターゲットウィジェットに送信されるイベントを提供します。
  • DragMoveEvent は、ドラッグアンドドロップアクションの進行中に使用されます。
  • ドラッグアンドドロップアクションがウィジェットを離れると、 DragLeaveEvent が生成されます。
  • 一方、 DropEvent は、ドロップが完了すると発生します。 イベントの提案されたアクションは、条件付きで承認または拒否できます。

次のコードでは、DragEnterEventはイベントのMIMEデータにテキストが含まれているかどうかを確認します。 「はい」の場合、イベントの提案されたアクションが受け入れられ、テキストがComboBoxの新しいアイテムとして追加されます。

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class combo(QComboBox):

   def __init__(self, title, parent):
      super(combo, self).__init__( parent)

      self.setAcceptDrops(True)

   def dragEnterEvent(self, e):
      print e

      if e.mimeData().hasText():
         e.accept()
      else:
         e.ignore()

   def dropEvent(self, e):
      self.addItem(e.mimeData().text())

class Example(QWidget):

   def __init__(self):
      super(Example, self).__init__()

      self.initUI()

   def initUI(self):
      lo = QFormLayout()
      lo.addRow(QLabel("Type some text in textbox and drag it into combo box"))

      edit = QLineEdit()
      edit.setDragEnabled(True)
      com = combo("Button", self)
      lo.addRow(edit,com)
      self.setLayout(lo)
      self.setWindowTitle('Simple drag & drop')

def main():
   app = QApplication(sys.argv)
   ex = Example()
   ex.show()
   app.exec_()

if __name__ == '__main__':
   main()

上記のコードは、次の出力を生成します-

ドラッグアンドドロップ出力

PyQt-データベース処理

PyQt APIには、多くのSQLベースのデータベースと通信するための精巧なクラスシステムが含まれています。 そのQSqlDatabaseは、Connectionオブジェクトを介したアクセスを提供します。 以下は現在利用可能なSQLドライバのリストです-

Sr.No. Driver Type & Description
1

QDB2

IBM DB2

2

QIBASE

Borland InterBaseドライバー

3

QMYSQL

MySQLドライバー

4

QOCI

Oracle Call Interfaceドライバー

5

QODBC

ODBCドライバー(Microsoft SQL Serverを含む)

6

QPSQL

PostgreSQLドライバー

7

QSQLITE

SQLiteバージョン3以降

8

QSQLITE2

SQLiteバージョン2

SQLiteデータベースとの接続は、静的メソッドを使用して確立されます-

db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')

QSqlDatabaseクラスの他のメソッドは次のとおりです-

Sr.No. Methods & Description
1

setDatabaseName()

接続が要求されるデータベースの名前を設定します

2

setHostName()

データベースがインストールされているホストの名前を設定します

3

setUserName()

接続用のユーザー名を指定します

4

setPassword()

接続オブジェクトのパスワードを設定します

5

commit()

トランザクションをコミットし、成功した場合はtrueを返します

6

rollback()

データベーストランザクションをロールバックします

7

close()

接続を閉じます

QSqlQueryクラスには、SQLコマンドを実行および操作する機能があります。 SQLクエリのDDLとDMLタイプの両方を実行できます。 クラスで最も重要なメソッドはexec_()です。これは、実行するSQLステートメントを含む文字列を引数として受け取ります。

query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key,
   " "firstname varchar(20), lastname varchar(20))")

次のスクリプトは、5人のレコードが入力されたsportspersonのテーブルを含むSQLiteデータベースsports.dbを作成します。

from PyQt4 import QtSql, QtGui

def createDB():
   db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
   db.setDatabaseName('sports.db')

   if not db.open():
      QtGui.QMessageBox.critical(None, QtGui.qApp.tr("Cannot open database"),
         QtGui.qApp.tr("Unable to establish a database connection.\n"
            "This example needs SQLite support. Please read "
            "the Qt SQL driver documentation for information "
            "how to build it.\n\n" "Click Cancel to exit."),
         QtGui.QMessageBox.Cancel)

      return False

   query = QtSql.QSqlQuery()

   query.exec_("create table sportsmen(id int primary key, "
      "firstname varchar(20), lastname varchar(20))")

   query.exec_("insert into sportsmen values(101, 'Roger', 'Federer')")
   query.exec_("insert into sportsmen values(102, 'Christiano', 'Ronaldo')")
   query.exec_("insert into sportsmen values(103, 'Ussain', 'Bolt')")
   query.exec_("insert into sportsmen values(104, 'Sachin', 'Tendulkar')")
   query.exec_("insert into sportsmen values(105, 'Saina', 'Nehwal')")
   return True

if __name__ == '__main__':
   import sys

   app = QtGui.QApplication(sys.argv)
   createDB()

PyQtのQSqlTableModelクラスは、単一のテーブルでレコードを読み書きするための編集可能なデータモデルを提供する高レベルインターフェイスです。 このモデルは、QTableViewオブジェクトを作成するために使用されます。 ユーザーに、トップレベルのウィンドウに配置できるスクロール可能かつ編集可能なビューを提供します。

QTableModelオブジェクトは、次の方法で宣言されています-

model = QtSql.QSqlTableModel()

その編集戦略は、次のいずれかに設定することができます-

QSqlTableModel.OnFieldChange All changes will be applied immediately
QSqlTableModel.OnRowChange Changes will be applied when the user selects a different row
QSqlTableModel.OnManualSubmit All changes will be cached until either submitAll() or revertAll() is called

次の例では、sportspersonテーブルがモデルとして使用され、戦略が次のように設定されています-

model.setTable('sportsmen')
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)

   model.select()

QTableViewクラスは、PyQtのModel/Viewフレームワークの一部です。 QTableViewオブジェクトは次のように作成されます-

view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view

このQTableViewオブジェクトと2つのQPushButtonウィジェットは、トップレベルのQDialogウィンドウに追加されます。 追加ボタンのClicked()シグナルは、モデルテーブルでinsertRow()を実行するaddrow()に接続されます。

button.clicked.connect(addrow)
def addrow():
   print model.rowCount()
   ret = model.insertRows(model.rowCount(), 1)
   print ret

削除ボタンに関連付けられたスロットは、ユーザーが選択した行を削除するラムダ関数を実行します。

btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))

完全なコードは次のとおりです-

import sys
from PyQt4 import QtCore, QtGui, QtSql
import sportsconnection

def initializeModel(model):
   model.setTable('sportsmen')
   model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
   model.select()
   model.setHeaderData(0, QtCore.Qt.Horizontal, "ID")
   model.setHeaderData(1, QtCore.Qt.Horizontal, "First name")
   model.setHeaderData(2, QtCore.Qt.Horizontal, "Last name")

def createView(title, model):
   view = QtGui.QTableView()
   view.setModel(model)
   view.setWindowTitle(title)
   return view

def addrow():
   print model.rowCount()
   ret = model.insertRows(model.rowCount(), 1)
   print ret

def findrow(i):
   delrow = i.row()

if __name__ == '__main__':

   app = QtGui.QApplication(sys.argv)
   db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
   db.setDatabaseName('sports.db')
   model = QtSql.QSqlTableModel()
   delrow = -1
   initializeModel(model)

   view1 = createView("Table Model (View 1)", model)
   view1.clicked.connect(findrow)

   dlg = QtGui.QDialog()
   layout = QtGui.QVBoxLayout()
   layout.addWidget(view1)

   button = QtGui.QPushButton("Add a row")
   button.clicked.connect(addrow)
   layout.addWidget(button)

   btn1 = QtGui.QPushButton("del a row")
   btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))
   layout.addWidget(btn1)

   dlg.setLayout(layout)
   dlg.setWindowTitle("Database Demo")
   dlg.show()
   sys.exit(app.exec_())

上記のコードは、次の出力を生成します-

データベース処理出力

PyQt-描画API

PyQtのすべての QWidget クラスは、QPaintDeviceクラスのサブクラスです。 QPaintDevice は、QPainterを使用して描画できる2次元空間の抽象化です。 ペイントデバイスの寸法は、左上隅からピクセル単位で測定されます。

QPainterクラスは、ウィジェットやプリンターなどの他のペイント可能なデバイスで低レベルのペイントを実行します。 通常、ウィジェットのペイントイベントで使用されます。 QPaintEvent は、ウィジェットの外観が更新されるたびに発生します。

ペインタはbegin()メソッドを呼び出すことでアクティブになり、end()メソッドは非アクティブにします。 その間に、次の表にリストされている適切な方法で、目的のパターンがペイントされます。

Sr.No. Methods & Description
1

begin()

ターゲットデバイスでペイントを開始します

2

drawArc()

開始角度と終了角度の間に円弧を描きます

3

drawEllipse()

長方形の内側に楕円を描画します

4

drawLine()

端点座標を指定して線を描画します

5

drawPixmap()

画像ファイルからピックスマップを抽出し、指定された位置に表示します

6

drwaPolygon()

座標の配列を使用してポリゴンを描画します

7

drawRect()

指定された幅と高さで左上の座標から始まる長方形を描画します

8

drawText()

指定された座標にテキストを表示します

9

fillRect()

QColorパラメーターで四角形を塗りつぶします

10

setBrush()

ペイントのブラシスタイルを設定します

11

setPen()

描画に使用するペンの色、サイズ、スタイルを設定します

PyQt-BrushStyle定数

定義済みのQColorスタイル

Qt.NoBrush No brush pattern
Qt.SolidPattern Uniform color
Qt.Dense1Pattern Extremely dense brush pattern
Qt.HorPattern Horizontal lines
Qt.VerPattern Vertical lines
Qt.CrossPattern Crossing horizontal and vertical lines
Qt.BDiagPattern Backward diagonal lines
Qt.FDiagPattern Forward diagonal lines
Qt.DiagCrossPattern Crossing diagonal lines

定義済みのQColorオブジェクト

Qt.white Qt.black Qt.red Qt.darkRed Qt.green Qt.darkGreen Qt.blue Qt.cyan Qt.magenta Qt.yellow Qt.darkYellow Qt.gray

RGB、CMYK、HSVの値を指定することにより、カスタムカラーを選択できます。

次の例は、これらのメソッドの一部を実装しています。

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Example(QWidget):

   def __init__(self):
      super(Example, self).__init__()
      self.initUI()

   def initUI(self):
      self.text = "hello world"
      self.setGeometry(100,100, 400,300)
      self.setWindowTitle('Draw Demo')
      self.show()

   def paintEvent(self, event):
      qp = QPainter()
      qp.begin(self)
      qp.setPen(QColor(Qt.red))
      qp.setFont(QFont('Arial', 20))

      qp.drawText(10,50, "hello Pyth
        on")
      qp.setPen(QColor(Qt.blue))
      qp.drawLine(10,100,100,100)
      qp.drawRect(10,150,150,100)

      qp.setPen(QColor(Qt.yellow))
      qp.drawEllipse(100,50,100,50)
      qp.drawPixmap(220,10,QPixmap("python.jpg"))
      qp.fillRect(200,175,150,100,QBrush(Qt.SolidPattern))
      qp.end()

def main():
   app = QApplication(sys.argv)
   ex = Example()
   sys.exit(app.exec_())

if __name__ == '__main__':
   main()

上記のコードは、次の出力を生成します-

BrushStyle Constants Output

PyQt-QClipboard

*QClipboard* クラスは、アプリケーション間でデータをコピーおよび貼り付ける簡単なメカニズムを提供するシステム全体のクリップボードへのアクセスを提供します。 そのアクションはQDragクラスに似ており、同様のデータ型を使用します。

QApplicationクラスには、クリップボードオブジェクトへの参照を返す静的メソッドclipboard()があります。 任意のタイプのMimeDataをクリップボードにコピーまたは貼り付けることができます。

以下は、一般的に使用されるクリップボードクラスメソッドです-

Sr.No. Methods & Description
1

clear()

クリップボードの内容を消去します

2

setImage()

QImageをクリップボードにコピーします

3

setMimeData()

MIMEデータをクリップボードに設定します

4

setPixmap()

クリップボードにPixmapオブジェクトをコピーします

5

setText()

クリップボードにQStringをコピーします

6

text()

クリップボードからテキストを取得します

クリップボードオブジェクトに関連付けられている信号は-

Sr.No. Method & Description
1

dataChanged()

クリップボードのデータが変更されるたび

次の例では、2つのTextEditオブジェクトと2つのプッシュボタンがトップレベルウィンドウに追加されます。

クリップボードオブジェクトから開始するには、インスタンス化されます。 texteditオブジェクトのCopy()メソッドは、システムのクリップボードにデータをコピーします。 [貼り付け]ボタンをクリックすると、クリップボードデータが取得され、他のtexteditオブジェクトに貼り付けられます。

QClipboard Output1 QClipboard Output2 QClipboard Output3

PyQt-QPixmapクラス

*QPixmap* クラスは、画像のオフスクリーン表示を提供します。 QPaintDeviceオブジェクトとして使用するか、別のウィジェット(通常はラベルまたはボタン)に読み込むことができます。

Qt APIには、I/Oおよびその他のピクセル操作用に最適化された別の同様のクラスQImageがあります。 一方、Pixmapは画面上に表示するために最適化されています。 どちらの形式も相互変換可能です。

QPixmapオブジェクトに読み込むことができる画像ファイルの種類は次のとおりです-

BMP Windows Bitmap
GIF Graphic Interchange Format (optional)
JPG Joint Photographic Experts Group
JPEG Joint Photographic Experts Group
PNG Portable Network Graphics
PBM Portable Bitmap
PGM Portable Graymap
PPM Portable Pixmap
XBM X11 Bitmap
XPM X11 Pixmap

次のメソッドは、QPixmapオブジェクトの処理に役立ちます-

Sr.No. Methods & Description
1

copy()

QRectオブジェクトからピックスマップデータをコピーします

2

fromImage()

QImageオブジェクトをQPixmapに変換します

3

grabWidget()

指定されたウィジェットからピックスマップを作成します

4

grabWindow()

ウィンドウにデータのピックスマップを作成する

5

Load()

画像ファイルをピックスマップとしてロードします

6

save()

QPixmapオブジェクトをファイルとして保存します

7

toImage

QPixmapをQImageに変換します

QPixmapの最も一般的な使用法は、ラベル/ボタンに画像を表示することです。

次の例は、setPixmap()メソッドを使用してQLabelに表示される画像を示しています。 完全なコードは次のとおりです-

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def window():
   app = QApplication(sys.argv)
   win = QWidget()
   l1 = QLabel()
   l1.setPixmap(QPixmap("python.jpg"))

   vbox = QVBoxLayout()
   vbox.addWidget(l1)
   win.setLayout(vbox)
   win.setWindowTitle("QPixmap Demo")
   win.show()
   sys.exit(app.exec_())

if __name__ == '__main__':
   window()

上記のコードは、次の出力を生成します-

QPixmapクラスの出力