KXMLActionEditor

はじめに

KDEではアクションをベースにするとアクション関連のGUI部分(メニューバー・ツールバー)を静的に表現できるようになります。
これは動きと見た目を分離するという意味でアプリケーション開発にとってとても意義のあることです。
KActionEditorをベースにメニューバー・ツールバーのXML化を行ってみましょう。
アプリケーション名はKXMLActionEditorとします。

標準のアクション

まずはじめにsetupActionを以下のものに書き換えてみましょう。

KStdAction::openNew( this, SLOT( slotFileNew() ), actionCollection() );
KStdAction::open( this, SLOT( slotFileOpen() ), actionCollection() );
KStdAction::save( this, SLOT( slotFileSave() ), actionCollection() );
KStdAction::saveAs( this, SLOT( slotFileSaveAs() ), actionCollection() );
KStdAction::quit( this, SLOT( close() ), actionCollection() );

KStdAction::cut( txtEdit, SLOT( cut() ), actionCollection() );
KStdAction::copy( txtEdit, SLOT( copy() ), actionCollection() );
KStdAction::paste( txtEdit, SLOT( paste() ), actionCollection() );
KStdAction::undo( txtEdit, SLOT( undo() ), actionCollection() );
KStdAction::redo( txtEdit, SLOT( redo() ), actionCollection() );

createGUI();

createGUI関数を使うために<kxmlguifactory.h>を新たにインクルードします。

# include <kxmlguifactory.h>

いきなりですがこの状態でコンパイルして実行してみましょう。
驚いたことにKActionEditorほぼ同じような見た目になるはずです。
createGUI()を使うと全ての標準アクションは自動的にKDEの標準の場所に表示されるようになります。
ここで分かることはKActionEditorではセパレータの位置や編集メニューの順番がKDEの標準の定義と違っていたということです。
それからツールバーが一つになっていますが、あまり細かいことは気にしないようにしましょう。

標準以外のアクション

次に、標準以外のアクションについてですが、これを表示させるためにソースに以下の行を追加します。

new KAction( i18n("&Test"), BarIcon("test"), KShortcut(), this, SLOT( slotTest() ), actionCollection(), "test" );

newの返り値をどこにも取っていませんが、GUIは自動的に生成されるので必要ありません。
さらに一見メモリリークしてるようですが、第6引数actionCollection()で指定するクラスが終了時にdeleteしてくれます。
そして一番重要なのが第7引数"test"の追加です。
KActionのコンストラクタのリファレンスを見ると「const char* name」となっていますが、この「名前」を利用してインターフェースを決定するのです。

次にインターフェースをXMLで定義します。新たにkxmlactioneditorui.rcというファイルを以下の内容で作成してください。

<!DOCTYPE kpartgui>
<kpartgui name="kxmlactioneditor">
    <MenuBar>
        <Menu name="edit">
            <Action name="test"/>
        </Menu>
    </MenuBar>
    <ToolBar name="mainToolBar">
        <Action name="test"/>
    </ToolBar>
</kpartgui>

Editメニューとツールバーに"test"という名前のアクションを表示します。

ファイルがインストールされるようにMakefile.amの最後に以下の行を追加してください。

rcdir = $(kde_datadir)/kxmlactioneditor
rc_DATA = kxmlactioneditorui.rc

さて、この状態コンパイルして実行してもTestアクションは表示されません。
実はcreateGUI関数はインストールしたディレクトリのXMLファイルしか見てくれないのです。
ということでインストールして試すと無事Testアクションが表示されたでしょうか?
新たにファイルを追加したので

$ make -f Makefile.cvs
$ ./configure

をする必要があるかもしれません。

補足

createGUI関数はデフォルトで「appnameui.rc」というファイルを探し、あった場合は適用します。
もし、違う名前だったり、複数のXMLファイルを切替えるような場合はcreateGUI( ファイル名 )のようによびだしてください。

また今回のTestアクションは既存のEditメニューに表示させましたが、新たにメニューの項目を増やすことも可能です。 もしTestアクションを「Test」メニューのポップアップとしたい場合は以下のようにします。

<!DOCTYPE kpartgui>
<kpartgui name="kxmlactioneditor">
    <MenuBar>
        <Menu name="test"><text>&Test<text>
            <Action name="test"/>
        </Menu>
    </MenuBar>
    <ToolBar name="mainToolBar">
        <Action name="test"/>
    </ToolBar>
</kpartgui>

作成するアプリケーションによっては標準のアクションを別の場所に表示させたい場合があるかもしれません。

KStdAction::openNew( this, SLOT( slotFileNew() ), actionCollection(), "filenew_" );

などと独自の名前をつけてあげると標準以外のものと同じように扱うことができます。

おわりに

今回作成した全てのファイルはkxmlactioneditor.tar.gzからダウンロードすることができます。

スポンサード リンク

トラックバック

トラックバックURL
https://linux-life.net/tb/program/cc/kde/doc/kxmlactioneditor/
Linux Life 〜 No linux, No life 〜
プログラミング > C++ > KDE > KDEプログラミング入門 > KXMLActionEditor