スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Qt Creatorでのカスタムプラグインの追加

自分で作ったウィジェットをQt Creator内のDesigner画面でウィジェット一覧に表示させて、GUIでアプリケーションに組み込めるようにする方法はCreating Custom Widgets for Qt Designerに述べられているし、またO'Reillyの「入門Qt4プログラミング」の5章にも書かれている。これらの方法は、実際には、Qt Creatorでプロジェクトの新規作成ウィザードから、「他のプロジェクト」の「Qt カスタム デザイナ ウィジェット」を選択して作成されるスケルトンプロジェクトと同じことをしている。だからこのウィザードを使用してカスタムウィジェットを作ってもいいのだが、最初からこのウィザードを使ってプロジェクトを作成すると、アプリケーション作成の場合と違って若干不便な点がある。それは

1. フォームが作成されないので、UIをGUIで作成できない。
2. デフォルトのアプリケーション(main.cpp)が作成されないので、開発中即座に実行してテストできない。

そこでとりあえず、まずカスタムウィジェット自体は、先に別途「Qt GUIアプリケーション」として作成しておき、ウィジェットが完成した時点で、別に「Qt カスタム デザイナ ウィジェット」としてスケルトンプロジェクトを作成する(名前は両者一致させておく。フォルダは別のところにまずは作成)。「Qt カスタム デザイナ ウィジェット」として作成されたプロジェクトは、フォルダ構成を見ると、ウィジェット本体のソースを格納するフォルダと、プラグインとしてのインターフェースを提供するためのフォルダに分かれている。ウィジェット本体の方のソースフォルダに、先に別途作成しておいた完成済みのウィジェットのソースをコピーしてくればとりえあずは良いわけである。なんかいまいちスマートでない気がするが、とりあえずよしとする。

コピーしてくるのは、該当ウィジェットのクラス名をMyWidgetとすると

MyWidgetフォルダの方に
mywidget.cpp
mywidget.h

MyWidget-build-desktopフォルダの方に
ui_mywidget.h

だけでよい。mywidget.uiファイルも要るかと思ったのだが、このファイルに含まれる内容はビルド時点でXMLからui_mywidget.hにすべて移されているので必要ないようだ。

これで後は問題なくプロジェクトをビルドできるはずである。ただこのカスタムウィジェットを実際にQtCreator/Desginerに認識させて既製ウィジェットと同じように使用するには、2点やっておかなければならないことがある。

1. ビルドディレクトリに作成されたlibmywidgetplugin.soをシステムのQt Desginer用プラグインフォルダ(Fedora 64bitなら /usr/lib64/qt4/plugins/desginer)にインストール。これはroot権限で、ビルドディレクトリ(Makefileとかが生成されているMyWidget-build-desktopフォルダ)でmake installを行えば良い。

2. 上記を行うということは、システムに新しいライブラリがインストールされるということだから…/etc/ld.so.conf.d/qt-x86.64.confを編集、/usr/lib64/qt4/plugins/desginerを追加した上で、

ldconfig

をroot権限で実行して変更を反映させておく。これをやっておかないとこのウィジェットを利用したアプリケーションが実行時にプラグインをロードできない。

本当は、何でもかんでも自作ウィジェットをシステムフォルダにインストールするのも気が進まないので、ホームディレクトリ以下に個人のプラグインフォルダを作成して、これをQt Creatorに認識させたいところなのだが、できるかどうかまだ不明。ツール→オプションの「デザイナー」の項にも追加でプラグインフォルダを指定する項目はなさそうだし、Qt Creator自体をソースからビルドしないとダメな気もしなくもない。
スポンサーサイト

VMWare上の仮想マシンとホストでファイル共有

プログラムのコーディングなどはLinux上で行っているのですが、その間だらだらとWindowsも立ち上げておきたい用事があり、Linux上にVMWare Playerをインストールして、ゲストOSとしてWindows XP SP3を入れて、そちらにホストの方でデュアルブートで使っていたWin XPから必要なフォルダをコピーすることにしました。

フォルダも合計4GB以上あるので、DVDに焼くのも面倒なためできればネットワークで、ということでホスト側にsambaを入れて、Windowsのパーティションをマウントしてから共有としてネットワーク上に公開し、ゲスト側からこれを読み取ることにしました。

