KActionEditor

はじめに

KDEアプリケーションプログラミングのすばらしい方法である「アクション」をベースとした方法を紹介します。
わかりやすいようにKSimpleEditorをアクションベースで書き換えてみましょう。
メニューとツールバーの項目を全てアクションとして定義しなおします。

準備

KSimpleEditorのディレクトリ名、ファイル名、ファイルの内容のsimpleという文字を全てactionに変更してください。
当然、大文字/小文字は区別します。

kactioneditor.h

setupToolBar()とsetupMenuBar()をまとめて、setupAction()という関数で同じ処理をします。

private:
    void setupToolBar();
    void setupMenuBar();
    void setupAction();

kactioneditor.cpp

KActionのヘッダを追加します。

#include <kaction.h>

アクションの中でも特に一般的に使われるものはKStdActionクラスの中で定義されています。
KSimpleEditorのメニューの項目は全てそれで間に合います。
それでは全ての項目を対応する標準アクションで書き換えてみましょう。

void KActionEditor::setupAction()
{
    KAction* act;
    QPopupMenu* mnFile = new QPopupMenu;
    QPopupMenu* mnEdit = new QPopupMenu;
    QPopupMenu* mnHelp = (QPopupMenu *)helpMenu();
    tlbFile = toolBar();
    tlbEdit = new KToolBar( this, KMainWindow::Top );
    
    act = KStdAction::openNew( this, SLOT( slotFileNew() ), actionCollection() );
    act->plug( mnFile );
    act->plug( tlbFile );
    
    act = KStdAction::open( this, SLOT( slotFileOpen() ), actionCollection() );
    act->plug( mnFile );
    act->plug( tlbFile );
    
    act = KStdAction::save( this, SLOT( slotFileSave() ), actionCollection() );
    act->plug( mnFile );
    act->plug( tlbFile );
    
    act = KStdAction::saveAs( this, SLOT( slotFileSaveAs() ), actionCollection() );
    act->plug( mnFile );
    act->plug( tlbFile );
    
    mnFile->insertSeparator();
    
    act = KStdAction::quit( this, SLOT( close() ), actionCollection() );
    act->plug( mnFile );
    
    menuBar()->insertItem( i18n( "&File" ), mnFile );
    
    act = KStdAction::cut( txtEdit, SLOT( cut() ), actionCollection() );
    act->plug( mnEdit );
    act->plug( tlbEdit );
    
    act = KStdAction::copy( txtEdit, SLOT( copy() ), actionCollection() );
    act->plug( mnEdit );
    act->plug( tlbEdit );
    
    act = KStdAction::paste( txtEdit, SLOT( paste() ), actionCollection() );
    act->plug( mnEdit );
    act->plug( tlbEdit );
    
    mnEdit->insertSeparator();
    tlbEdit->insertLineSeparator();
    
    act = KStdAction::undo( txtEdit, SLOT( undo() ), actionCollection() );
    act->plug( mnEdit );
    act->plug( tlbEdit );
    
    act = KStdAction::redo( txtEdit, SLOT( redo() ), actionCollection() );
    act->plug( mnEdit );
    act->plug( tlbEdit );
    
    menuBar()->insertItem( i18n( "&Edit" ), mnEdit );
    
    menuBar()->insertItem( i18n( "&Help" ), mnHelp );
}

ソースを見ればわかると思いますがActionは動きを定義してplugメソッドでメニューやツールバーに挿入します。
第3引数はKMainWindowのactionCollectionのインスタンスを渡します。

新たにアクションを追加してみる

機能は作りませんが「テスト」という項目を編集メニューに追加してみましょう。
標準以外のアクションは以下のように定義します

act = new KAction( i18n("&Test"), BarIcon("test"), KShortcut(), this, SLOT( slotTest() ), actionCollection() );
act->plug( mnEdit );
act->plug( tlbEdit );

もしショートカットキーを割り当てる場合はKShortcut( Qt::Key_??? )とします。

kactioneditor.hでvoid slotTest();を定義し、kactioneditor.cppで以下のように実装します。

void KActionEditor::slotTest()
{
    kdDebug() << i18n("Test done.") << endl;
}

ここでkdDebug()というのが出てきましたが、デバッグ用の関数です。
cerrみたいな感じで扱えます。

おわりに

前回作成したKSimpleEditorと比べるとだいぶコードもすっきりしました。
今回作成した全てのファイルはkactioneditor.tar.gzからダウンロードすることができます。

スポンサード リンク

トラックバック

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