diff --git a/archives/Accelerated_kde_for_KNOPPIX.php b/archives/Accelerated_kde_for_KNOPPIX.php index 693ef82..efdd14d 100644 --- a/archives/Accelerated_kde_for_KNOPPIX.php +++ b/archives/Accelerated_kde_for_KNOPPIX.php @@ -1,87 +1,87 @@
CDブートのKNOPPIXを前提として、KDE起動の最適化方法を考察する。
まず、結論として、knoppix起動用のstartkde-knoppixのようなものを用意し、
そちらを起動時に使用するようにするのが最適だと思われる。
以下では、スクリプト内部の解析を行う。
startkdeスクリプトで行われている最初の処理
# Check if a KDE session already is running if dcop kdesktop >/dev/null 2>&1; then echo "KDE seems to be already running on this display." xmessage -geometry 500x100 "KDE seems to be already running on this display." > /dev/null 2>/dev/null exit 1 fi
は、既にKDEが起動されているかどうかをテストしているので、KNOPPIXでは必要ない処理だと思われる。
念のためカットできないと思われる。また、バックグラウンドでの実行もできないだろう。
次の
if test -z "$XDM_MANAGED" || echo "$XDM_MANAGED" | grep ",auto" > /dev/null; then xsetroot -solid "#C0C0C0" fi
もカットできないし、おそらくすぐ実行が終わるので、カットする必要がない。
ブートシーケンスの始めで、kdehomeの設定処理があるが、$HOME/.kdeに決めうちに変更して問題ないだろう。
その後、フォントディレクトリの初期化処理が走る。
# Activate the kde font directories. # # There are 4 directories that may be used for supplying fonts for KDE. ... (中略)... # Only do usr_fdir and usr_odir if they are *not* listed in fontpaths test -d "$sys_odir" && xset +fp "$sys_odir" test $do_usr_odir -eq 1 && test -d "$usr_odir" && (mkfontdir "$usr_odir" ; xset +fp "$usr_odir") test $do_usr_fdir -eq 1 && test -d "$usr_fdir" && (mkfontdir "$usr_fdir" ; xset fp+ "$usr_fdir") test -d "$sys_fdir" && xset fp+ "$sys_fdir" ... (中略)... # Get Ghostscript to look into user's KDE fonts dir for additional Fontmap if test -n "$GS_LIB" ; then GS_LIB=$usr_fdir:$GS_LIB export GS_LIB else GS_LIB=$usr_fdir export GS_LIB fi
ここは、おそらくKNOPPIXの場合は環境特有の値を使って処理を簡素化できるだろう。
今後USBメモリからのブートような形で環境を変更できるようになる場合には、
ブートオプションの対応で良いと思う(フォントを追加する人は少ないだろう)。
その少し後にある、以下のkpersonilzerの実行処理は、削っても問題ないだろう。
# run KPersonalizer before the session, if this is the first login if kreadconfig --file kpersonalizerrc --group General --key FirstLogin --default true --type bool; then # start only dcopserver, don't start whole kdeinit (takes too long) echo 'startkde: Running kpersonalizer...' 1>&2 dcopserver kwin --lock & kpersonalizer --before-session # handle kpersonalizer restarts (language change) while test $? -eq 1; do kpersonalizer --r --before-session done dcopserver_shutdown # shutdown will also make kwin quit, give it time to do so sleep 1 fi
ここでカットできる部分は、ざっと見た限り存在しない。
簡素化するためには、kdeinit等のソースに手を入れる必要がある。
周辺機器の設定をしているところを並列にするなどできれば、 それだけで速くなるとは思うが……。
KDEで日本語を入力することができません。
どのようにすれば解決できるでしょうか?
日本語を入力する場合には、kinput2などのXIMサーバが起動されている必要があります。
また、環境変数 $LANGを"ja_JP.utf8"(古い環境では"ja_JP.eucJP")にセットし、環境変数 $XMODIFIERSを
"@im=kinput2"(kinput2を使用する場合)にセットする必要があります。
これらの環境変数の設定は、ホームディレクトリにある".bashrc"(bashの場合)や
".cshrc"(tcshの場合)で行うようにすると楽です。
(bashの例) LANG=ja_JP.eucJP export LANG XMODIFIERS="@im=kinput2" export XMODIFIERS
kinput2などが起動していて、環境変数もセットされているのに
日本語の入力ができない場合、qtconfigを起動して、「Interface」という
タブを開き、一番下の「XIM Input Style」をOn The Spot(またはOver The Spot)にすると
ちゃんと入力できるようになるはずです。
ドメインを構築している環境にてKDE 3.0 と 3.5 と異なるコンピュータでデスクトップを共有しているのですがゴミ箱の共有がうまくいきません。両方の環境にて同じゴミ箱を使用するのにはどうしたらいいのでしょうか。
RH7.1(seawolf)AlphaでのKdevelop1.4から4へのバージョンアップはできますか?
インストール直後のrootパスワードが、わかりません。 Admin mode に入れません。
ウィンドウを動かそうとするとKDEがフリーズしてしまいます。
KDEコントロールセンターを起動し、「ウィンドウの挙動」の「移動」タブをクリックし、
「移動中のウィンドウの内容を表示」と「サイズ変更中のウィンドウの内容を表示」
にチェックを入れることで、この問題は解消できます。
KDE-3.1.4では直っているはずです:-)
http://bugs.kde.org/show_bug.cgi?id=44881#c13 http://google.co.jp/
Netscape、Emacs、xmmsなどの一部のアプリケーションのメニューが
文字化けしてしまって、読むことができません。
まず、KDEコントロールセンターから「色」という設定項目を探し、
「非KDEアプリケーションにも色設定を適用」のチェックを外してみて下さい。
また、ホームディレクトリに"gtkrc-kde"というファイルがある場合は、
削除、または、リネームしてみてください。
それでも解消されない場合は、ホームディレクトリに".gtkrc"というファイルを
style "gtk-default-ja" { fontset = "-adobe-helvetica-medium-r-normal--14-100-100-100-p-76-iso8859-1,? -ricoh-ms mincho-medium-r-normal--14-*-*-*-*-*-jisx0208.1983-0,? -misc-fixed-medium-r-normal--14-*-*-*-*-*-jisx0208.1983-0,? *-r-*" } class "GtkWidget" style "gtk-default-ja"
という内容で作成することで解消されるはずです。
Konsoleを使っていると画面にごみが残ってしまいます。
現状では解決の見込みが少ないです。 kterm, krxvt, mlterm等を使うのが賢明です。
是非解決を訴えましょう。 voteをお願いします。 http://bugs.kde.org/show_bug.cgi?id=41744
これも関係していると思います。
http://bugs.kde.org/show_bug.cgi?id=59162
3.1.3では直っているはずですが。Gentooではまだでてないので、未確認です。(Ken)
3.1.3になって横スクロールバーが不必要な時に出るのですが。
バグとして報告されており、対処するためのパッチが出ています。
また、CVSでは解決されています。
http://bugs.kde.org/show_bug.cgi?id=61730
googleで検索を行うと、検索結果の上の方に表示される "ウェブ"、"イメージ"、"グループ"、"ディレクトリ"の表示が つぶれた感じに表示されてしまう。
bus.kde.orgに報告されていて、CVSでは直っています。
<table width="1%"><tr><td>日本語</td></tr></table>
などのときに、テーブル内の文字の幅がゼロになっているのが原因らしいです。
CSSを設定することによってこの現象を回避できます。(対症療法ですが・・・)
-body > table > tr > td > center { - display: inline; +- \ No newline at end of file + diff --git a/archives/FAQ7.php b/archives/FAQ7.php index 45b845a..a5860af 100644 --- a/archives/FAQ7.php +++ b/archives/FAQ7.php @@ -1,42 +1,42 @@body > table > tr > td > center { + display: inline; }このような内容のCSSファイルを用意して、Konqueror設定パネルで
上記のファイルをユーザ定義スタイルシートとして指定します。
http://forums.gentoo.org/viewtopic.php?p=346652#346652Counter: 39, today: 1, yesterday: 0
コメント †
KDE3.1.1 の環境なのですが、googleの検索ページhttp://www.google.co.jp を表示させた直後にSHIFT+Space で日本語入力のモードになりません。英数字の入力を1文字でも行えば、日本語入力モードになります。なぜでしょうか?
ちなみに、Excite, yahoo等ではおこりません。
入力そのものができないのは、入力スタイルがOn The Spotとなっているためでしょう。Over The Spotに変更すれば、入力ができるようになるはずです。ただ、その場合も確定前の文字列(preedit)が表示されないため、まともに使うためには英数字を入力する必要があります。
Mozillaなどの他のブラウザで問題がないことから、このような挙動となっているのは、KDE側の問題ではないかと思われます。具体的には、KDEのHTMLレンダリングエンジンであるKHTMLか、Konqueror自体の問題ではないかと考えられます。関連するバグがすでにレポートされています(Bug52685)。
なお、入力スタイルの変更は、FAQ/1を参考にしてください。
MS社のVisualStudio?では、メモリ領域のダンプが出来ますが、 KDevelopで同じことは出来ますか?
WEBサイトのファイルを保存しようとすると、保存はしますが、そのファイルがどこに保存されたかが解りません。しかもなぜかファイル名も変わっているみたいなので検索する名前もわかりません。どなたか回答していただければ幸いです。
このPukiWikiでは、QtおよびKDEのインストールについての情報、様々なアプリケーションについての説明、FAQ、Tipsや、開発に関するドキュメントなどを扱っています。
各ページの編集・新規ページの追加とも、自由に行ってください。 ただし、初めて"新規ページの作成"を行う際には、一度こちらをご覧ください。 なお、このJKUG Wikiの運営についてはこちらをご覧下さい。
KBabel は古いアプリケーションです。Lokalize を使用してください。
kdesdk?
本家ページ : http://i18n.kde.org/tools/kbabel/ …はもうリンク切れのようです…。
ここではKBabelの最低限の設定と使用法について説明します。
Debianユーザの方は、こちらも参考にしてください。
KBabelはKDEの翻訳チームが使用している翻訳補助ツールです。検索機能、使い勝手、UTF8エンコーディング、エラーチェック機能などの面において、強力な機能を持っています。KDEだけでなく他の翻訳プロジェクトの人にも有用なツールでしょう。
ここではKBabel-1.0.2(KDE3.1.xに含まれているもの)を対象として説明します。KBabelはkdesdkに含まれていますので、通常は、ディストリビュータで配布されているパッケージをインストールするのが良いでしょう。もし自分でコンパイルしてインストール場合には、libdb-4.xなどが必要になります。
コンパイル手順は以下の通りです。 ./configure --prefix=$KDEDIR make su make install
KBabelを立ち上げると魚のスプラッシュスクリーンの後にKBabelが立ち上がります。
初回立ち上げ時は、下の画像のような設定の入力を求めるダイアログが出て来ます。
「OK」を押すと次の画面になります。
ここには自分の名前とメールアドレスを入力して下さい。「ローカルな名前」もローマ字のままで問題ないでしょう。
そのほかの情報は上の画面を参考にして下さい。
個人情報の他の設定項目としては「編集」、「保存」、「スペルチェック」、「差異表示(Diff)」、「ソース」、「その他」があります。
そのうち「編集」、「スペルチェック」、「差異表示(Diff)」、「ソース」、「その他」に関しては特に変更する必要はないでしょう。
次に「保存」の設定です。ここでは、「一般」についての設定をします。
その他の「ヘッダ」と「著作権表示」については、変更する必要はないでしょう。
ここで重要なのはエンコーディングです。これは必ずUTF8にして下さい。KDE3.xではほとんどの文字を
内部でUTF8で扱っています。メッセージカタログもja.poは全てUTF8になっています。KBabelで
メッセージカタログを扱う分にはほとんど意識しないで済むので、ここは必ずUTF8にして下さい。
次に「検索」の設定を行います。
検索は、翻訳中にデータベース(3種類ありますがこれの設定は後で説明します)の中から検索してきて
操作画面の右下部に表示してくれるという機能です。「自動的に検索を開始」にチェックを入れておくと、
次のメッセージに移動したときに自動的に検索を開始して表示してくれます。
ちなみに3種類というのは以下の通りです。
相当遅いマシンならともかく、普通のマシンなら数分でインデックスを作成できるので
翻訳データベースを使用するのがよいでしょう。
設定については、辞書の設定のところで説明します。
以上で本体の設定は終了です。なおこれらはメニューバーの「設定」→「KBabelの設定」から再設定できます。
まず、メニューバーの「ツール」→「カタログマネージャ」で、カタログマネージャを起動します。
すると、カタログマネージャの起動とともに、下のようなダイアログが出てきます。
「OK」を押し、カタログマネージャのメニューバーから「設定」→「カタログマネージャの設定」を選ぶと、次の画面になります。
まずテンプレートと日本語メッセージファイルをここからダウンロードします。
基本的に、最新のものを選んでくればOKです。
(ダウンロードするものは、「kde-i18n-ja」と「kde-i18n-templates」です。)
そして展開したディレクトリをそれぞれ上に指定します。
例えば/usr/local/extend/kde-i18nというディレクトリでこれらのファイルを
展開した場合は上の画面のようにします。
そして「OK」をクリックすると、指定したディレクトリが存在すれば下の画面のように、
翻訳の進捗状況の情報が生成されます。
続いては、辞書の設定です。
辞書の設定はメニューバーの「設定」→「辞書の設定」で行います。
・翻訳データベースの設定
「辞書の設定」から「翻訳データベース」を選択すると設定ダイアログが現れます。
オリジナル : http://developer.kde.org/documentation/library/kdeqt/kde3arch/resources.html
標準リソースディレクトリへのアクセス
KDEは、データが実際どこにあるのかということを気にしないで、アプリケーションがインストールしたファイルにアクセスするためのいくつかの方法を提供しています。
またKDEはユーザー(ほとんどの場合は管理者ですが)が適切と思う場所にファイルを移動するのを許可する為に、異なるサーチパスが割り当てられている異なるリソースタイプのリストを提供しています。
実行ファイルを探すためのPATH環境変数やman pageを探すためのMANPATH環境変数の事を訊いたことが有るでしょう。
でもmanにPATHの中でmanpageを探すようには期待しないでしょう。
この概念に似たような感じで、KDEは、特定のリソースのためにパスを加えることをシンプルにするために、サーチパスを区別しています。
これによって他のリソースを探して不必要に遅くなったり、すべてのものをひとつのディレクトリに入れる必要が無くなります。
KDEが提供しているリソースのタイプは、
KDEのための開発ツール(例えばKDevelop)によって作られたconfigureが生成したMakefileのaliasにもこれらすべてが存在しています。
KStandardDirs?
基本的なサービスを提供するので、このクラスはkdelibsの中でも最も中心的なクラスです。
このクラスはユーザーのハードディスクのどこにファイルが有るのかを分かっています。ユーザとアプリケーションの両者に対して出来る限り実際のファイルのありかをtransparentにするためです。
これによってアプリケーションからの全ての情報をカプセル化し、またアプリケーションは常にリソースタイプ(例:apps)やファイルネーム(例:Home.desktop)でファイルにアクセスします。
理想的なのは、アプリケーションが、ファイルがどこにあるのかを配慮せず、この能力を用いるために作業をKStandardDirs?::findResource("apps", "Home.desktop")に任せることです。
KStandartDir?の主要な考えは、ファイルの前につくプレフィックスはいくつかあるということです。
プレフィックスとは、例えばユーザーがkdelibsをインストールした場所であったり、アプリケーションがインストールされた場所であったり、$HOME/.kdeであったりします。実際にはもっとあるでしょう。
こういったプレフィックスの後には、特定のリソースタイプがみつかるであろうサフィックスがよく定義されます。
例えばツールバーアイコンならば share/toolbarやshare/apps/<appname>/picsでしょう。
だから、ファイルを探すためのアルゴリズムは基本的には指定されたサフィックスにプレフィックスをつなげて、ファイルがあるかどうかを調べるということです。
複雑な事を言うと、前述のステップを踏むことなくKStandardDir?が調べるための絶対パスも登録できます。
これはユーザーが例えば$HOME/.kde以外のディレクトリにアイコンを置く等、特定のディレクトリにファイルをおきたい場合に有功です。
On the usage of locate and locateLocal
locateとlocateLocalは、両方ともKStandartDir?を出来る限りシンプルに活用するために便利な機能です。
もちろんこれを使わずにKStandartDir?のパワーを充分に用いることもできます。
通常のKDEアプリケーションは次の3つの内、どれか1つの方法を用いてリソースファイルをしようします。
1
この場合、リソースファイルは読み込み専用です。
システムではデフォルトの設定を提供しますが、ユーザーは.kdeディレクトリでこのデフォルトを上書きできます。
// Code example myFile = locate("appdata", "groups.lst") myData = myReadGroups(myFile);
2
この場合リソースファイルは読み込みも書き込みもできます。
ユーザーが指定しない場合、システムのデフォルトが用いられます。
この時、リソースファイルは常に.kdeディレクトリに書き込まれます。
// Code example myFile = locate("appdata", "groups.lst") myData = myReadGroups(myFile); ... doSomething(myData); ... myFile = locateLocal("appdata", "groups.lst"); myWriteGroups(myFile, myData);
3 上と同じですが、システムのデフォルトは使われません。
// Code example myFile = locateLocal("appdata", "groups.lst"); myData = myReadGroups(myFile); ... doSomething(myData); ... myFile = locateLocal("appdata", "groups.lst"); myWriteGroups(myFile, myData);- \ No newline at end of file + diff --git a/archives/KDE%203.0%20%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3%2F%B3%AB%C8%AF%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF%2F%A5%E9%A5%A4%A.php b/archives/KDE%203.0%20%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3%2F%B3%AB%C8%AF%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF%2F%A5%E9%A5%A4%A.php index 11939a5..8741a40 100644 --- a/archives/KDE%203.0%20%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3%2F%B3%AB%C8%AF%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF%2F%A5%E9%A5%A4%A.php +++ b/archives/KDE%203.0%20%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3%2F%B3%AB%C8%AF%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF%2F%A5%E9%A5%A4%A.php @@ -1,52 +1,52 @@
オリジナル : http://techbase.kde.org/Development/Architecture/KDE3/Library_Structure
KDEライブラリ構造の概観
グループ化されたクラス
オリジナル : http://developer.kde.org/documentation/library/kdeqt/kde3arch/khtml/index.html *1
※古すぎるのであまり参考にはならないかと思われます。
KHTML - KDE's HTML library
概観
KHTMLはDOM,Java,JavaScript?,Cascading Style Sheets(CSS)に対応したXML/HTML4準拠のHTMLライブラリです。
現在のKHTMLができることについての概観をここで得られます。
Small example
KHTMLをプログラム中で使うのは非常に簡単です。
下の例はすでにwebブラウズが可能なアプリケーションを示しています。
#コード例が古かったのでコチラを見て下さい。
この例はすでにwebにアクセスできる機能的なブラウザを示しています。(リモートファイルにアクセスするためのkio_httpが必要ですが)
testkhtmlでhttp://kde.orgを試して見て下さい。ウィジットにはKDEのホームページが表示されるでしょう。
Document Object Model (DOM)
KHTMLはほとんど完璧なDom Level1, Level2の実装を提供しています。
DOMは文書のデータを保持するために使われる内部的なクラスです。
DOMにアクセスするクラスはデータ保持の為にrefcounting schemeを用います。
よってDOMはメモリ管理を行ないます。
使う方は、文書のパーツにアクセスするためには、DOM header fileに定義されているクラスを使用するだけでよいのです。
ポインタを使わない限り、メモリリークが起きることはないでしょう。(ライブラリのバグを覗いてはね。。。;-)
表示されている文書には KHTMLWidget::document() 関数を用いて文書のどの部分にでも簡単にアクセスできます。
Java
有難い事にRichard Mooreによって、KHTMLはJava appletを表示できるようになりました。
Javaは標準では有効になっていませんが、メソッドを使って有効にできます。
CLASSPATHは以下のように設定して下さい。
CLASSPATH=$KDEDIR/share/apps/kjava/kjava-classes.zip:$JDK_DIR/lib
JDKをインストールすることが必要です。JDK-1.1.7では試しましたが、Kaffeや他のバージョンのJDKで動くかはわかりません。
JavaScript? (ECMA-Script)
JavaScript?サポートはECMAScript Language specification ECMA-262 3rd edition準拠です。
これはJavaScript1.5相当です。
Cascading Style Sheets (CSS)
Cascading style sheets 2.1 はほとんどサポートされています。
オリジナル:KDE 3.0 architecture
開発フレームワーク
デスクトップフレームワーク
マルチメディアフレームワーク
コンポーネントアーキテクチャ
KOfficeアーキテクチャ
プロトコル
開発ツール
Development HOWTOs
void startJob() { SomeJob* job = KIO::operation(url); QObject::connect(job, SIGNAL(result(KIO::Job *)), this, SLOT(slotJobFinished(KIO::Job *))); } void slotJobFinished(KIO::Job *job) { if( job->error() ){ job->showErrorDialog(); return; } }
KIO::operationの箇所には自分の行いたい処理を記述します。API参照
#ref(): The style ref(filename,pagename) is ambiguous and become obsolete. Please try ref(pagename/filename)
簡単にコードの解説を。
kiosample::kiosample() : KMainWindow( 0, "kiosample" ) { // set the shell's ui resource file setXMLFile("kiosampleui.rc"); setupGUI(); isDownloading = false; } kiosample::~kiosample() { }
コンストラクタ、デストラクタです。 デストラクタで何の処理も行っていないのは、下でnewするオブジェクト(QBuffer* downloadDateは除く)はすべてQOBjectを継承したクラスで、親を持っているので終了時にQtの機能としていもづる式にdeleteするためです。 参照:Qt/KDEでのdeleteの挙動
void kiosample::setupGUI() { QVBox* mainVBox = new QVBox(this); QHBox* srcHBox = new QHBox(mainVBox); QLabel* srcLabel = new QLabel("Source URL", srcHBox); srcEdit = new KLineEdit(srcHBox); QHBox* targetHBox = new QHBox(mainVBox); QLabel* targetLabel = new QLabel("Target URL", targetHBox); targetEdit = new KURLRequester(targetHBox); startGetButton = new KPushButton("Start Getting!", mainVBox); QObject::connect(startGetButton, SIGNAL(clicked()), this, SLOT(slotGetStart()) ); setCentralWidget(mainVBox); }
このメソッドでは各種のGUI部品を作っています。 レイアウトに関しては、LabelとEditを横にならべ(QHBox)、そしてそれらを縦に並べる(QVBox)という構成になっています。 またボタンがクリックされるとslotGetStart?()を呼び出すようにSignal&Slotを設定します。
void kiosample::slotGetStart() -{ +{ if (srcEdit->text().isEmpty() || targetEdit->url().isEmpty()) return; if (isDownloading) return; //ダウンロード中 kdDebug() << "kiosample : slotGetStart()" << endl; downloadData = new QBuffer; downloadData->open(IO_WriteOnly); /* ダウンロード開始 */ KIO::TransferJob* job = KIO::get(KURL(srcEdit->text()), false, false); QObject::connect(job, SIGNAL(data(KIO::Job *, const QByteArray &)), this, SLOT(slotData(KIO::Job *, const QByteArray &))); QObject::connect(job, SIGNAL(result(KIO::Job *)), this, SLOT(slotJobFinished(KIO::Job *))); isDownloading = true; }
ここが肝心のKIO::getを呼び出しているところです。 まずAPIを参照してTransferJob?を作り、そのjobが発信するsignalと下で説明するslotを接続しています。 また、job->addMetaData?("UserAgent?", "kiosample")等とすることによってjobに付加情報も与えることができます。
void kiosample::slotData(KIO::Job *job, const QByteArray& data) { if(data.isEmpty()) return; /* *データをバッファに一時保存 *slotDataは複数回呼ばれる可能性が有ります */ downloadData->writeBlock(data.data(), data.size()); }
KIO::getが他のoperationと違う点は、データを受け取って来るという点です。 そしてそのデータを受け取っている部分がここです。 slotDataは先程jobのdataシグナルと結びつけました。 また、この部分は複数回呼ばれる可能性があるため、QBufferオブジェクトに一時的に受け取ったデータを書き込んでいます。
void kiosample::slotJobFinished(KIO::Job *job) { if( job->error() ){ job->showErrorDialog(); isDownloading = false; return; } //ファイルに書き込み QFile file(targetEdit->url()); file.open(IO_WriteOnly); file.writeBlock(downloadData->buffer()); //一時データを削除 delete downloadData; downloadData = 0; isDownloading = false; KMessageBox::information(this, "Download Finished!"); }
jobが処理を終了したというシグナルを発するとこのスロットが呼ばれます。(上で呼ばれるようにしました) まずはエラーが起きていないかどうかをチェックし、それから先程受け取ったデータをファイルに書き込みます。 また、一時データをnewしたことを忘れないで下さい。newしたものは必ずdeleteしなければいけません。QObjectの子クラス以外は。
元記事:"Kastle 2003: What to expect from Qt 4"
間違いを見つけたら、どんどん修正しちゃってください。
また、直接編集しにくい場合には、一番下のコメント投稿機能を利用してみてください。
日曜日の午後、Qtの開発ディレクターであるMatthias Ettrich氏は、Nové Hradyで開催されたKDE Developers' Conference 2003において、企業(Trolltech)のプレゼンテーションとは別に、the KDE/FreeQt FoundationとQtの開発におけるのこれまでとQt4に対する展望について話をする機会を与えられた。Qt4は、2004年にリリースされる予定であり、スタートアップや実行時におけるパフォーマンスの向上、より高い柔軟性と生産性、そして、学習プロセスの簡素化のための変更などが提供されるはずです。Matthias氏の自作のプレゼンテーションプログラムを使って表示されたスライドショーからのより多くの引用を読んで下さい。
Qt4は、大概は、検索や置換や「互換モード」といったコンパイルスイッチをほとんど使うことなく、ソースコード互換性が維持されるように試みられています。より多くのポーティングは、メタオブジェクトシステムを直接使うようなスタイルとコードにとって必須でしょう。
シンボルの削減、データの読み書きを減らし、静的な初期化をより僅かにすることで、スタートアップのパフォーマンスの向上が達成されるでしょう。また、mallocの回数の低下、より速くそしてさらに最適化されたツールクラス、メモリ消費の減少によって実行時のパフォーマンスが向上し、今日のデスクトップコンピュータよりも遅く、少ないメモリしか積んでないような組み込みデバイス上でもQt4が動作することが可能になるでしょう。
これらの発言を確固としたものにするために、Matthias氏は、Qt4でコンパイルするために必要なだけの変更をし、ポーティングしたQtデザイナーについて、いくつかの数字を提供しました。その内容は次の通りです。libqtのサイズは5%減少し、Qtデザイナーのリロケーションの数は30%減少し、mallocの回数は51%減少し、メモリの使用量は15%減少しました。また、正確に計ったQtデザイナーの起動時間は、18%減少しました。
Qt4は、1つのライブラリにはならず、より細かい粒度を可能とするよう、複数のライブラリによって構成されるようになります。例えば、以下の通り。
Qt4の新機能で、現時点で公開されているものの一部としては、以下のものがあります。
軽くて安全で使いやすい値ベースのコンテナ・ツールのクラスの、一貫した新しいセットをQt4は提供するでしょう。また、このコンテナ・ツールのクラスは、明示的に分けられ、スピードとメモリの使い方双方の点で高度に最適化されているでしょう。これを使うことは、Qt3.xやSTLの場合と比較されるようなわずかなコードまで拡大されていくでしょう。STLは、よりQtと共に使える状態になっているでしょう。
QStringとQByteArray?は、APIの改善の他に、パフォーマンスとメモリ使用の点について最適化されています。(そのAPIの改善における)重要な変更は、isNull()が無くなり、互換モードでのみ用意されます。latin1()のような関数は、常に妥当な値を返し、nullポインタを返すことは無くなるでしょう。この変更は、KDE開発者の間での議論となり反感をかいましたが、Matthias氏は、isEmpty()関数と演算子"!()"が存在していることを指摘しました。
Qt4は、来年中に最終リリース前の短いパブリックベータの期間を経て、1年以内に利用できるでしょう。これに加えて、Matthias氏がKDE開発者に対して質問をしました。その内容は、「KDEはQt4に移行するのか? 移行するとすればいつか?」、「KDEが移行するとき誰がどこで最初のポーティングを行うのか?」、「KDEのアーキテクチャのいくつかを書き直す機会としても使いますか?」といったものでした。多くのKDE開発者からの返答としては、hackfest週間において、KDEに必要とされていて長期間見あたらないと分かっているような追加されたクラスや機能について、Trolltech開発者にたずねるというものでしょう。
直接編集しにくい場合には、こちらからコメントを投稿してください。
コメントのリスト
投稿者 | サマリ | 投稿日 |
---|---|---|
Daisuke Kameda | コメント投稿のテスト | 2003-08-31 (日) 16:11:53 |
kdebase?
本家サイト : http://www.konqueror.org/
ファイルマネージャとしてもブラウザとしても動作します。
silent機能を持っており、常にバックグラウンドで待機させることができます。これによって起動時間が格段に速くなります。
また待機させる数はKControlで設定することができます。(もちろん切ることもできます)
検索URI http://www2.alc.co.jp/ejr/index.php?word_in=\{@}&word_in2=&word_in3=*
#!/bin/sh kfmclient openURL $@というシェルスクリプトを作ってコマンドパスに加えると便利です。
Konstruct-JPはKonstructに日本語パッチを付属して配布するものです。
現在、KDE/Qt関連のパッチが非常に散乱した状態に有る上、パッチを当ててまで問題を直そうとするユーザーは少ないと思われます。
そこでインストールする段階から組込んでおけば有る程度はパッチを作った人達の努力も報われるのではと思った次第です。
御意見やこのパッチも加えたらいいんじゃねえの等有りましたら是非寄せて頂きたいと思います。
対象パッケージ | パッチ名 | 内容 |
今(3.2.1リリース)は特に当てるべきパッチが存在しません。 もし有りましたらコメント下さい。
3つの作業をするだけです。
また、パッチは↓の様に、 work/packagename-versinon/path/to/file という様に編集する必要が有ります。
--- work/kdelibs-3.2.0/khtml/rendering/bidi.cpp 2004-02-05 13:44:14.000000000 +0900 +++ tmp/kdelibs-3.2.0.new/khtml/rendering/bidi.cpp 2004-02-05 13:48:49.000000000 +0900
KonstructはGARを用いたKDEのビルド補助ツールです。
cd meta/kde;make installというコマンドだけでKDE全体をインストールできます。
現在のversionは次の通りです。
stable版 | 3.3.2 |
cd meta/kde;make install cd i18n/kde-i18n-ja;make install
export KDEDIR=~/kde$version export QTDIR=~/kde$version export LD_LIBRARY_PATH=~/kde$version/lib export PATH=~/kde$version/bin:$PATH
make installを実行するとringサーバーや他の場所からtar玉、そしてpatchのダウンロードが始まり、自動的にビルドが始まります。
他に入れたい物があればディレクトリを探索しましょう。一番下にも一部のせています。 以上。楽でしょう?
(注)kde$versionとなっている所はkde3.1等と任意に解釈して下さい。
"Konstruct"はKDEとその関連アプリケーションのインストールを補助するビルドシステムです。
ソースのtarballをダウンロードし、状態をチェックし、解凍し、パッチをあて、configureを実行し、ビルドを行ない、そしてインストールします。
KDEを完全にインストールするには、"cd meta/kde;make install"とするだけという簡単さです。
オプションとしてKOffice?やKDevelopそしてQuanta?といったソフトウェアも例えばkofficeの場合"cd apps/koffice; make install"と打つだけでインストールすることができます。
デフォルトではKonstcurtは"~/kde$version"ディレクトリにソフトウェアをインストールします。
これは、インストールするのにルート権限が必要なく、システムを汚すことも無く、Konstructを用いてインストールされたKDEは他のKDEには影響しないということです。
↓のテーブルは何MBのtarballがダウンロードされるかを示しています:
Directory/Target | Size | Description -------------------+---------+--------------------------------------------- kde/kdebase | 40MB | ブラウザ、エディタ、ターミナル等 meta/kmail-crypto | 48MB | [[kdenetwork]]とcryptoライブラリ meta/kde | 105MB | "KDE $version"に属する全てのパッケージ meta/everything | 177MB | 本体に加えたすべてのアプリケーション。↓の表を見て下さい。
↓のテーブルはmeta/everythingに含まれない物を示しています。
Directory/Target | Reason ------------------------+--------------------------------------------------- apps-unstable/ | Development versions, conflicting with apps/ i18n/ | Nobody needs everything, just pick your language kde/kdebindings | Only needed for developing with non-C++ language
すでにQT3.1をインストールしている場合は、環境変数 HAVE_QT_3_1_INSTALLED("設定"を見て下さい)を設定してください。上記の表からダウンロードすべきMBが12MBずつ引かれます。(falseではなくコメントアウトして下さい。)
母国語にローカライズされたKDEをインストールしたいなら、i18n/ディレクトリを覗き、母国語のディレクトリに入って"make install"としてください。KOfficeをローカライズするには、"i18n/koffice-i18n-<language-code>"パッケージをインストールしてください。
"Konstruct"はStephan Binner(binner@kde.org)によってメンテナンスされています。 またNick Moffitt(http://www.lnx-bbc.org/garchitecture.html)によるGAR portsシステムに依っており、Jeff WaughによるGARNOME(http://www.gnome.org/~jdub/garnome/)に刺激を受けて開発されました。
GNU tool(gcc, GNU make, flex, BSD yacc, gettext, patch etc.)とgzip and bzip2, md5sum, patch, wgetが必要です。
他の基本的なライブラリや、追加機能を可能にするライブラリは"Konstruct"には含まれていません。
http://www.kde.org/info/requirements/3.1.htmlに示されています。 "-dev"や"-devel"に含まれるヘッダファイルをインストールしなければならないことに注意して下さい。
好きなように gar.conf.mk を変更してください。便利なオプションは、:
GARCHIVEDIR すでにソースファイルをダウンロードしている場合はそのディレクトリを指定して下さい。 prefix どこにKDEをインストールするか。デフォルトでは"~/kde$VERSION/"です。 OWN_CFLAGS コンパイラフラグを設定します。 HAVE_QT_3_1_INSTALLED (moc, uic, headerを含む)Qt3.1をインストールしているかどうかを 設定します。Qtのインストールを省くことができます。 BUILD_CLEAN ディスクの空き容量が少ない場合はセットして下さい。
まずインターネットに接続できることが必要です。
次にビルドしたいターゲットを選び、それが定義されたディレクトリに移動して下さい。(例えば kdebase? なら "cd kde/kdebase")
そして次に紹介するコマンドを入力して下さい。通常は"make install"と入力すればよいです。
それぞれのパッケージにGARシステムは7つのMakeターゲットを提供しています。
command | description |
fetch | パッケージをコンパイルするのに必要なすべてのファイルとパッチをダウンロードします。通常はtarball一つだけですが、たまにパッチが伴うことがあります。 |
checksum | md5sumを使用してダウンロードしたファイルがメンテナーのものと適合するかどうかを確かめます。 |
extract | 必要なすべてのソースファイルが作業ディレクトリにあるかどうかを確かめます。 |
patch | パッチ(3rdパーティーのパッチもしくはメンテナーのパッチ)を当てる必要がある場合はパッチを当てます。 |
configure | パッケージをconfigureします。一般的にはautoconfやImake等を実行します。 |
build | 通常のコンパイル過程を行います。 |
install | 適切な場所にファイルを配置し、必要なすべての処理を仕上げます。 |
インストール後はKDEのバイナリとライブラリをシステムに探させるためにいくつかの変数を設定します。Bashの例:
export QTDIR=~/kde$version export KDEDIRS=~/kde$version export LD_LIBRARY_PATH=~/kde$version/lib export PATH=~/kde$version/bin:$PATH
KDEHOMEも設定してください。例えば"export KDEHOME=~/.kdetest"とすると設定をこのディレクトリに保存するようになるので、デフォルトの~/.kdeディレクトリには影響を及ぼしません。
KDEをスタートするには"startkde"を実行します。ほとんどのディストリビューションではこれをWINDOWMANAGER変数にセットするとKDEがスタートします。
-KDE 用のマルチメディアプレーヤー。
mplayer を利用しているため、以下のようなフォーマットを再生できる。
(まだまだある…)
当然、このアプリを利用するには mplayer のインストールが必要。
他の KDE 用のマルティメディアプレーヤーには kdemultimedia に標準で入っている noatun、mplayer に加え xine を利用する kmplayer などがある(kmplayer の利用には xine やmplayer に加え kdemultimedia のインストールが必要)。
kplayer ホームページ:http://kplayer.sourceforge.net/
mplayer ホームページ:http://www.MPlayerHQ.hu/homepage/
MPEG 等には特許の問題があるので、そのあたりは自己責任で…
Lokalize ホームページ : http://userbase.kde.org/Lokalize
日本語翻訳の方法 TranslationAssignments
ここではLokalizeの最低限の設定と使用法について説明します。
LokalizeはKDEの翻訳チームが使用しているKDE4向け(KDE3ではKBabelというツールを使用していました)の翻訳補助ツールです。翻訳メモリ(Translation Memory)による類似翻訳検索、編集の面において、強力な機能を持っています。翻訳メモリは共通フォーマットを使用しているため、PO/POTやXLIFFを使用している他の翻訳プロジェクトの人にも有用なツールでしょう。
"設定"→"Lokalizeを設定..."にて設定ダイアログを開きます。 翻訳者と言語の情報を以下のように入力して下さい。(MLはKdeveloper宛にして下さい)
"作成"で新たなTMを作成します。ここでのディレクトリはダウンロードした"trunk/l10n-support/ja/messages"の"messages"があるフォルダを指定します。
ここでもルートフォルダとしてダウンロードした"trunk/l10n-support/ja/messages"の"messages"があるフォルダを指定します。
このようにプロジェクトの設定を行った場合、以下のようにリアルタイムの翻訳状況が確認できるようになります。
以下のショートカットを覚えていくと作業がはかどります。
NetAccess?はKIOを簡単に使うためのインターフェースクラスです。 これを使う事によって一連のネットワーク処理を行う事ができます。 ただし、NetAccess?は同期的です。つまり、ネットワーク処理が終わるまで次の処理が行われません。この点は注意して下さい。
NetAccess?のリファレンス : http://developer.kde.org/documentation/library/cvs-api/kio/html/classKIO_1_1NetAccess.html
if (!NetAccess::download(KURL("http://www.kde.gr.jp/"), "~/index.html", this)) kDebug() << "download failed" << endl;
これは http://techbase.kde.org/Development/FAQs を訳したものです。かなり昔に訳されたものなので、最新版と同期がとれていない可能性があります。内容は近々本家 Wiki にコミットされ、このページ自体は削除される予定です。
新たに書かなければいけない KDE アプリケーションがたくさんあるのは間違いありません。しかし、 あなたの助けを必要とする既存の KDE アプリケーションがたくさんあるのも確かです。
どの分野に助けが必要か知るには、このページをチェックしてください。
新しいアプリケーションを書き始める前に、apps.kde.com や kde-devel@kde.org のメーリングリストで、誰かが似たようなプロジェクトをしていないかどうか確かるのは良いことです。
job list でオープンな仕事をチェックして下さい。あなたができる仕事は必ず1つはあるでしょう。
KOffice や Kdevelop などは高く評価されているにもかかわらず、開発者がとても少ないです。ですからそのあたりをチェックすると良いかも知れません。KDE のプロジェクトを手助けするのに、KDE のコアの開発者になる必要はりません。KDE は非常にうまくモジュール化されているので、全体のシステムがどうなっているか知らなくても、1つの分野を改良することができます。
また、kde-devel メーリングリストで、誰かがアプリケーション上での手助けを必要としているか質問することができます。
最新の KDE を使い必要とされていることを見付けて下さい。テーマジェネレータですか?konsole のスキーマエディタですか?ゲームの改良ですか?いつも小さな特徴が抜けているものです。実装してしまいましょう。
特定の分野に関してくわしかったり、興味があったりしますか?あなたの手助けが役に立つその分野に関連するアプリケーションがないかチェックして下さい。もしくはそのようなアプリを書いて下さい。KDE はおたく向けではないアプリケーションをもっと必要としています。
開発者のスキルを必要としない仕事がたくさんあります。KDE の促進のためにアプリケーションのレビューを書いたり(kde-promo メーリングリストを見て下さい)、ドキュメントチームを手伝ったり(i18n.kde.org/doc を見て下さい)、翻訳を手伝ったり(i18n.kde.orgを見て下さい)、新しく出てくるバグをフィルタリングするのを手伝って下さい(bugs.kde.org を見て下さい)。
ftp://ftp.kde.org/pub/kde/devel/konqi_sdk.tar.bz2 で入手可能です。
To begin with we'll just create a very simple GUI consisting only of
a menubar containing a single menu. The only item in the menu will be the
`Exit' command. From this rather humble beginning we'll extend our
application into a simple but functional text editor. This may seem like
a rather formidable task for a tutorial, but as you will see by
reusing the existing components provided by Qt and KDE it is made very
simple in practice. I'll give the code first then go through it
in detail afterwards. All of the example code is available free for
download from the KDE development website at
http://developer.kde.org/examples.tar.gz.
#ifndef EDIT_H #define EDIT_H #include <ktopwidget.h> class Edit : public KTopLevelWidget { Q_OBJECT public: Edit(); ~Edit(); public slots: void commandCallback(int id_); private: // Child widgets KMenuBar *menu; }; #endif // EDIT_H |
#include <kapp.h> #include <kmenubar.h> #include "edit.h" const int ID_EXIT= 111; Edit::Edit() { QPopupMenu *file = new QPopupMenu; file->insertItem(klocale->translate("Exit"), ID_EXIT); menu = new KMenuBar( this ); CHECK_PTR( menu ); menu->insertItem( klocale->translate("File"), file ); menu->show(); setMenu(menu); // Connect things together connect (file, SIGNAL (activated (int)), SLOT (commandCallback (int))); } Edit::~Edit() { } void Edit::commandCallback(int id_) { switch(id_) { case ID_EXIT: exit(0); break; } } #include "edit.moc" |
Now we'll study the implementation of our Edit class, looking first at the constructor. The constructor creates a QPopupMenu object, this is the File menu. We add the `Exit' item using the insertItem() method. The first parameter is the string to be displayed in the menu, the second is an integer id (you can find out about all the methods of a class by looking at it's class documentation). In order to prepare the applet for translation we call klocale->translate() rather than just setting the label to the literal string 'Exit', this should be done for any string the user will see. We don't have to create our own KLocale object as KApplication (the base class of all KDE application objects) creates one for us. We access the KLocate object using the klocale macro provided by kapp.h.
The next thing we need to do is create a menubar to contain our menu, we do this using a KMenuBar widget. The CHECK_PTR macro used to ensure the widget was created successfully is a Qt provided macro that checks it's parameter is not 0 (if the parameter is 0 it terminates the application with an error message). We create the 'File' item in almost the same way as we created the menu entry (the similarity should come as no suprise once you know that QPopupMenu and KMenuBar have a common baseclass QMenuData). Again we need to call KLocale as string 'File' will be visible to the user. We display our menu by calling its show() method then tell KTLW to manage our menu with setMenu().
The final stage in making our applet work is to connect the menubar
entry to some code to exit the application, that's what the
connect() call does. Qt applications (and hence KDE
applications) use signals and slots to wire one widget to another. A
widget (or any other QObject) will emit a signal whenever it's state
changes, our applet uses the activated() signal that a
QPopupMenu emits when a user selects a menu item. This signal must be
connected to the commandCallback() slot we declared in the
Edit class. As you can see the commandCallback() slot
looks no different to a normal method, the only difference is the
declaration that this method is a slot in the header file.
commandCallback() exits the program if the id_ parameter it was
passed is the constand ID_EXIT - the same constant we used to identify
the 'Exit' menu item. Signals and slots can have parameters and they
are treated like those of any other method. Qt checks that the type
signature of the signal matches that of the slot (and reports the
error if they do not match). Now we can take a look at the
connect() method call in the Edit constructor.
connect (file, SIGNAL (activated (int)), SLOT (commandCallback (int))); |
The first parameter is the object that will omit the signal, in our case it's the QPopupMenu file. The next parameter is the signal to be connected, you must specify the name of the signal and the types of it's parameters (as they appear in the class header file or class documentation) using the SIGNAL() macro. The last parameter connect() takes is the slot specified using the SLOT() macro and specifying it's parameters as before. Qt will inform you at run time if the connection is invalid. QObject provides a number of other overloaded versions of the connect() method, you should look at the Qt class documentation for more details. It is perfectly acceptable to connect a signal to more than one slot or to connect more than one signal to a single slot.
The last feature to note about this simple applet is that we include the file edit.moc at the end of the class implementation. The `moc' file is the output of the moc preprocessor that must must be applied to any class that inherits QObject. You normally invoke moc via a makefile rather than directly and you must ensure that its output is compiled and linked to your application. The easiest way to ensure this is to simply include the moc output in the class implementation which is the approach used here. It is important to ensure that moc is rerun if you change the class declaration or you may get strange errors.
You may think that this was a lot of work just to create a completely useless applet, but we've come a long way already: We've learned about session management, creating menus, internationalisation and the basis of Qt, signals and slots. The next stage will be to make our applet actually do something!
You can see the complete code for this version of Edit as example2 in the source files for this tutorial.
Qt provides us with QMultiLineEdit, a widget for editing text, this
will form the core of our editor applet. We declare a member variable
to hold the widget in the Edit class declaration like this:
QMultiLineEdit *view; |
view= new QMultiLineEdit(this, "Main View"); setView(view); |
We already know how to add menu items, so adding some new ones for
load and save is easy. The code is almost the same as that for the
'Exit' item (note that we now need some more constants like ID_SAVE to
identify the new commands).
file->insertItem(klocale->translate("Open..."), ID_OPEN ); file->insertItem(klocale->translate("Save"), ID_SAVE); file->insertItem(klocale->translate("Save As..."), ID_SAVEAS); |
Now that we've created the menu items, all that remains is to make
them do something. The code required is very straight forward. We'll
look first at the `Open' command. All we need to do is create a new
case in the switch statement of the commandCallback() slot, and
then add the code to open a file.
case ID_OPEN: name= QFileDialog::getOpenFileName(); if (!name.isEmpty()) { load(name); } break; |
The load method uses the QFile class to read the contents of the
selected file. The QFile class is provided by Qt and provides an
easy to use platform independent way to access files. It is used
here in combination with QTestStream which lets us read the contents
of the file a line at time. Each line is appended to the text widget
as it is read.
It is important to keep track of the name of the current file name
(so we can implement `Save') so we add a new instance variable
filename_ to the Edit class. This value is set by the load
method.
void Edit::load(const char *filename) { QFile f( filename ); if ( !f.open( IO_ReadOnly ) ) return; view->setAutoUpdate( FALSE ); view->clear(); QTextStream t(&f); while ( !t.eof() ) { QString s = t.readLine(); view->append( s ); } f.close(); view->setAutoUpdate( TRUE ); view->repaint(); filename_= filename; } |
The 'Save As' command is almost the same as the 'Open' command. We now
use the getSaveFileName() which unlike getOpenFileName()
does not require that the filename choosen should be that of an
existing file. The save command is also easy: if we already know the
filename then save the text, if not then call the saveAs()
command.
case ID_SAVE: if (!filename_.isEmpty()) saveAs(filename_); else { name= QFileDialog::getSaveFileName(); if (!name.isEmpty()) saveAs(name); } break; case ID_SAVEAS: name= QFileDialog::getSaveFileName(); if (!name.isEmpty()) saveAs(name); break; |
void Edit::saveAs(const char *filename) { QFile f( filename ); if ( !f.open( IO_WriteOnly ) ) return; QTextStream t(&f); t << view->text(); f.close(); setHint(filename); filename_= filename; } |
case ID_ABOUT: QMessageBox::about(this, "About Edit", "This is a simple text editor example program."); break; |
The first thing we'll tackle is adding a status bar to our applet,
we'll use it to display the name of the currently open file. KDE
provides a status bar widget, KStatusBar, and KTLW knows how to manage
it, so there's not much left for us to do. KStatusBar has an API very
similar to that of the menu widgets so you should be able to figure
out what's going on. Note that after showing our status bar we tell
KTLW to manage it. We can change the string displayed on the status
bar using the id constant ID_HINTTEXT, this is implemented in the slot
setHint().
void Edit::initStatusBar() { statusbar= new KStatusBar(this); statusbar->insertItem("Welcome to Edit", ID_HINTTEXT); statusbar->show(); setStatusBar(statusbar); } void Edit::setHint(const char *text) { statusbar->changeItem(text, ID_HINTTEXT); } |
We set the string in the status bar when the user invokes any method that changes the filename, for example loading and saving.
We'll now add a toolbar to Edit, this is slightly more complicated as
we need to assign icons to the buttons and setup the tooltips. We make
use of the KIconLoader class to handle loading (and caching) of the toolbar
icons. This class searches in the directories specified by the KDE File
System Standard for an icon, which as we're only using standard icons, suits
us fine. We use a macro provided by kapp.h to access the icon loader
created by KApplication.
void Edit::initToolBar() { KIconLoader *loader = kapp->getIconLoader(); toolbar = new KToolBar(this); toolbar->insertButton(loader->loadIcon("filenew.xpm"), ID_NEW, TRUE, klocale->translate("Create a new file")); toolbar->insertButton(loader->loadIcon("fileopen.xpm"), - ID_OPEN, FALSE, + ID_OPEN, FALSE, klocale->translate("Open a file")); toolbar->insertButton(loader->loadIcon("filefloppy.xpm"), - ID_SAVE, FALSE, + ID_SAVE, FALSE, klocale->translate("Save the current file")); addToolBar(toolbar); toolbar->setBarPos(KToolBar::Top); toolbar->show(); connect(toolbar, SIGNAL(clicked(int)), SLOT(commandCallback(int))); } |
We connect the toolbars clicked signal to the same slot as we use for the menus. This is perfectly safe as we are using the same id numbers for commands in each, and we are free to connect as many signals as we want to a slot.
It is generally good practice when designing a user interface to prevent the user invoking an operation that cannot be performed. We do this in Qt by enabling and disabling widgets depending on the state of the application. For example if you have made no changes to a document then saving to its original file makes no sense (though saving it to a different file is often useful). All Qt and KDE widgets have a method setEnabled() which is used to `grey out' the widget and disable it.
KMenuBar and KToolbar both make the process of enabling and disabling
their entries easy by providing a method which will set the state of
an entry specified by its command id. We call both of these in the
implementation of enableCommand().
void Edit::enableCommand(int id) //SLOT { toolbar->setItemEnabled(id, true); menu->setItemEnabled(id, true); } void Edit::disableCommand(int id) // SLOT { toolbar->setItemEnabled(id, false); menu->setItemEnabled(id, false); } |
void Edit::textChanged() { modified= true; enableCommand(ID_SAVE); enableCommand(ID_SAVEAS); } |
The final thing we will add to our editor in this section is a confirmation dialog to be shown when the user tries to exit when there are unsaved changes in the editor. The dialog is a standard Qt warning dialog.
The dialog is implemented using the exit() method. This method simply tests the flag we created to indicate modifications, and uses another static method of QMessageBox to display a warning dialog.
int Edit::exit() { int die= 0; - + if (!modified) die= 1; else if (QMessageBox::warning(this, klocale->translate("Unsaved Changes"), "You have unsaved changes, you will loose " "them if you exit now.", "Exit", "Cancel", 0, 1, 1)) die= 0; else die= 1; return die; } |