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

 第2弾とか言ってる場合でもないのですが、 PyQtの湯けむりウィジェットツアーガイドもますます佳境に。 (行ってはいけない世界に)今度は少しだけツールぽく仕上げたつもりなので。

#! /usr/local/bin/python
import sys, os, string, time
from qt import *
from stat import *

class DirViewWidget(QWidget):

  def __init__(self, *args):
    apply(QWidget.__init__, (self,) + args)
    self.setCaption(self.tr("ディレクトリを見る"))
    self.resize(400, 200)

    hbdir = QHBox(self)
    hbdir.setSpacing(5)
    labdir = QLabel(hbdir)
    labdir.setText(self.tr("ディレクトリ"))
    self.txfdir = QLineEdit(hbdir)
    self.txfdir.resize(100, 28)
    cmddir = QPushButton(hbdir)
    cmddir.setText(self.tr("検索"))
    self.connect(cmddir, SIGNAL("clicked()"), self.search)
    hbdir.setGeometry(10, 40, 350, 30)

    self.lstfiles = QListBox(self)
    self.connect(self.lstfiles, SIGNAL("selectionChanged()"), self.selected)
    self.labfilei = QLabel(self)
    self.labfilei.setFont(QFont("fixed", 12, QFont.Normal))
    self.lstfiles.setGeometry(10,  80, 160, 110)
    self.labfilei.setGeometry(190, 80, 200, 110)

    mb = QMenuBar(self)
    mb.setGeometry(0, 0, 400, 32)

    self.ppf = QPopupMenu(self)
    self.ppf.insertTearOffHandle()
    self.ppf.insertItem(QString(self.tr("終了")), self.quit, 0)
    self.ppf.insertSeparator()

    mb.insertItem(QString(self.tr("ファイル")), self.ppf)

  def quit(self):
    ans = QMessageBox.information(self, self.tr("終わっち"),
          self.tr("終了しますか?"), "&OK", "&Cancel", None, 0, 1)
    # 4,5,6番目の引数はそれぞれダイアログにつけるボタンのテキストで、
    # Noneはボタンなしの意味です。7番目はEnterキーが押されたときの、
    # 8番目はEscapeキーが押されたときのアクションを担当するボタンの
    # 番号(0,1,2)を指定します。
    if ans == 0: self.close()

  def search(self):
    self.lstfiles.clear()
    dir = string.strip(str(self.txfdir.text()))
    if not os.path.isdir(dir):
      QMessageBox.information(self, self.tr("おおっと"),
        self.tr(dir + "はディレクトリではありません。"), "&OK", None, None,
        0, 0)
      return
    files = os.listdir(dir)
    for e in files:
      self.lstfiles.insertItem(e)

  def selected(self):
    e = os.path.join(str(self.txfdir.text()),
                     str(self.lstfiles.currentText()))
    s = os.stat(e)
    mode = "%04o" % s[ST_MODE]
    size = s[ST_SIZE]
    t = time.localtime(s[ST_MTIME])
    timespec = time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(s[ST_MTIME]))
    self.labfilei.setText(e + "\n" + "MODE\t" + mode +"\n" +
      "SIZE\t" + str(size) + "\n" + "T/S\t" + timespec)

a = QApplication(sys.argv)
a.setDefaultCodec(QTextCodec.codecForName("eucJP"))
a.setFont(QFont("Fixed", 12, QFont.Normal))
w = DirViewWidget()
a.setMainWidget(w)
w.show()
a.exec_loop()
# end.

 実行した例は下の通りです。 私のデスクトップでスナップしたのでウィンドウマネージャがSawfishになっていますが、 前のページと環境は特に違いはないです(PyQt 2.5 + Python 2.1 + Qt 2.3.1)。

スクリーンショット

どんなツールかというと、ディレクトリ名を入力して、「検索」 を押すと、ディレクトリ内のファイルの一覧がリストに表示されます。 そのどれかをクリックすると、そのファイルの情報が右下に表示されるというものです。

ちょっとメモ(8) - イエスorノーダイアログ
 先にも出てきたQMessageBoxによるダイアログですが、 「はい」「いいえ」のような質問をし、 結果を受け取る関数として使うこともできます。 ダイアログにはボタンを3つまでつけることができ、 それらに自由なテキストを表示することができます。
  ans = QMessageBox.information(self, self.tr("終わっち"),
        self.tr("終了しますか?"), "&OK", "&Cancel", None, 0, 1)
4,5,6番目の引数はそれぞれダイアログにつけるボタンのテキストで、 Noneはボタンなしの意味です。7番目はEnterキーが押されたときの、 8番目はEscapeキーが押されたときのアクションを担当するボタンの 番号(0,1,2)を指定します。 戻り値は、押されたボタンの位置(0,1,2)です。 つまりこの例では、「OK」が押されると零が、「Cancel」が押されると1が返されます。

ちょっとメモ(9) - ほんとのデフォルトのフォント
 PyQtを使うとすぐわかりますが、 日本語のフォントがデフォルトではかなりきちゃないです。 そこで、常にフォントを指定しないといけないのですが、 これが結構面倒です。下のようにアプリケーションQApplicationのメソッドsetFont を使うと、アプリケーションのデフォルトフォントを指定することができるので、 これを使うと便利です。
a.setFont(QFont("Fixed", 16, QFont.Normal))

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