スキップしてメイン コンテンツに移動

QTableView で表を表示してみる

タイトルは駄洒落を狙っているわけではありません。
こんばんわ SakuraCrowd です。

今回は今作っているソフトの経過報告です。
最近のブログのパターンは、
「XXX作ったよ。これがスクリーンショットね。あとこんなこと思ったよ。」
という流れですが、
今日はできていないソフトの部分的な話なので、
いつもよりもプログラムちっくな話になると思います。(´Ծ_Ծ´)メガネノトキハマジメブッテル

QTableView GUIライブラリ Qt のクラスです。
それを Python で使うための PySide というライブラリを使っています。
某表計算ソフト っぽい表の GUI です。

このデータの日付が 09/01 なのでおそらくその日に
  QTableView 使うぞ!(`・ω・´)
とサンプルデータを作ったのでしょう。

Qt Designer という GUI エディタを使うとポトペタでウィンドウを設計できます。
選択できる GUI の中に QTableView QTableWidget があります。
どちらも上のような表の GUI です。

QTableWidget簡単に値をいれたりできます。
Qt Designer 上で直接編集することができるので、
サンプルの表を簡単に作ることができます。
それに対して、 QTableView は Qt Designer 上では値を編集できません。たぶん。

QTableView の強みは MVC の構造を使えることです。
名前のとおり QTableView は View です。
これにデータを管理している Model オブジェクトを設定して使います。
Model クラスを作る手間がかかりますが、 GUI の細かな操作をしなくても Model に応じた表を表示してくれます。

Model は QAbstractTableModel継承して作ります。
コンストラクタで基底クラスの処理を呼び出し、いくつかの純粋仮想関数をオーバーライドします。

def __init__(self, parent=None, *args):
    QtCore.QAbstractTableModel.__init__(self, parent, *args)
    #自前の処理

def rowCount(self, parent):
    return 行数

def columnCount(self, parent):
    return 列数

def data(self, index, role):
    return index の指すデータの値

rowCount と columnCount はすぐにわかると思いますが、表の行数と列数を返します。

data 関数はちょっと面倒でした。
index はただの要素番号ではなく QModelIndex というクラスのオブジェクトです。
2 次元の座標を表したり、いろいろとメソッドがあります。
行番号と列番号を得るだけならば index.row() と index.column() で取得できます。
role はまだ QtCore.Qt.DisplayRole しか使っていないのですが、要するに表示用のデータとか編集用のデータとか同じセルでもほしいデータの種類がいくつかあるみたいです。
それに応じてそのセルの値を返します。


さらに data メンバ関数は返す値も少しとまどいました。
古い資料などでは QVariant オブジェクトを返すようになっていますが、
そんなクラスはないとエラーになります。
現在は廃止されたようです。
#なんか封印されし古(いにしえ)のクラスってかっこいいかも。
現在は python のプリミティブ型を返したい型に応じて返します。
文字列が返したければ文字列型、無効ならば None を返します。

こんな感じでデータを管理するモデルを作って、 QTableView の setModel でモデルを設定すればデータを上の画像のように表示してくれます。

本当は行の追加と削除も書きたかったのですが、説明が下手で長くなってきたのでとりあえずここまでにします。
ちょっとしたツールを作るつもりが、それで1ヶ月経過とか普通にあるよね?普通だよね?それじゃーまた(´;ω;`)ノシ

コメント

このブログの人気の投稿

HSPで画像の重ね合わせをしてみた

あいにくの曇り空だったが、 スーパームーン を少し見ることができた。 なんとなくだが、月明かりがいつもよりも強い気がする。 中秋の名月とほぼ同時に月が地球に 接近するのは稀らしいので何かありがたい(-人-) 先週ブログを書いていたときに、 ハロウィン にちなんだゲームを作りたいなー と思っていて、ふわっとした企画を考えて、少し作り始めた。 まだできるかどうかわからないけど、初めて HSP で絵を出せたのがうれしいのでブログを書いてみる。 HSP 自体はだいぶ前から知っていて、ちょっとしたGUIのツールを作ったりしていた。 GUIアプリケーションをここまで短く実装できる言語は自分の中ではこれが一番だと思う。 もっと短くできるかもしれないが、ビギナーな私でもこのくらい短くかける。 screen 0, 160, 64 // ウィンドウ作成 button "greet", *OnGreet // ボタン作成&イベント関連付け stop *OnGreet // イベント dialog "Hello!" stop バージョンアップして今では WebGL や  iOS や Android でも実行できる。 そのときは HSP3Dish という環境を使うために  #include "hsp3dish.as"  でスクリプトを読み込む。  参照: HSP3Dish プログラミングマニュアル・基本仕様ガイド 制限として、拡張プラグインやCOM/Variant型や外部DLL呼び出しやモジュール変数については未サポートのようだ。 ゲームでスプライトを用いるため es_set などのスプライト用の関数を使いたかったが、これは hspdx という拡張プラグインなので HSP3Dish には対応していないと思う。 そんな理由から、スプライト系の処理を自作しようと思う。 先週ちまちまとドット絵を描いたので、それを HSP のウィンドウに描画してみた。 なんかドット絵を作っている最中は、わりと良く思えたのに、 ウィンドウに出してみると何か微妙 (´・ω・`) ちなみに、キャラは4コマにも描いている大砲ゲーム「お団子キャノン」に出てくるキャラクターだ。 キャラの...

LibreOffice Writer 文書の差分 (WinMerge x TortoiseGit) + 社畜PCの原因と対策

お久しぶりです。皆様におかれましてはお風邪などをひかれてはいませんでしょうか。 春と秋だけあればいいのにヽ(`Д´)ノとつい思ってしまう SakuraCrowd です。 今日はいつものような製作日記ではなく、ちょっとした役立つメモを書きました。 タイトルにもあるとおり、 TortoiseGit への WinMerge の導入の仕方です。 今まではソースコードくらいしか差分で確認しなかったので、 TortoiseGit 標準の Diff ツールで問題なかったのですが、 LibreOffice の Writer が最近自分の中で便利だと話題になっていて、それを差分表示するためにちょっと調べてみました。 #Writer は、文章書いて、ちょっと絵をいれたり表を作るのに便利だと思います。 #リッチテキストのエディタを探していて、これが一番よさそうな気がしたので使ってます。 それとブログを書くときはあまり長く書かないつもりだった、 Win7 PC が社畜PCになってしまった際の原因と対策も後半に書きました。割と有用な情報かもしれませんので、時間がありましたらご覧下さい。 まずは TortoiseGit で Writer の odt ファイルを管理して、差分も普通に表示させる方法です。 WinMerge(+plugin) 導入手順 すでに TortoiseGit はインストールしてある前提ではなします。 1.信頼と実績の窓の杜様から WinMerge 日本語版をダウンロードします。 WinMerge - 窓の杜ライブラリ 私の PC は 64 ビット版なのでそちらを選びました。 2.WinMerge をインストールします。 フォルダを指定し普通にインストールできます。 インストール直前の設定で TortoiseGit をチェックしておくと自動的に TortoiseGit の利用する Diff ツールの設定を置き換えてくれるようです。 これの設定は TortoiseGit の設定の Diff ツールの項目で確認できます。 3.LibreOffice Writer のファイルを読むためのプラグインをダウンロードします。 ぐぐって出てくる英語版のDLサイトは応答がなかったりしましたが、日本...