ホーム >

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_() )

参考URL