KDE3 プログラミング Tips @ KDE - Linux Life

はじめに

KDEアプリケーションを作る際の小技をメモしておきます。

カーソルを砂時計にする

内部で作業中の時にカーソルの形状を変えます。

QApplication::setOverrideCursor( Qt::waitCursor );
(作業)
QApplication::restoreOverrideCursor();

文字列を分割

QStringをある文字で分割してQStringListに格納する方法です。

#include <qstring.h>
#include <qstringlist.h>
QStringList list = QStringList::split( "\t", QString("あいうえお\tかきくけこ\tさしすせそ") );

リモートファイルを開く

リモートから取得した一時ファイルを開き、作業が終わったら一時ファイルを消します。

#include <kurl.h>
#include <kio/netaccess.h>
QString filename;
KURL url = ???;
KIO::NetAccess::download( url, filename );
(作業)
KIO::NetAccess::removeTempFile( filename );

リモートファイルに保存

一時ファイルに保存したあとリモートにアップロードします。

#include <kurl.h>
#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を書きます。

<Menu name="popup_menu">
    <Action name="???"/>
</Menu>

これをKMainWindowで以下のように取得します。

KPopupMenu* popup = factory()->container( "popup_menu", this );

外部コマンドを利用する

Qtで`ls -l`みたいな結果を得る方法です。

#include <qprocess.h>
proc = new QProcess( this );
proc->addArgument( "ls" );
proc->addArgument( "-l" );
connect( proc, SIGNAL( readyReadStdout() ), this, SLOT( slotReadStdout() ) );
proc->start();

として、以下のようなスロットで出力結果を得ることができます。

void ClassName::slotReadStdout()
{
    while( proc->canReadLineStdout() ){
        QString line( proc->readLineStdout() );
    }
}

ファイルサイズを取得する

ファイルのサイズを取得する方法としてまず思い付くのが QFileInfoクラスの size()メソッドを利用する方法です。

uint getSize( QString str /* path */ )
{
    QFileInfo info( str );
    return info.size();
}

しかし、この方法ではuintの範囲(約3.7GB?)までしか取得できません。 で、色々調べた結果以下のようにKIO::KFileItemクラスを使うことでそれ以上のサイズを取得することができました。

unsigned long long getSize( QString str /* path */ )
{
    KURL url( str );
    KFileItem item( KFileItem::Unknown, KFileItem::Unknown, url );
    return (unsigned long long)item.size();
}

unsigned long longを出力する

kdDebug() にusigned long long型の変数を表示させようとするとコンパイル時にエラーがでました。 が、以下のようにするとうまく表示できます。

unsigned long long l = 16907753271;
kdDebug() << QString::number( l ) << endl;

KProgressDialogの使い方

KProgressDialogクラスをつかった最小限のサンプルです。 ラベルが表示されないボタンが表示されないなどの問題に悩まされたのですが、以下のコードをループのなかに埋め込むことで解決しました。

kapp->processEvents();

kappは<kapplication.h>内で定義されているグローバル変数です。 QApplication::processEvents()を呼ぶことで処理待ちのイベント(描画等)を処理することができます。 Visual Basicで言うところのDoEventsにあたります。

サンプルダウンロード:kprogressdialogtest-0.1.0.tar.gz

ダイアログのOKボタンで処理をする

ダイアログでOKボタンを押された時に、エラーチェックや保存等の処理をする場合はslotOkをオーバーライドします。 特に目新しいことではないのですが・・・。

void ClassName::slotOk()
{
    // エラーチェックをし、エラーがあったら処理を中断
    if( isError() ) return;
    // 保存処理をし、不成功だったら処理を中断
    if( !saveConfig() ) return;
    // 正常な時は通常のOKボタンの処理をする
    KDialogBase::slotOk();
}

URLをブラウザで開く

KRunクラスを使うと簡単にできます。

void ClassName::openURL( const KURL& url )
{
    (new KRun( url ))->setAutoDelete( true );
}

SourceForge.jpへ移行

KreetingKardをCVSで管理することにした時のメモです。

$ ssh-keygen -t rsa1 で公開鍵(~/.ssh/identity.pub)を作成

Change Authorized Keysに公開鍵を入力

以下の内容で~/.cvsignoreを作成

Makefile
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

CVSにも含めるため作業ディレクトリにもコピー

ローカルの開発ディレクトリ 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クラスを利用して最小限のサンプルを作成しました。 メインの部分のみ載せます。

KSystemTrayTest::KSystemTrayTest()
    : KMainWindow( 0, "KSystemTrayTest" )
{
    m_tray = new KSystemTray( this );
    m_tray->setText( "ab" );
    m_tray->show();
    connect( m_tray, SIGNAL( quitSelected() ), this, SLOT( hide() ) );
}
bool KSystemTrayTest::queryClose()
{
    if( isVisible() )
    {
        hide();
        return false;
    }
    return true;
}

サンプルダウンロード:ksystemtraytest-0.1.0.tar.gz

通知する

KNotifyの機能を使う方法です。

/* プログラム */
#include <knotifyclient.h>
KNotifyClient::event( winId(), "タイトル", i18n( "メッセージ" ) );
# sounds/Makefile.am
soundsdir = $(kde_datadir)/application_name/sounds
sounds_DATA = a.ogg
EXTRA_DIST = $(sounds_DATA)
appdatadir = $(kde_datadir)/application_name
appdata_DATA = eventsrc
# sounds/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ファイルを読み込む

データに改行を含まない場合は以下のように読み込めます。

QFile file( filename );
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の追加

[Desktop Entry]
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 にエントリの追加

MimeType=application/x-kaa
Patterns=*.aa;

Makefile.am に以下を追加

mimedir = $(kde_mimedir)/application
mime_DATA = x-kaa.desktop

スポンサードリンク

Copyright © 2025 Linux-Life.net