[PR]テレビ番組表
今夜の番組チェック


PyQt湯けむりウィジェットツアー(第4弾)

 今度のウィジェットツアーはちょっと複雑で高度なウィジェットに挑戦してみます。 QListViewは左半分の折り畳み可能なツリー部と右半分の行列状の表示が可能なデータ部からなる複雑なウィジェットですが、 基本的な使い方はすぐ理解できるので、 山ほどあるメソッドやシグナルについては後からマニュアルを見ながらでも十分作れると思います。
 ソースプログラムとスクリーンショットをまずご覧頂きましょう。

#! /usr/local/bin/python
import sys
from qt import *

class MyWidget(QWidget):

  def __init__(self, *args):
    apply(QWidget.__init__, (self,) + args)
    self.setCaption(self.tr("つよさをみる"))
    self.lsva = QListView(self)
    self.connect(self.lsva, SIGNAL("selectionChanged(QListViewItem*)"),
                 self.selectionChanged)
    cmda = QPushButton(self.tr("決定"), self)
    self.connect(cmda, SIGNAL("clicked()"), self.selected)
    cmde = QPushButton(self.tr("終了"), self)
    self.connect(cmde, SIGNAL("clicked()"), self.close)
    self.resize(350, 220);
    self.lsva.setGeometry(5, 5, 340, 180)
    cmda.setGeometry(205, 190, 40, 25)
    cmde.setGeometry(255, 190, 40, 25)

    self.lsva.setRootIsDecorated(1)
    for e in ('名前', 'ちから', 'すばやさ',
              'かしこさ', 'あやしさ', 'ずぶとさ'):
      self.lsva.addColumn(self.tr(e))

    self.lvitops = { }
    for e in ['1年1組', '1年2組']:
      self.lvitops[e] = QListViewItem(self.lsva, self.tr(e))

    a = QListViewItem(self.lvitops['1年1組'],
        self.tr("まつお"), "40", "32", "25", "50", "48")
    a = QListViewItem(self.lvitops['1年1組'],
        self.tr("たけお"), "28", "46", "31", "23", "25")
    a = QListViewItem(self.lvitops['1年1組'],
        self.tr("うめお"), "54", "14", "22", "36", "63")
    a = QListViewItem(self.lvitops['1年2組'],
        self.tr("さけお"), "46", "19", "29", "34", "40")
    a = QListViewItem(self.lvitops['1年2組'],
        self.tr("ますお"), "62", "27", "40", "51", "45")
    a = QListViewItem(self.lvitops['1年2組'],
        self.tr("かつお"), "35", "44", "54", "37", "26")

  def selectionChanged(self, *args):
    print str(QString.local8Bit(args[0].text(0))) + "が選択されました。"

  def selected(self, *args):
    s = self.lsva.currentItem().text(0)
    QMessageBox.information(self, "",
        s.append(self.tr("が選択されました。")), "&OK", None, None, 0, 0)

a = QApplication(sys.argv)
a.setDefaultCodec(QTextCodec.codecForName("eucJP"))
a.setFont(QFont("fixed", 10, QFont.Normal))
w = MyWidget()
a.setMainWidget(w)
w.show()
a.exec_loop()
# end.

スクリーンショット

 QListViewのすごいところは、 デフォルト設定でも既に十分使いこなせる外見動作になっていることで、 例えば(QListBoxなどと同様) ツリーの項目の数が画面に収まらないほど増えれば、 自動的にスクロールバーが縦横につきますし、 データ部の上の列見出しの部分をクリックすれば、 その列を基準にデータを昇順にソートすることができます。 つまりこの例では、「ちから」見出しをクリックすれば力のある順に、 「あやしさ」見出しをクリックすれば怪しさのある順に(いやだなあ) 各サブツリーを構成する各項目が自動的にソートされます。 もちろん、 これらのデフォルト動作はQListViewのメソッドを使って細かく設定できます。
 QListViewに項目を追加していく手順は次の通りです。

  1. QListViewのオブジェクトを作り、画面に配置する。
      self.lsva = QListView(self)
    
  2. QListViewのaddColumnメソッドで、 データ部の列を必要な数だけ追加する。
      self.lsva.addColumn(self.tr("名前"))
      self.lsva.addColumn(self.tr("ちから"))
    
  3. QListViewツリーの根に直結する項目を作るため、 QListViewのオブジェクト自身を親ウィジェットとする QListViewItemのオブジェクトを作成する。
      for e in ['1年1組', '1年2組']:
        self.lvitops[e] = QListViewItem(self.lsva, self.tr(e))
    
  4. 他の項目のサブツリーにぶら下がる項目を作るため、 他のQListViewItemオブジェクトを親ウィジェットとする QListViewItemのオブジェクトを作成する。
      a = QListViewItem(self.lvitops['1年1組'],
          self.tr("まつお"), "40", "32", "25", "50", "48")
    

セクションのサブメニューに戻る
(first uploaded 2000/12/10 last updated 2002/03/21)