KDevEditor

はじめに

KConfigEditorをKDevelop上で作成してみましょう。

プロジェクトの作成

メニュー > プロジェクト(P) > 新しいプロジェクト(N)...

プロジェクトのタイプ:C++ > KDE > Application framework
アプリケーション名(N):KDevEditor

作者:SUZUKI Tasuku
Eメール:tasuku@linux-life.net
バージョン:0.1.0
ライセンス:GPL

コンパイル

いきなりですが、この状態でコンパイルして実行してみましょう。
メニュー > ビルド(I) > プロジェクトをビルド(B)

初回はMakefileがないのでautomake > configureを実行します。

実行

メニュー > ビルド(I) > プログラムを実行
kdeveditor
https://linux-life.net/ を開いてみた。
kdeveditor

準備

ウィザードで作られたソース/ヘッダファイルがちょっと気に入らないので自分好みに修正します。
気にならない人は飛ばしてもらって結構です。

ファイルの頭の「*」の位置を修正
* Copyright (C) 2006 by SUZUKI Tasuku * <- これです。
インデント
タブに変更します。
スペース
, や ( の後、) の前に変更。
if (a == 0)
if( a == 0 )
ポインタ
クラス名* としておく。
QWidget *widget
QWidget* widget
後ろのカンマ
前に移動。
a,
b

a
,b
mocファイルのインクルードの削除
#include "???.moc"
AutoMake -> Configure が必要。

適当にプロジェクトを解析してみる

KDevEditor ( kdeveditor.h )
メインウィンドウクラス。
メニュー関係やステータスバーの制御なんかを担当している。
KDevEditorView をメインウィジットとしている。
KDevEditorView ( kdeveditorview.h )
メインウィジットクラス。
受け取った URL を開く KParts::ReadOnlyPart を内部に持っている。
KDevEditorIface ( kdeveditoriface.h )
DCOPインターフェース
DCOP 経由で URL を開けるように定義。
実装は KDevEditorView にある。
KDevEditorPreferences ( kdeveditorpreferences,.h )
設定ダイアログのベースクラス
ページは下記の二つ。
KDevEditorPrefPageOne/Two ( kdeveditorpreferences.h )
設定ダイアログのページクラス
中身は無し。
main ( main.cpp )
普通に起動された時のためのmain関数。
コマンドラインの引数があればファイルも開く。
main ( kdeveditor_client.cpp )
DCOP用のmain関数。
KDevEditorIface に URL を渡す。

