ページの作成:「== 概要 == <br><br> == 画面の表示 == まず、PyQtで基本となるものは、画面を表示することである。<br> 以下のサンプルコードでは…」 |
細 文字列「</source>」を「</syntaxhighlight>」に置換 |
||
| (同じ利用者による、間の5版が非表示) | |||
| 5行目: | 5行目: | ||
== 画面の表示 == | == 画面の表示 == | ||
まず、PyQtで基本となるものは、画面を表示することである。<br> | まず、PyQtで基本となるものは、画面を表示することである。<br> | ||
以下のサンプルコードでは、<code>QWidget</code>クラスを使用して画面のみを表示している。<br> | |||
< | <syntaxhighlight lang="python"> | ||
# - * - coding: utf8 - * - | # - * - coding: utf8 - * - | ||
| 36行目: | 36行目: | ||
if __name__ == "__main__": | if __name__ == "__main__": | ||
main() | main() | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 43行目: | 43行目: | ||
ステータスバーには、現在の画面内の情報等を表示することが可能である。<br> | ステータスバーには、現在の画面内の情報等を表示することが可能である。<br> | ||
<br> | <br> | ||
上記のセクションでは、<code>QWidget</code>クラスを継承したMyWindowクラスを作成して画面を表示しているが、<br> | |||
ステータスバーを表示するには、<code>QMainWindow</code>クラスを継承して画面を作成する必要がある。<br> | |||
<br> | <br> | ||
<code>QWidget</code>クラスや<code>QDialog</code>クラスを使用して画面を作成することもできるが、<br> | |||
メイン画面においては<code>QMainWindow</code>クラスを使用することを推奨する。<br> | |||
それは、<u><code>QMainWindow</code>クラスは、以下に示すメイン画面を作成するための機能を提供しているからである。</u><br> | |||
* メニューバー | * メニューバー | ||
* ツールバー | * ツールバー | ||
| 53行目: | 54行目: | ||
* 中央ウィジェット | * 中央ウィジェット | ||
* ステータスバー | * ステータスバー | ||
<br> | |||
以下のサンプルコードでは、ステータスバーを表示している。<br> | 以下のサンプルコードでは、ステータスバーを表示している。<br> | ||
< | <syntaxhighlight lang="python"> | ||
# - * - coding: utf8 - * - | # - * - coding: utf8 - * - | ||
| 62行目: | 63行目: | ||
from PyQt5.QtWidgets import * | from PyQt5.QtWidgets import * | ||
# | # QMainWindowクラスの使用 | ||
class MyWindow( | class MyWindow(QMainWindow): | ||
def __init__(self, parent=None): | def __init__(self, parent=None): | ||
| 85行目: | 86行目: | ||
if __name__ == "__main__": | if __name__ == "__main__": | ||
main() | main() | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
以下のサンプルコードでは、ステータスバーにデジタル時計を表示している。<br> | 以下のサンプルコードでは、ステータスバーにデジタル時計を表示している。<br> | ||
< | <syntaxhighlight lang="python"> | ||
# - * - coding: utf8 - * - | # - * - coding: utf8 - * - | ||
| 97行目: | 98行目: | ||
from PyQt5.QtWidgets import * | from PyQt5.QtWidgets import * | ||
# | # QMainWindowクラスの使用 | ||
class MyWindow( | class MyWindow(QMainWindow): | ||
def __init__(self, parent=None): | def __init__(self, parent=None): | ||
| 129行目: | 130行目: | ||
if __name__ == "__main__": | if __name__ == "__main__": | ||
main() | main() | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
上記のサンプルコードでは、シグナルとスロットと呼ばれる機能を使用している。<br> | 上記のサンプルコードでは、シグナルとスロットと呼ばれる機能を使用している。<br> | ||
オブジェクトは、何らかのイベントが生じた際にシグナルを発生させて、それをスロットの関数が受け取ることで画面上の情報を更新することができる。<br> | オブジェクトは、何らかのイベントが生じた際にシグナルを発生させて、それをスロットの関数が受け取ることで画面上の情報を更新することができる。<br> | ||
ここでは、QTimerのインスタンスを生成した後、timeoutシグナルに対してgetDateTimeメソッドをスロットとして呼び出して、それらをconnectで結び付けている。<br> | ここでは、QTimerのインスタンスを生成した後、timeoutシグナルに対してgetDateTimeメソッドをスロットとして呼び出して、それらをconnectで結び付けている。<br> | ||
< | <syntaxhighlight lang="python"> | ||
timer = QTimer(self) | timer = QTimer(self) | ||
timer.timeout.connect(self.getDateTime) | timer.timeout.connect(self.getDateTime) | ||
timer.start(1000) | timer.start(1000) | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 146行目: | 147行目: | ||
以下のサンプルコードでは、メニューバーと[ファイル]メニューおよび[終了]サブメニューを表示して、<br> | 以下のサンプルコードでは、メニューバーと[ファイル]メニューおよび[終了]サブメニューを表示して、<br> | ||
[終了]サブメニューにソフトウェアを終了するメニューバーアクションを定義している。<br> | [終了]サブメニューにソフトウェアを終了するメニューバーアクションを定義している。<br> | ||
< | <syntaxhighlight lang="python"> | ||
# - * - coding: utf8 - * - | # - * - coding: utf8 - * - | ||
| 154行目: | 155行目: | ||
from PyQt5.QtWidgets import * | from PyQt5.QtWidgets import * | ||
# | # QMainWindowクラスの使用 | ||
class MyWindow( | class MyWindow(QMainWindow): | ||
def __init__(self, parent=None): | def __init__(self, parent=None): | ||
| 192行目: | 193行目: | ||
if __name__ == "__main__": | if __name__ == "__main__": | ||
main() | main() | ||
</ | </syntaxhighlight> | ||
<br><br> | |||
== レイアウト == | |||
PyQtのレイアウトは、QHBoxとQVBoxの2種類(縦(horizon)と横(vertical))が存在する。<br> | |||
指定が無い場合、QHBox(縦のレイアウト)が自動的に配置される。<br> | |||
<br> | |||
以下のサンプルコードにおいて、13行目の<code>self.upper.stateChanged.connect(self.uppercase)</code>では、<br> | |||
<code>connect</code>により、"Upper"チェックボックスにチェックが入っている時、<code>uppercase</code>関数にコネクトする。<br> | |||
<br> | |||
<code>addWiget</code>関数では、upper_aチェックボックスとupper_bチェックボックスを指定している。<br> | |||
また、<code>addWiget</code>関数では、<code>vertical</code>を指定している。<br> | |||
<br> | |||
<code>vertical</code>には<code>QVBoxLayout(縦のレイアウト)</code>を指定しているので、チェックボックスが縦に並ぶ。<br> | |||
グループ化されていないので、複数のチェックボックスを選択することができる。<br> | |||
<br> | |||
36行目において、チェックボックスにチェックが入力されていない時は、<br> | |||
<code>removeWiget</code>関数により、チェックを入力するたびにチェックボックスが追加される現象を防いでいる。<br> | |||
<syntaxhighlight lang="python"> | |||
import sys | |||
import sip | |||
from PyQt5.QtCore import * | |||
from PyQt5.QtWidgets import * | |||
class MainWindow(QWidget): | |||
def __init__(self, parent=None): | |||
super(MainWindow, self).__init__(parent) | |||
# 上のチェックボックス | |||
self.upper = QCheckBox('Upper', self) | |||
self.upper.move(100, 30) | |||
self.upper.stateChanged.connect(self.uppercase) | |||
# 横のレイアウト | |||
self.horizon = QHBoxLayout() | |||
# 縦のレイアウト | |||
self.vertical = QVBoxLayout() | |||
self.horizon.addLayout(self.vertical) | |||
self.setLayout(self.horizon) | |||
self.setGeometry(300, 50, 400, 350) | |||
self.setWindowTitle('QCheckBox') | |||
def uppercase(self): | |||
if(self.upper.isChecked()): | |||
self.upper_a = QCheckBox('A', self) | |||
self.vertical.addWidget(self.upper_a) | |||
self.upper_b = QCheckBox('B', self) | |||
self.vertical.addWidget(self.upper_b) | |||
else: | |||
self.vertical.removeWidget(self.upper_a) | |||
self.vertical.removeWidget(self.upper_b) | |||
if __name__ == '__main__': | |||
App = QApplication(sys.argv) | |||
Window = MainWindow() | |||
Window.show() | |||
sys.exit(App.exec_()) | |||
</syntaxhighlight> | |||
<br> | |||
以下のサンプルコードでは、QPushButtonを追加して、ボタンの押下時のイベントをoutput関数にコネクトしている。<br> | |||
output関数では、各チェックボックスにチェックが入力されている時、それぞれ文字Aと文字Bをコンソールに出力している。<br> | |||
<syntaxhighlight lang="python"> | |||
import sys | |||
import sip | |||
from PyQt5.QtCore import * | |||
from PyQt5.QtWidgets import * | |||
class MainWindow(QWidget): | |||
def __init__(self, parent=None): | |||
super(MainWindow, self).__init__(parent) | |||
# 一つ目のチェックボックス | |||
self.upper = QCheckBox('Upper', self) | |||
self.upper.move(100, 30) | |||
self.upper.stateChanged.connect(self.uppercase) | |||
# 横のレイアウト | |||
self.horizon = QHBoxLayout() | |||
# 縦のレイアウト | |||
self.vertical = QVBoxLayout() | |||
# ボタンの追加 | |||
self.button = QPushButton('コンソールに出力', self) | |||
self.button.clicked.connect(self.output) | |||
self.horizon.addLayout(self.vertical) | |||
self.setLayout(self.horizon) | |||
self.setGeometry(300, 50, 400, 350) | |||
self.setWindowTitle('QCheckBox') | |||
def uppercase(self): | |||
if(self.upper.isChecked()): | |||
self.upper_a = QCheckBox('A', self) | |||
self.vertical.addWidget(self.upper_a) | |||
self.upper_b = QCheckBox('B', self) | |||
self.vertical.addWidget(self.upper_b) | |||
else: | |||
self.vertical.removeWidget(self.upper_a) | |||
self.vertical.removeWidget(self.upper_b) | |||
def output(self): | |||
outputs = [] | |||
if(self.upper_a.isChecked()): | |||
outputs.append("A") | |||
if(self.upper_b.isChecked()): | |||
outputs.append("B") | |||
for output in outputs: | |||
print(output) | |||
if __name__ == '__main__': | |||
App = QApplication(sys.argv) | |||
Window = MainWindow() | |||
Window.show() | |||
sys.exit(App.exec_()) | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:Python]] | [[カテゴリ:Python]] | ||