KDEプログラミングTips
はじめに
KDEアプリケーションを作る際の小技をメモしておきます。
- GUI
- ファイル
- デバッグ
- 開発
- その他
カーソルを砂時計にする
内部で作業中の時にカーソルの形状を変えます。
(作業)
QApplication::restoreOverrideCursor();
文字列を分割
QStringをある文字で分割してQStringListに格納する方法です。
#include <qstringlist.h>
QStringList list = QStringList::split( "\t", QString("あいうえお\tかきくけこ\tさしすせそ") );
リモートファイルを開く
リモートから取得した一時ファイルを開き、作業が終わったら一時ファイルを消します。
#include <kio/netaccess.h>
QString filename;
KURL url = ???;
KIO::NetAccess::download( url, filename );
(作業)
KIO::NetAccess::removeTempFile( filename );
リモートファイルに保存
一時ファイルに保存したあとリモートにアップロードします。
#include <kio/netaccess.h>
#include <ktempfile.h>
KURL url = ???;
KTempFile tmpfile;
tmpfile.setAutoDelete( true );
QString filefame = tmpfile.name();
(作業)
KIO::NetAccess::upload( filename, url );
XMLGUIファクトリーからポップアップメニュー
ポップアップメニューをXMLGUIファクトリーから使うにはまず以下のようなXMLを書きます。
<Action name="???"/>
</Menu>
これをKMainWindowで以下のように取得します。
外部コマンドを利用する
Qtで`ls -l`みたいな結果を得る方法です。
proc = new QProcess( this );
proc->addArgument( "ls" );
proc->addArgument( "-l" );
connect( proc, SIGNAL( readyReadStdout() ), this, SLOT( slotReadStdout() ) );
proc->start();
として、以下のようなスロットで出力結果を得ることができます。
{
while( proc->canReadLineStdout() ){
QString line( proc->readLineStdout() );
}
}
ファイルサイズを取得する
ファイルのサイズを取得する方法としてまず思い付くのが QFileInfoクラスの size()メソッドを利用する方法です。
{
QFileInfo info( str );
return info.size();
}
しかし、この方法ではuintの範囲(約3.7GB?)までしか取得できません。
で、色々調べた結果以下のようにKIO::KFileItemクラスを使うことでそれ以上のサイズを取得することができました。
{
KURL url( str );
KFileItem item( KFileItem::Unknown, KFileItem::Unknown, url );
return (unsigned long long)item.size();
}
unsigned long longを出力する
kdDebug() にusigned long long型の変数を表示させようとするとコンパイル時にエラーがでました。
が、以下のようにするとうまく表示できます。
kdDebug() << QString::number( l ) << endl;
KProgressDialogの使い方
KProgressDialogクラスをつかった最小限のサンプルです。
ラベルが表示されない、ボタンが表示されないなどの問題に悩まされたのですが、以下のコードをループのなかに埋め込むことで解決しました。
kappは<kapplication.h>内で定義されているグローバル変数です。
QApplication::processEvents()を呼ぶことで処理待ちのイベント(描画等)を処理することができます。
Visual Basicで言うところのDoEventsにあたります。
サンプルダウンロード:kprogressdialogtest-0.1.0.tar.gz
ダイアログのOKボタンで処理をする
ダイアログでOKボタンを押された時に、エラーチェックや保存等の処理をする場合はslotOkをオーバーライドします。
特に目新しいことではないのですが・・・。
{
// エラーチェックをし、エラーがあったら処理を中断
if( isError() ) return;
// 保存処理をし、不成功だったら処理を中断
if( !saveConfig() ) return;
// 正常な時は通常のOKボタンの処理をする
KDialogBase::slotOk();
}
URLをブラウザで開く
KRunクラスを使うと簡単にできます。
{
(new KRun( url ))->setAutoDelete( true );
}
SourceForge.jpへ移行
KreetingKardをCVSで管理することにした時のメモです。
- $ ssh-keygen -t rsa1 で公開鍵(~/.ssh/identity.pub)を作成する
- Change Authorized Keysに公開鍵を入力
-
以下の内容で~/.cvsignoreを作成
MakefileCVSにも含めるため作業ディレクトリにもコピー
Makefile.in
acinclude.m4
aclocal.m4
autom4te.cache
config.h
config.h.in
config.log
config.status
configure
configure.files
configure.in
libtool
stamp-h.in
stamp-h1
subdirs
kreetingkard.kdevelop.pcs
kreetingkard.kdevses
- ローカルの開発ディレクトリ hoge/kreetingkard/ に移動
-
次のコマンドを実行すると「Permission denied (publickey,keyboard-interactive)」と出るので /etc/ssh/ssh_conf を編集してSSH1を優先にする。
Protocol 1,2
-
$ cvs -d:ext:stasuku@cvs.sourceforge.jp:/cvsroot/kreetingkard import kreetingkard vendor start
I kreetingkard/aclocal.m4
I kreetingkard/kreetingkard.kdevses
I kreetingkard/configure
I kreetingkard/autom4te.cache
I kreetingkard/configure.in
I kreetingkard/subdirs
I kreetingkard/Makefile.in
I kreetingkard/configure.files
I kreetingkard/config.h.in
I kreetingkard/acinclude.m4
I kreetingkard/stamp-h.in
I kreetingkard/kreetingkard.kdevelop.pcs
I kreetingkard/po/Makefile.in
I kreetingkard/doc/Makefile.in
I kreetingkard/doc/en/Makefile.in
I kreetingkard/src/Makefile.in
I kreetingkard/admin/CVS
N kreetingkard/Doxyfile
N kreetingkard/COPYING
N kreetingkard/ChangeLog
N kreetingkard/.cvsignore
N kreetingkard/INSTALL
N kreetingkard/kreetingkard.kdevelop
N kreetingkard/AUTHORS
N kreetingkard/Makefile.cvs
N kreetingkard/configure.in.in
N kreetingkard/Makefile.am
N kreetingkard/README
N kreetingkard/TODO
N kreetingkard/NEWS
cvs import: Importing
/cvsroot/kreetingkard/kreetingkard/templates N kreetingkard/templates/cpp
N kreetingkard/templates/h
cvs import: Importing
/cvsroot/kreetingkard/kreetingkard/admin
N kreetingkard/admin/configure.in.bot.end
N kreetingkard/admin/Doxyfile.am
N kreetingkard/admin/ChangeLog
N kreetingkard/admin/detect-autoconf.sh
N kreetingkard/admin/debianrules
N kreetingkard/admin/cvs-clean.pl
N kreetingkard/admin/ylwrap
N kreetingkard/admin/libtool.m4.in
N kreetingkard/admin/am_edit
N kreetingkard/admin/conf.change.pl
N kreetingkard/admin/nmcheck
N kreetingkard/admin/bcheck.pl
N kreetingkard/admin/cvs.sh
N kreetingkard/admin/mkinstalldirs
N kreetingkard/admin/missing
N kreetingkard/admin/config.sub
N kreetingkard/admin/install-sh
N kreetingkard/admin/acinclude.m4.in
N kreetingkard/admin/config.guess
N kreetingkard/admin/configure.in.min
N kreetingkard/admin/config.pl
N kreetingkard/admin/ltmain.sh
N kreetingkard/admin/Makefile.common
N kreetingkard/admin/depcomp
N kreetingkard/admin/Doxyfile.global
N kreetingkard/admin/compile
cvs import: Importing /cvsroot/kreetingkard/kreetingkard/src
N kreetingkard/src/kreetingkardui.rc
N kreetingkard/src/kkpropertyitemimage.cpp
N kreetingkard/src/kkcmdname.cpp
N kreetingkard/src/kkwidget.h
N kreetingkard/src/dlgfilenew.h
N kreetingkard/src/kkcmdinsert.h
N kreetingkard/src/simpleP.kk
N kreetingkard/src/simpleL.kk
N kreetingkard/src/dlgaddressbook.cpp
N kreetingkard/src/kkpropertyitemtextfont.h
N kreetingkard/src/kkpropertyitemorientation.cpp
N kreetingkard/src/dlgfilenew.cpp
N kreetingkard/src/kkcmdtext.h
N kreetingkard/src/kkcmdsize.h
N kreetingkard/src/dlgprint.cpp
N kreetingkard/src/kkcmdbase.cpp
N kreetingkard/src/kkcmdtextfont.h
N kreetingkard/src/hi16-app-kreetingkard.png
N kreetingkard/src/kkcmdimageprint.h
N kreetingkard/src/kkpropertyitemname.cpp
N kreetingkard/src/kkcmdname.h
N kreetingkard/src/kreetingkard.lsm
N kreetingkard/src/kreetingkard.cpp
N kreetingkard/src/kkview.h
N kreetingkard/src/kkpropertyitembase.cpp
N kreetingkard/src/kkpropertyitemimageprint.h
N kreetingkard/src/kkcmdlocation.cpp
N kreetingkard/src/kksizehandlerwidget.h
N kreetingkard/src/dlgpreferences.cpp
N kreetingkard/src/kkproperty.cpp
N kreetingkard/src/kkpropertyitemtextalign.h
N kreetingkard/src/simpleP.png
N kreetingkard/src/kkcmdimage.h
N kreetingkard/src/simpleL.png
N kreetingkard/src/kkcmdbase.h
N kreetingkard/src/emptyP.kk
N kreetingkard/src/emptyL.kk
N kreetingkard/src/kkpropertyitemlocation.cpp
N kreetingkard/src/kkitem.h
N kreetingkard/src/kkcmdtextorientation.cpp
N kreetingkard/src/kkcmdtextcolor.cpp
N kreetingkard/src/address.cpp
N kreetingkard/src/kkpropertyitemtextcolor.cpp
N kreetingkard/src/kkcmdtextorientation.h
N kreetingkard/src/dlgaddressbook.h
N kreetingkard/src/kkcmddatafield.cpp
N kreetingkard/src/kkpropertyitemdatafield.cpp
N kreetingkard/src/kksizehandler.h
N kreetingkard/src/hi32-app-kreetingkard.png
N kreetingkard/src/kkcmdimage.cpp
N kreetingkard/src/Makefile.am
N kreetingkard/src/kkpropertyitemorientation.h
N kreetingkard/src/kkproperty.h
N kreetingkard/src/dlgpreferences.h
N kreetingkard/src/kkpropertyitemtext.h
N kreetingkard/src/kkpropertyitemsize.h
N kreetingkard/src/kkcmdtext.cpp
N kreetingkard/src/kkview.cpp
N kreetingkard/src/kkcmdtextcolor.h
N kreetingkard/src/kkcmdsize.cpp
N kreetingkard/src/kkcmddatafield.h
N kreetingkard/src/dlgprint.h
N kreetingkard/src/splash.png
N kreetingkard/src/main.cpp
N kreetingkard/src/kkpropertyitemname.h
N kreetingkard/src/kkpropertyitemlocation.h
N kreetingkard/src/kkcmdtextfont.cpp
N kreetingkard/src/kksizehandlerwidget.cpp
N kreetingkard/src/emptyP.png
N kreetingkard/src/emptyL.png
N kreetingkard/src/kkcmdlocation.h
N kreetingkard/src/kkpropertyitemtext.cpp
N kreetingkard/src/kkpropertyitemsize.cpp
N kreetingkard/src/zipcode.cpp
N kreetingkard/src/kkpropertyitemtextfont.cpp
N kreetingkard/src/address.h
N kreetingkard/src/kkcmdimageprint.cpp
N kreetingkard/src/kkcmdremove.cpp
N kreetingkard/src/kkpropertyitembase.h
N kreetingkard/src/kkcmdinsert.cpp
N kreetingkard/src/kreetingkard.desktop
N kreetingkard/src/kkpropertyitemimageprint.cpp
N kreetingkard/src/kkitem.cpp
N kreetingkard/src/kkpropertyitemtextorientation.h
N kreetingkard/src/kkdoc.h
N kreetingkard/src/kkcmdtextalign.cpp
N kreetingkard/src/kkpropertyitemimage.h
N kreetingkard/src/kkpropertyitemtextalign.cpp
N kreetingkard/src/kkpropertyitemtextorientation.cpp
N kreetingkard/src/kkwidget.cpp
N kreetingkard/src/kkcmdremove.h
N kreetingkard/src/kkcmdtextalign.h
N kreetingkard/src/kreetingkard.h
N kreetingkard/src/zipcode.h
N kreetingkard/src/kksizehandler.cpp
N kreetingkard/src/kkpropertyitemtextcolor.h
N kreetingkard/src/kkdoc.cpp
N kreetingkard/src/kkpropertyitemdatafield.h
cvs import: Importing /cvsroot/kreetingkard/kreetingkard/doc
N kreetingkard/doc/Makefile.am
cvs import: Importing /cvsroot/kreetingkard/kreetingkard/doc/en
N kreetingkard/doc/en/index.docbook
N kreetingkard/doc/en/Makefile.am
cvs import: Importing /cvsroot/kreetingkard/kreetingkard/po
N kreetingkard/po/Makefile.am
No conflicts created by this import
KDevelopからCVSを使う
KreetingKardをCVSで管理することにした時のメモです。
kreetingkard.kdevelopをKDevelopで開き、
メニュー>プロジェクト>プロジェクトオプション>プラグイン
にCVSなんとかっていうのを発見してチェックをいれた。
左側のアイコンビューにCVSサービスという項目が現れたので
リモートシェルに「ssh」
サーバーの場所に「:ext:stasuku@cvs.sourceforge.jp:/cvsroot/kreetingkard」
で、KDevelopのメイン画面で左側のタブのファイルセレクタを選択し、
kreetingkard.kdevelopを 右クリックし、CVSサービスのなかの項目を選択すると
「この機能を使う前にローカルのワークコピーディレクトリを設置する必要があります。」
とエラーメッセージがでたが、プロジェクトを開き直すと使えるようになった。
システムトレイに常駐する
KSystemTrayクラスを利用して最小限のサンプルを作成しました。
メインの部分のみ載せます。
: KMainWindow( 0, "KSystemTrayTest" )
{
m_tray = new KSystemTray( this );
m_tray->setText( "ab" );
m_tray->show();
connect( m_tray, SIGNAL( quitSelected() ), this, SLOT( hide() ) );
}
{
if( isVisible() )
{
hide();
return false;
}
return true;
}
サンプルダウンロード:ksystemtraytest-0.1.0.tar.gz
通知する
KNotifyの機能を使う方法です。
#include <knotifyclient.h>
KNotifyClient::event( winId(), "タイトル", i18n( "メッセージ" ) );
soundsdir = $(kde_datadir)/application_name/sounds
sounds_DATA = a.ogg
EXTRA_DIST = $(sounds_DATA)
appdatadir = $(kde_datadir)/application_name
appdata_DATA = eventsrc
[!Global!]
IconName=application_name
Comment=Application_Comment
Comment[ja]=アプリケーションの説明
[Notify1] Name=notify_name
Name[ja]=通知名
Comment=notify_comment
Comment[ja]=通知の説明
default_sound=a.ogg
default_presentation=1
ドキュメントはKNotifyClientを参照。
CSVファイルを読み込む
データに改行を含まない場合は以下のように読み込めます。
if( !file.open( IO_ReadOnly ) )
{
// Error
return;
}
QStringList lines;
QTextStream stream( &file );
QString line;
QRegExp rx( "((\"(?:[^\"]|\"\")*\"|[^,]*)[,|\\n])" );
for( int i = 0; !stream.atEnd(); i++ )
{
line = stream.readLine() + "\n";
for( int j = 0; rx.search( line ) > -1; j++ )
{
QString cell = rx.cap( 2 );
line = line.mid( rx.cap( 1 ).length() );
if( cell.left( 1 ) == "\"" && cell.right( 1 ) == "\"" )
{
cell = cell.mid( 1, cell.length() - 2 );
cell = cell.replace( "\"\"", "\"" );
}
kdDebug() << "( " << i << ", " << j << " ) = " << cell << endl;
}
file.close();
}
参照:Perlメモ - CSV形式の行から値のリストを取り出す
Mimetypeに登録する
*.aa を Kaa というアプリケーションに登録するためには以下の作業が必要です。
x-kaa.desktopの追加
Encoding=UTF-8
Type=MimeType
MimeType=application/x-aa
Icon=kaa_doc
Patterns=*.aa
DefaultApp=kaa
Comment= Do aa
hi[16|32]-mime-kaa_doc.png みたいなアイコンの追加をします。
kaa.desktop にエントリの追加
Patterns=*.aa;
Makefile.am に以下を追加
mime_DATA = x-kaa.desktop