ホスト側設定
samba関連のパッケージ
samba-common-3.5.6-71.fc14.x86_64
samba-client-3.5.6-71.fc14.x86_64
system-config-samba-1.2.90-1.fc14.noarch
samba-3.5.6-71.fc14.x86_64
samba-winbind-clients-3.5.6-71.fc14.x86_64

samba4というのがyum searchで引っかかったので、もうsambaもバージョン4が出たのかと思いきや、これはまだα版で、正式版は3.5.6のようなので、今回はバージョン4は見送り。

ファイアウォール設定
システム→管理→ファイアーウォールでGUIツール(system-config-firewall)を起動して、信頼したサービスの項で、SambaとSambaクライアントにチェックをつけておきます。また、信頼したインターフェースの方で、「追加」ボタンをクリックして、"vmnet+"を加えて、チェック状態にしておきます。

/etc/samba/smb.confの設定
system-config-sambaはGUI設定ツールながら、設定できる項目が半端なので、入れなくても良かったかも。結局/etc/samba/smb.confを手動編集。

変更点
workgroup を自宅内ネットワークで運用しているワークグループ名に。
interfacesに、VMWareがホストとゲスト間の通信で利用する仮想インターフェースを追加。そのネットワークアドレスもifconfigで見てhosts allowの方に追加。(172.16.128と172.16.97がそれ)

interfaces = lo eth0 vmnet1 vmnet8 192.168.10.0/24
hosts allow = 127. 192.168.10. 172.16.128. 172.16.97.

あと、平均的に一番長く起動しているのがこのホストマシンのLinuxなので、これにブラウズリストの統合やらWINSサーバやら、Windowsネットワークの親玉をやらせることにして、

domain master = yes
local master = yes
preferred master = yes
wins support = yes

ユーザ認証のために、
encrypt password = yes

そしてWindowsパーティションをLinuxホスト上で/media/windows/以下にマウントする想定で、Windows上のC:\Exportフォルダであれば、

[Export]
path = /media/windows/Export
guest ok = no

以上。

さて、WindowsパーティションをLinux上でマウントするところでも実はちょっとはまりそうになりました。Windowsの方はいつもハイバネーション状態で止めてあるのですが、この状態だとLinux側からは即座にはマウントできません。メッセージによると、

mount -t ntfs-3g -o ro /dev/sda1 /media/windows (リードオンリでマウント)

か、

mount -t ntfs-3g -o remove_hiberfile /dev/sda1 /media/windows (ハイバーネーション情報を破棄してマウント)

のようにする必要があります。。ここでは読み取りできればよいので、roの方で。

さらに、FedoraではデフォルトでSELinuxが動作しているので、これに引っかからないようにする必要があります。smb.confの冒頭にいくつかtipsが書いてある(GUIだけでやっていたらこれを見落としてえらい時間がかかったかもしれません)ので、これに従って

setsebool -P sambsa_domain_controller on (今はドメイン運用していないので必要ではない気がしますが、まあついでに)

Linux側のユーザのホームディレクトリにゲストのWindowsからアクセスできるように、
setsebool -P samba_enable_home_dirs on

で、あと、ホームディレクトリ以外のところで共有として公開したいところは、既存のシステムディレクトリであれば

setsebool -P samba_export_all_ro on もしくは
setsebool -P samba_export_all_rw on

自分で作成したディレクトリであれば、そのディレクトリに対して

chcon -t samba_share_t ディレクトリのパス名

としておけばいいのですが、さてここで困った。今共有したいフォルダはそもそもNTFSをLinuxからマウントしたものなので、当然ファイルシステムにSELinuxのラベルなどという属性は付与できません。つまりchconしようがありません。試しにこの時点で、

smbadd -a ユーザ名
として、/etc/samba/smbpasswdにユーザを登録した上で(ここでは簡単のために、このユーザは同じユーザ名、同一パスワードでLinux、samba、ゲストのWindowsにユーザとして登録するものとします。そしてゲストのindows側ではこのユーザでログオンして共有にアクセスするものとします。)、

サービスを起動します。

chkconfig --level 35 smb on
chkconfig --level 35 nmb on
service smb start
service nmb start

この状態で、Windowsの側で、「ワークグループのコンピュータを表示する」を選択すると、ホスト側でのホームディレクトリにあたる共有と、/media/windows/Exportにあたる共有がちゃんと見えます。つまりブラウズリストはきちんと動作しています。しかし、共有Exportの方を開こうとすると、リソースにアクセスする権限がないと言われて開けません。

