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

 湯けむりウィジェットツアーも第5弾に突入しますが、 このあたりでQtの表現力のすさまじさを垣間見ることにしましょう。 あんまり近づくと危ないので、物陰からこっそり覗いてみるとして… Qtには、HTML文書を文字列、あるいはファイルとして読み込み、 Webブラウザのように表示してしまう、 高水準のウィジェットが存在します。 QTextViewはHTML文書の体裁通りの文字のサイズや色、 スタイルなどを反映した文書を表示できるラベルテキストの一種で、 そのQTextViewをさらに拡張したQTextBrowser はなんとリンクを辿って他の文書を表示したりもできてしまう、 まさにWebブラウザそのものという趣のウィジェットです(*1)。 また、 これらにはそれほど難しくないやり方で日本語のテキストも表示できる点もポイント高し。 使うしか!

(*1)ただし、Qtの開発陣のコメントによれば、 彼らはQtで本物のWebブラウザを作ってしまおうとしているわけではなく、 あくまでアプリケーションの高機能なヘルプをHTMLで記述できるようにとの意図で HTMLのリッチテキストビューアを作っている、ということのようです。


QTextView

 まずはじめは、QTextViewというウィジェットです。 これはHTMLなどのリッチテキストを表示できるものですが、 大きな制約としてハイパーテキストはたどることができません。 ハイパーテキスト機能をもたせるには、 後述のQTextBrowserを使う必要があります。

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

class HelloWidget(QWidget):

  def getSource(self, filename):
    fin = open(filename, "r")
    a = fin.read()
    fin.close()
    codec = QTextCodec.codecForName("eucJP")
    return codec.toUnicode(a)

  def __init__(self, *args):
    apply(QWidget.__init__, (self,) + args)
    self.setCaption(self.tr("テストだ"))
    tbra = self.tbra = QTextView(self)
    cmda = self.cmda = QPushButton(self.tr("終了"), self)

    msf = self.msf = QMimeSourceFactory()
    msf.setExtensionType("html", "text/html;charset=eucJP")
    msf.setExtensionType("htm", "text/html;charset=eucJP")
    a = QStringList(".")
    a.append("/win32/Wintools/Python20/Doc")
    msf.setFilePath(a)
    tbra.setMimeSourceFactory(msf)
    a = self.getSource("/win32/Wintools/Python20/Doc/index.html")
    tbra.setText(a)

    self.resize(600, 400)
    tbra.setGeometry(10, 10, 580, 340)
    cmda.setGeometry(520, 368, 60, 24);
    self.connect(self.cmda, SIGNAL("clicked()"), self.close)

a = QApplication(sys.argv)
codec = QTextCodec.codecForName("eucJP")
a.setDefaultCodec(codec)
w = HelloWidget()
a.setMainWidget(w)
w.show()
a.exec_loop()
# end.

 QTextViewと切り離せない関係にあるのが QMimeSourceFactoryです。 これは表示したいコンテンツの出所や性質などの情報をひとまとめに設定するもので、 大きな役割として

があります。
  tbra = self.tbra = QTextView(self)
  msf = self.msf = QMimeSourceFactory()
  msf.setExtensionType("html", "text/html;charset=eucJP")
  msf.setExtensionType("htm", "text/html;charset=eucJP")
  a = QStringList(".")
  a.append("/win32/Wintools/Python20/Doc")
  msf.setFilePath(a)
  tbra.setMimeSourceFactory(msf)
拡張子の対応づけは、 QMimeSourceFactoryのsetExtensionType()\ で行います。通常は、上のように、拡張子htm、htmlと「charset」 指定つきのtext/htmlを関連づけることになるでしょう。
注意点として、日本語EUCで書かれたHTML文書の場合、 charset=には「eucJP」と指定します。他の言語ツールなどに慣れている場合、 うっかり「EUC_JP」と書いてしまいがちですがこれは効かないので注意が必要です。
またファイルの検索パスは、 setFilePath()で設定します。 これは、HTMLで表示する画像などへのリンクが相対パスの場合、 それをどこを起点に検索するかを指定するものなので、 必ず使うことになるでしょう。

実際のファイルの内容の表示は、次のようにして行います。

  def getSource(self, filename):
    fin = open(filename, "r")
    a = fin.read()
    fin.close()
    codec = QTextCodec.codecForName("eucJP")
    return codec.toUnicode(a)

  a = self.getSource("/win32/Wintools/Python20/Doc/index.html")
  tbra.setText(a)


QTextBrowser

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

class HelloWidget(QWidget):

  def __init__(self, *args):
    apply(QWidget.__init__, (self,) + args)
    self.setCaption(self.tr("テストだ"))
    tbra = self.tbra = QTextBrowser(self)
    cmda = self.cmda = QPushButton(self.tr("終了"), self)

    # これ、まじでQtのマニュアルが表示できます。すげー!!
    # ファイルシステムをリンクでたどれるようにしてみる
    msf = self.msf = QMimeSourceFactory()
    msf.setExtensionType("html", "text/html;charset=eucJP")
    msf.setExtensionType("htm", "text/html;charset=eucJP")
    tbra.setMimeSourceFactory(msf)
    a = QStringList(".")
    a.append("/usr/local/qt-2.3.1/doc/html")
    a.append("../../../doc")
    msf.setFilePath(a)
    #tbra.setSource("tix11.html")
    tbra.setSource("classes.html")
    #tbra.setText(self.getSource("/usr/local/qt/doc/html/classes.html"))

    self.resize(600, 400)
    tbra.setGeometry(10, 10, 580, 340)
    cmda.setGeometry(520, 368, 60, 24);
    self.connect(self.cmda, SIGNAL("clicked()"), self.close)

a = QApplication(sys.argv)
codec = QTextCodec.codecForName("eucJP")
a.setDefaultCodec(codec)
w = HelloWidget()
a.setMainWidget(w)
w.show()
a.exec_loop()
# end.

 QTextBrowserも実はそんなに難しいことはありません。 QMimeSourceFactory の使い方はQTextViewの場合と同じで、 QTextBrowser.setSource()を使ってHTML文書を読み込んで表示します。 そのHTML文書がリンクを含む場合、画面をつついてみましょう。 ちゃんとジャンプできたら大成功です。

  msf = self.msf = QMimeSourceFactory()
  msf.setExtensionType("html", "text/html;charset=eucJP")
  msf.setExtensionType("htm", "text/html;charset=eucJP")
  tbra.setMimeSourceFactory(msf)
  a = QStringList(".")
  a.append("/usr/local/qt/doc/html")
  msf.setFilePath(a)
  tbra.setSource("classes.html")
↓見てみて! QtのHTMLマニュアルがこんな感じで表示できるのです。 カッコE!(死語)

スクリーンショット

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