テキストエディタに改造

  1. 既存の KDevEditorView クラスを削除する前に DCOP の実装位置を変更する。
    kdeveditorview.h
    #include <kdeveditoriface.h>
    class KDevEditorView : public QWidget, public KDevEditorIface
    virtual void openURL( QString url );
    kdeveditorview.cpp
    KDevEditorView::KDevEditorView( QWidget* parent )
        : QWidget(parent)
        , DCOPObject( "KDevEditorIface" )
    void KDevEditorView::openURL( QString url )
    {
        openURL( KURL( url ) );
    }
    kdeveditor.h
    #include "kdeveditoriface.h"
    class KDevEditor : public KMainWindow, public KDevEditorIface
    public slots:
        virtual void openURL( QString url );
    kdeveditor.cpp
    KDevEditor::KDevEditor()
        : DCOPObject( "KDevEditorIface" )
        , KMainWindow( 0, "KDevEditor" )
    void KDevEditor::openURL( QString url )
    {
        load( KURL( url ) );
    }
  2. KDevEditorView を KTextEdit に変更する。
    kdeveditor.h
    #include <kurl.h>
    class KURL
    #include "kdeveditorview.h"
    class KTextEdit
    void load( const KURL& url );
    void openURL( const KURL& url );
    void fileSave();
    bool fileSave( const KURL& url = QString::null );
    void fileSaveAs();
    bool fileSaveAs();
    void changeStatusbar( const QString& text ); void changeCaption( const QString& text );
    KDevEditorView* m_view;
    KTextEdit* m_edit;
    KURL m_url;
    kdeveditor.cpp
    #include <ktextedit.h>
    #include <kmessagebox.h>
    #include <ktempfile.h>
    KDevEditor::KDevEditor()
        : KMainWindow( 0, "KDevEditor" )
        , DCOPObject( "KDevEditorIface" )
        , m_view( new KDevEditorView( this ) )
        , m_edit( new KTextEdit( this ) )
        , m_url( QString::null )
    {

        setCentralWidget( m_view );
        setCentralWidget( m_edit );

        connect( m_view, SIGNAL( signalChangeStatusbar( const QString& ) )
            , this, SLOT( changeStatusbar( const QString& ) ) );
        connect( m_view, SIGNAL( signalChangeCaption( const QString& ) )
            , this, SLOT( changeCaption( const QString& ) ) );

    }
    void KDevEditor::load( const KURL& url )
    {
        ...
    }
    void KDevEditor::openURL( const KURL& url )
    {
        QString target = url.path();

        if( !url.isLocalFile() )
        {
            if( !KIO::NetAccess::download( url, target, this ) )
            {
                KMessageBox::sorry( this, i18n( "KDevEditor couldn't download." ) );
                return;
            }
        }

        setCaption( url.prettyURL() );

        QFile file( target );
        if ( !file.open( IO_ReadOnly ) )
        {
            KMessageBox::sorry( this, i18n(" KDevEditor couldn't open." ) );
            return;
        }
        QTextStream ts( &file );
        QString txt = ts.read();
        file.close();

        if( !url.isLocalFile() )
        {
            KIO::NetAccess::removeTempFile( target );
        }

        m_edit->setText( txt );
        txtEdit->viewport()->setFocus();

        m_url = url;
    }
    void KDevEditor::setupActions()
    {
        KStdAction::cut( m_edit, SLOT( cut() ), actionCollection() );
        KStdAction::copy( m_edit, SLOT( copy() ), actionCollection() );
        KStdAction::paste( m_edit, SLOT( paste() ), actionCollection() );
        KStdAction::undo( m_edit, SLOT( undo() ), actionCollection() );
        KStdAction::redo( m_edit, SLOT( redo() ), actionCollection() );
        KAction* custom = new KAction( i18n( "Cus&tom Menuitem" ), 0
            , this, SLOT( optionsPreferences() )
            , actionCollection(), "custom_action" );
    }
    void KDevEditor::saveProperties( KConfig* config )
    {
        if( !m_url.isEmpty() )
        {
            config->writeEntry( "lastURL", m_url.path() );
        }
        saveMainWindowSettings( config, "window" );
    }
    void KDevEditor::readProperties( KConfig* config )
    {
        QString url = config->readPathEntry( "lastURL" );

        if( !url.isEmpty() )
        {
            openURL( url );
        }
        applyMainWindowSettings( config, "window" );
    }
    void KDevEditor::fileOpen()
    {
        KURL url = KFileDialog::getOpenURL( ":KDevEditor", i18n( "*.txt|Text File (*.txt)\n*|All files" ), this );
        if( !url.isEmpty() )
        {
            openURL(url);
        }
    }
    bool KDevEditor::fileSave( const KURL& url )
    {
        if( url.isEmpty() )
        {
            return fileSaveAs();
        }

        KTempFile tmpfile;
        QString filename = url.path();

        if( url.isLocalFile() )
        {
            tmpfile.setAutoDelete( TRUE );
            filename = tmpfile.name();
        }
        QFile file( filename );
        if ( !file.open( IO_WriteOnly ) )
        {
            KMessageBox::sorry( this, i18n( "KDevEditor couldn't save." ) );
            return FALSE;
        }
        QTextStream ts( &file );
        ts << m_edit->text();
        file.close();
        if( url.isLocalFile() )
        {
            KIO::NetAccess::upload( filename, url, this );
        }
        m_edit->setModified( FALSE );
        setCaption( url.prettyURL() );
        m_url = url;
        return TRUE;
    }
    bool KDevEditor::fileSaveAs()
    {
        KURL url = KFileDialog::getSaveURL( ":KDevEditor", i18n( "*.txt|Text File (*.txt)\n*|All files" ), this );

        if( url.isEmpty() || !url.isValid() )
        {
            return FALSE;
        }
        return fileSave( url );
    }
    void KDevEditor::filePrint()
    {
        // m_view->print( &p, metrics.height(), metrics.width() );
    }
    void KDevEditor::changeStatusbar( const QString& text )
    {
        // display the text on the statusbar
        statusBar()->message( text );
    }
    void KDevEditor::changeCaption( const QString& text )
    {
        // display the text on the caption
        setCaption( text );
    }
    main.cpp
    widget->load( args->url( i ) );
    widget->openURL( args->url( i ) );
  3. KDevEditorView を削除する。
    Automakeマネージャからkdeveditorview.h/cppを削除する。

実行

kdeveditor

終わりに

とりあえず、KDevelopを使って最低限のテキストエディタの形を作成しました。
まだまだ修正点や変更点がありそうなので、続きはそのうちってことで。
今回のファイルはkdeveditor-0.1.0.tar.gzからダウンロードできます。
だいぶ説明を端折っていますので、分からないところや間違いがありましたらメールで御連絡ください。

スポンサード リンク

トラックバック

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