ホスト側で、一旦NTFSのパーティションからLinuxのパーティションに必要なフォルダをコピーしてきてからこれを共有するようにすればいいわけですが、とりあえず一回ゲスト側にこのフォルダをコピーできればよかったので、

setenforce permissive

で一時的にSELinuxを止めると、Export共有フォルダにアクセスできるようになりました。この状態でコピーを行い、permissiveにしっ放しはセキュリティ的にまずいので、コピーが終わったら即座に

setenforce enforcing

でSELinuxを機能させます。とりあえずはこれで最低限の目的は達成。

Qt Creatorのプロジェクトに外部ライブラリを追加

手動でプロジェクトファイルやMakefileを編集しないで外部プロジェクトを追加します。

Qt Creatorの編集モードで、画面左側のプロジェクトペインを見ると、ツリーの一番上は、プロジェクトのフォルダのすぐ下に、プロジェクトファイル(*.pro)が表示されていると思います。それをダブルクリックして、編集画面で開きます。

そして、この編集画面で右クリックしてコンテキストメニューを出すと、「ライブラリを追加…」という項目があるので、これを使用します。

「ライブラリを追加」ダイアログ


たとえば私の場合、Fedora 14にNVIDIAのCUDA Toolkit 3.2をインストールして、OpenCLを使用しているのでヘッダの位置は/usr/local/cuda/include、ライブラリファイルは/usr/lib64/libOpenCL.soになります。ホームディレクトリ上のソースツリーとは別の場所にあるので、2番目の「外部ライブラリ」を選択します。

なお、スクリーンショットを見ると分かるように、一番目の「システムライブラリ」の説明がかなり意味不明になっていますが、これは誤訳で、「ライブラリのパスもインクルードパスも.proファイルには追加されません」の意です。

当然、ライブラリファイルとヘッダファイルの位置は把握している必要があります。findコマンドとかrpm -qlとかで確認しておいてください。

「ライブラリを追加」ダイアログその2


これで、.proファイルに対応するエントリが正しく追加されます。
今の例だと、このようになりました。

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../../../usr/lib64/release/ -lOpenCL
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../../../usr/lib64/debug/ -lOpenCL
else:symbian: LIBS += -lOpenCL
else:unix: LIBS += -L$$PWD/../../../../../usr/lib64/ -lOpenCL

INCLUDEPATH += $$PWD/../../../../../usr/local/cuda/include
DEPENDPATH += $$PWD/../../../../../usr/local/cuda/include

出典
Adding Libraries to qmake Projects

Qt Creatorでアクションとスロットを接続

Qt Creatorでなるべく自動生成を活用してプログラムを作成したいので、そのためのtips。
最初から画面上に見えているウィジェット間のシグナルとスロットの接続はDesigner画面で簡単にできますが、メニューの項目(QAction)の場合、メニューを開いたままDesignerモードに入れないので、マウスでドラッグして接続というわけにいきません。

手書き以外に、二つくらい方法があるようです。

1. Designer画面でシグナル/スロットエディタを使う。
画面下部のシグナル/スロットエディタエリアの左上隅に、緑色の「+」アイコンがあるので、これをクリックして新規の接続を追加します。一行に4つのカラムがありますが、基本的にconnectで与える引数と同等の情報になります。ただしこの方法では一つ問題があって、自分で追加したプライベートスロットが、スロットの欄に表示されてこないようです。この場合次の方法を用いることになります。

2. Designer画面でアクションエディタを使う。
同じくDesigner画面下部の、アクションエディタを使います。ここには、自分でアプリケーションのメインクラスの.hファイルで宣言したアクションがすべて表示されるので、接続を作成したいアクションを右クリックして、メニューから「スロットへ移動」を選択します。

「スロットへ移動」ポップアップ

そして、接続したいシグナル(メニュー項目の選択ならtriggered()か)を選んでOKすると、自動的に、"on_アクション名_triggered()という名前のスロットが生成され、メインウィジェットのcppファイルに移動してその中を記述することができます(.hファイルにも宣言が自動的に追加されている)。

出典
How to connect menu click with action in Qt Creator?


プロフィール

GM3D

Author:GM3D
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。