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) > プログラムを実行

https://linux-life.net/ を開いてみた。
準備
ウィザードで作られたソース/ヘッダファイルがちょっと気に入らないので自分好みに修正します。
気にならない人は飛ばしてもらって結構です。
- ファイルの頭の「*」の位置を修正
- * 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 を渡す。
テキストエディタに改造
-
既存の KDevEditorView クラスを削除する前に DCOP の実装位置を変更する。
kdeveditorview.h#include <kdeveditoriface.h>class KDevEditorView : public QWidget, public KDevEditorIfacekdeveditorview.cppvirtual void openURL( QString url );KDevEditorView::KDevEditorView( QWidget* parent )
: QWidget(parent)
, DCOPObject( "KDevEditorIface" )kdeveditor.hvoid KDevEditorView::openURL( QString url )
{
openURL( KURL( url ) );
}#include "kdeveditoriface.h"class KDevEditor : public KMainWindow, public KDevEditorIfacepublic slots:kdeveditor.cpp
virtual void openURL( QString url );KDevEditor::KDevEditor()
: DCOPObject( "KDevEditorIface" )
, KMainWindow( 0, "KDevEditor" )void KDevEditor::openURL( QString url )
{
load( KURL( url ) );
} -
KDevEditorView を KTextEdit に変更する。
kdeveditor.h#include <kurl.h>
class KURL#include "kdeveditorview.h"
class KTextEditvoid 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 );
}main.cppvoid KDevEditor::changeCaption( const QString& text )
{
// display the text on the caption
setCaption( text );
}widget->load( args->url( i ) );
widget->openURL( args->url( i ) ); -
KDevEditorView を削除する。
Automakeマネージャからkdeveditorview.h/cppを削除する。
実行
終わりに
とりあえず、KDevelopを使って最低限のテキストエディタの形を作成しました。
まだまだ修正点や変更点がありそうなので、続きはそのうちってことで。
今回のファイルはkdeveditor-0.1.0.tar.gzからダウンロードできます。
だいぶ説明を端折っていますので、分からないところや間違いがありましたらメールで御連絡ください。