ジャンル不定の日記です。

QML勉強中 (ListView編)

引き続き、QMLの勉強中。

Plasma5にしてRSSニュースリーダーがないから自分で作っちゃおうと思ってるわけなんだが、
RSS(等のFeed)をHTTPで取ってきてリスト表示って感じになると思うんで、リストの表示方法。
ListViewってのを使えばリストが表示できるようなんだが、書き方がたくさんあってリファレンスが難解・・・
まあ、なんとなくわかった。

main.qml
import QtQuick 2.0

ListView{
    ListModel{
        id:model
    ListElement{
            l:"1"
            r:1
        }
    ListElement{
            l:"2"
            r:2
        }
    ListElement{
            l:"3"
            r:3
        }
    }
    Component{
        id:component
        Row{
            spacing:10
            Text{text:l}
            Text{text:r*2}
        }
    }
    model:model
    delegate:component
}
こんな感じ。

完成するまでインストールはしない方が良さそうなんで、
$ qmlscene main.qml
でテスト実行。

ListViewにmodelとdelegateを指定する必要がある様で、
modelがリストのデータ。
delegateがカラムの表示方法定義。
って感じなのかな。

delegateにはComponent型のオブジェクトをidで渡してる。
Component型はただ定義してidを使って再利用するためのオブジェクトぽい。
なので、これはComponent型のオブジェクトを別途定義せずとも、delegateの指定部分に直接Row型オブジェクトを書いちゃってもいいみたい。

Row型は子を水平方向に並べて表示するオブジェクトで、spacingでカラム間を空けられるのでリストの行に良さそう。

modelに指定するのはmodel型オブジェクトのようで、テキストを表示するリストの場合はListModelが基本ぽいんだが、
オブジェクトではなく数値を渡すなんてこともでき、数値を指定した場合は指定数分の行ができ、delegateで指定したComponentの方で、indexって名前の変数でカウントできるぽい。

今回はListModelの子のListElementでlとrを定義して、Componentの方でrは*2してる。
lの方は"で囲んで文字型みたいにしたが、定義の際に型を指定しなければ文字型と数値型は同じぽい。
lの方を*2した場合も*2された。


目的のことをやるにはリストを動的更新しなければいけないが、
QML内にJavaScriptを書けるようなんで、JavaScriptからmodelにclear()とかappend()できるぽい。
なので、次はJavaScript関連をやってみる。

QMLのリファレンスとか

QMLのリファレンスは
http://doc.qt.io/qt-5/reference-overview.html
が公式でいいのかな?
見て勉強中。


ちょっとわかりにくい感じで理解するのに苦戦してるが、
QMLの中にJavaScriptのfunctionを書いてイベント駆動で呼び出してGUIに変更加えることができるらしい。

JavaScriptが使えるなら、localStorageとか使えると思うから、ほとんどの場合ファイルアクセスとかはせずにlocalStorageで足りそうかな。
というか、APIリファレンス見てファイルアクセス関連の機能は見当たらないような・・・

通信はXMLHttpRequestがクロスドメイン制約無しで使えるのかな?
XMLHttpRequestとlocalStorageが使えれば、ほとんどのことはQML+JavaScriptで足りそうだな。
APIにはWebSocketとかWebViewなんかがあるようなんだが、HTTP通信とかSocketなんかは見当たらない。


JavaScriptならWebで使うから、
JavaScriptのfunctionをQMLから呼び出して、JavaScript経由でGUIに変更を加える。
ってことができたら、いろいろすんなり作れそうだな。

Plasmoidの作り方

メイン環境をPlasma5に代えて困ったことの一つに、RSSでニュースの見出し並べる奴が無くなっちゃったんだよね・・・
Plasma内で配信されてる奴も確認して、RSSリーダー一つ発見したが、見出し並べるやつじゃなくてブラウザ的なやつだったんで違う。

で、自分でPlasmoid作れないか?
と考えて調べた。

情報が少なくて探すのに苦労したが、
QMLってスクリプト言語でGUIアプリが作れて、結構簡単そう。


作り方

  • ディレクトリを作る
  • metadata.desktop を作る
  • contents/ui/main.qml を作る
最低限必要なのは、テキストファイル2つだけ。
ディレクトリを指定してインストールするので、専用のディレクトリが必要で、その中に2つのファイルを作る。
main.qmの場所は指定できそうなんでuiディレクトリじゃなくても良さそうだが、 contentsの下である必要がありそう。

metadata.desktop
[Desktop Entry]
Name=Hello World
ServiceTypes=Plasma/Applet
Type=Service
X-KDE-PluginInfo-Author=My Name
X-KDE-PluginInfo-Email=mail@example.com
X-KDE-PluginInfo-Name=com.example.hello
X-KDE-PluginInfo-License=GPL
X-KDE-PluginInfo-Version=1.0
X-KDE-PluginInfo-Website=http://example.com/
X-Plasma-API=declarativeappletscript
X-Plasma-MainScript=ui/main.qml
普通の.desktopショートカットと似たようなもんかな?
X-Plasma-MainScriptでmain.qmlの場所指定と、X-KDE-PluginInfo-Nameでパッケージ名の指定が必要な感じかな。X-Plasma-APIも必須かも。
まあ、とりあえず上記な感じで作っとけば良さそう。
X-KDE-PluginInfo-Nameで指定してるパッケージ名はJavaなんかと同じでドメインの反対みたいにして重複しないようにする感じだね。
アイコンなんかも.desktopで指定できるぽい。

main.qml
import QtQuick 2.0

Item {
    Text {
        text: "Hello World!";
    }
}
文字表示だけ。


インストール

$ plasmapkg2 -i 作成したディレクトリ
ユーザー権限でインストールできる。
これでPlasmaの[Add Widget]で一覧に表示されるようになる。


アンインストール

$ plasmapkg2 -r パッケージ名
こっちもユーザー権限で。
パッケージ名がわからない場合は -l オプションで一覧が表示できる。



まだ文字表示だけだが、QMLでのアプリの作り方とかAPIリファレンスとか探せば良さそうかな。
QMLはUI関連だけで、処理はCとかで作るとか見たが、Perlと連携とかはできないだろうか。

Plasma5のパネル移動

Plasma5にした後、パネルを左サイドに置きたいのに移動方法がわからなくて、
パネルを複数出して左に出たパネルを使って残りは消す。
ってなことをやったんだが、
パネルの設定中に表示される「スクリーンエッジ」ってボタンをドラッグすれば移動できるのね。わかんねえよこれw

また一つPlasma5の問題が解決したw

Dolphinのダブルクリック

メイン環境をPlasma5にしてからの問題の一つで、
Dolphinのファイルやディレクトリがシングルクリックで開かれちゃうようになってて、Dolphinに設定項目が見つからなくて困ってたんだが、
Dolphinの設定ではなくKDEのシステム設定で、
システム設定 > 入力デバイス > マウス
で変更できることに気づいた。

今は標準がシングルみたいなんだが、シングルだと凄く使いにくいが、慣れれば問題ないのかな?
右クリック操作なんかでは慣れれば問題ない気はするが、範囲選択とか操作方法が限定されて不便だと思うんだが・・・
シングルクリックとダブルクリックなんか手間も変わらんし。