ホーム >
PyQt4
Hello world
from PyQt4.QtCore import *
from PyQt4.QtGui import *
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = QLabel("Hello PyQt4 world")
win.show()
sys.exit( app.exec_() )
シグナル・スロットの例
シグナルとスロットを接続するには、QObject.connect、SIGNAL及びSLOTを使用する。 SIGNAL及びSLOTに文字列を渡す点がC++版のQtと異なる。
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
self.quit_button = QPushButton("Quit", self)
layout = QHBoxLayout()
layout.addWidget(self.quit_button)
self.setLayout(layout)
QObject.connect(self.quit_button, SIGNAL("clicked()"),
qApp, SLOT("quit()"))
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = MyWidget()
win.show()
sys.exit( app.exec_() )
独自のスロットの定義
独自のスロットを定義するには、pyqtSignatureデコレータを使用する。
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
self.ok_button = QPushButton("ok", self)
layout = QHBoxLayout()
layout.addWidget(self.ok_button)
self.setLayout(layout)
QObject.connect(self.ok_button, SIGNAL("clicked()"),
self, SLOT("on_ok_button_clicked()"))
@pyqtSignature("")
def on_ok_button_clicked(self):
print "OK"
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = MyWidget()
win.show()
sys.exit( app.exec_() )
シグナル・スロットでPythonオブジェクトをやり取りする
Qtのシグナル・スロットでPythonオブジェクトをやりとりする場合、 PyQt_PyObjectという名前のタイプを用いる。
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
self.ok_button = QPushButton("ok", self)
layout = QHBoxLayout()
layout.addWidget(self.ok_button)
self.setLayout(layout)
QObject.connect(self.ok_button, SIGNAL("clicked()"),
self, SLOT("slot1()"))
QObject.connect(self, SIGNAL("emit_python_list(PyQt_PyObject)"),
self, SLOT("slot2(PyQt_PyObject)"))
@pyqtSignature("")
def slot1(self):
self.emit( SIGNAL("emit_python_list(PyQt_PyObject)") , [1, 2, 3])
@pyqtSignature("PyQt_PyObject")
def slot2(self, arg):
print "arg = %s" % arg
新スタイルのシグナル・スロット接続
上記のシグナル・スロットAPIはC++QtのAPIとの親和性は高いが、 シグナルが発行するC++の型を知っている必要があるなど、 必ずしもPythonプログラマが使いやすいAPIにはなっていない。
PyQtのv4.5から新スタイルのシグナル・スロットAPIが利用可能である。 新スタイルでは、シグナルの接続を
シグナル発行オブジェクト.シグナル名.connect(接続側オブジェクト.[スロット名 or シグナル名])
で行う。例えば、quit_buttonのclickedシグナルにqAppオブジェクトのquitスロットを接続する場合、 以下のように書く。
self.quit_button.clicked.connect(qApp.quit)
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
self.quit_button = QPushButton("Quit", self)
layout = QHBoxLayout()
layout.addWidget(self.quit_button)
self.setLayout(layout)
self.quit_button.clicked.connect(qApp.quit)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = MyWidget()
win.show()
sys.exit( app.exec_() )
旧スタイルではスロットの定義にpyqtSignatureデコレータを必要としていたが、 新スタイルではpyqtSignatureを必要とせず、任意のcallableオブジェクトをスロットにすることができる。
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
self.ok_button = QPushButton("ok", self)
layout = QHBoxLayout()
layout.addWidget(self.ok_button)
self.setLayout(layout)
self.ok_button.clicked.connect(self.on_ok_button_clicked)
def on_ok_button_clicked(self):
print "OK"
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = MyWidget()
win.show()
sys.exit( app.exec_() )
シグナルを発行する場合は、シグナル.emit(引数)とする。 また、独自のシグナルを定義する場合、クラス定義の中でpyqtSignal関数を用いる。 定義するシグナルが引数を持つ場合、pyqtSignal関数にその型を渡す。
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWidget(QWidget):
# シグナルの定義
emit_python_list = pyqtSignal(object)
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
self.ok_button = QPushButton("ok", self)
layout = QHBoxLayout()
layout.addWidget(self.ok_button)
self.setLayout(layout)
self.ok_button.clicked.connect(self.slot1)
self.emit_python_list.connect(self.slot2)
def slot1(self):
self.emit_python_list.emit([1, 2, 3])
def slot2(self, arg):
print "arg = %s" % arg
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = MyWidget()
win.show()
sys.exit( app.exec_() )