トップ 一覧 ソース 検索 ヘルプ RSS ログイン

▽こころキット

Qtのサイズポリシーメモ

便利だけどわかりにくいQtのサイズポリシーについてメモ。

まず、Qtがサイズを計算するときに使われる値は以下の3つ。

種類内容
最小サイズユーザーが指定。
最大サイズユーザーが指定。
サイズヒント最小〜最大の範囲内で、Qtが自動的に算出。

指定できるサイズポリシーはこんな感じ。

指定意味
Fixedサイズヒントの値で固定。
Minimumサイズヒントの値が下限。必要に応じて拡大される
Maximumサイズヒントの値が上限。必要に応じて縮小される。
Preferredサイズヒントの値が最適値。
Expandingサイズヒントの値が最適値。どちらかというと拡大優先。

おすすめの使い方はこんな感じ。

ボタン系
サイズポリシーはMaximum x Fixed。最小サイズを指定しておく。
あまり拡大されたくないウィジット
最大・最小ともにサイズを指定。サイズポリシーはPreferredかな。
拡大したいウィジット
サイズポリシーをExpandingに。

どんなときでも最小サイズを忘れずに指定。これで、いらいらするような動作はかなり減る。たぶん。

Qtのサイズヒントはあまり当てにしちゃだめw


(2009/11/12 メモ,Qt

Mac OS X v10.6にQtをインストールメモ

MacにQtをインストールしたときのメモ。

インストールした環境はこんな感じ。

種類内容
OSMac OS X v10.6.2
Qtのソースqt-mac-opensource-src-4.5.3.tar.gz

ソースのコンパイルから行うので、インストールの手順はUbuntuの時とほとんど同じだったり。

 Qtをインストール

アーカイブの展開先は『~/qt-mac-opensource-src-4.5.3』。深い意味はない。

project.proを修正

『QT_BUILD_PARTS = libs』を追加。いまさらだけど、この変更って意味がない予感。

configureを実行

> cd ~/qt-mac-opensource-src-4.5.3
> ./configure -release -static

ちょっと考えるところがあったのでstaticを指定。9分ほどで無事に終了。

makeを実行

> make sub-src

90分ちょっとかかった。

install

> sudo make install

1分ほどで完了。

clean

> make clean

ばっさり削除。

 pathを修正

/usr/local/Trolltech/Qt-4.5.3/bin』をパスに追加。

あとは適当なプロジェクトをコンパイルしてみて、無事にコンパイルできればOK。

ss001.png

漢字が化けてるのは・・・ 漢字コードの問題か、それとも、フォントの設定の問題か。


.dmg形式で配布されてる方も試したんだけど・・・ qmakeが無条件でXcodeのプロジェクトファイルを吐くようになってたり、いろんなところに勝手にファイルが分散してたり、アンインストールのスクリプトがまともに動かなかったりしたのでばっさり削除。

簡単な方が実は面倒だったというオチだな。


(2009/11/11 メモ,Qt

Qt Assistantでホイールの効きがおかしいメモ

Qtは標準でホイールイベントに対応している。Qt Assistantも、当たり前のようにホイールイベントに対応している。

helpviewer.cpp
343|void HelpViewer::wheelEvent(QWheelEvent *e)
344|{
345|    if (e->modifiers() & Qt::ControlModifier) {
346|        const int delta = e->delta();
347|        if (delta > 0)
348|            zoomIn(delta / 120);
349|        else if (delta < 0)
350|            zoomOut(-delta / 120);
351|        e->accept();
352|        return;
353|    }
354|    QWebView::wheelEvent(e);
355|}

それなのに、どうしてホイールの効きがおかしいのか? それはつまり、親クラスであるQWebViewでホイールの処理がおかしいから。

そこそこまじめにQWebView内部の処理を追いかけたんだけど・・・ これ、修正は面倒だなぁ。というわけで手っ取り早い修正方法は『QWebViewを使わないこと』。これだな。

assistant.proをこんな感じで修正

assistant.pro
10|contains(QT_CONFIG, webkit) {
11|    QT += webkit
12|}
13|
14|QT -= webkit                # 追加
15|DEFINES += QT_NO_WEBKIT     # 追加
16|
17|CONFIG += qt warn_on help

あとはassistantをコンパイルしなおすだけ。webkitが使えない場合、QTextBrowserが代わりに使われるのでassistantとしての動作は問題ない。たぶん。

(´-`).。о〇(アドイン経由でvs2008に組み込まれたヘルプを見てれば、全く関係のない話だな・・・)


(2009/11/11 メモ,Qt

Goの第一印象

Googleから、新しいプログラミング言語が発表になったらしい。

軽くサイトをチェックしてみた。

 気になったところ

“fmt”ってw
STL大好きな人間が作ったのかな。個人的には、こういう略し方はどうかと思うんだけど。
“Printf()”ってw
この中途半端な大文字化は何なんだろう? どうしても、関数の一文字目だけ大文字にしたかったの?
unicodeが基本ですよって、それって利点か?
いまさら・・・ ねぇ? できて当たり前では?
中途半端に“;”がついてる行とついてない行があるのはなぜ?
さっぱり謎。改行で式の終わりじゃないの?
コンパイラとリンカの名前が『6g』に『6l』って・・・
このネーミングセンスはどうなの?
『gccgo』ってこの名前もどうなの?
gccをリスペクトしてるのか喧嘩うってるのか、よくわからないな。
flag.NArg()ってのもかなり中途半端
flag.arg.count()じゃだめだったの?
無名関数が汚すぎないか?
go func(){〜〜}();って・・・ 最後の『();』はどうよ? 新言語なのにいきなり盲腸がついてる感じ。
複数の環境変数が必要?
それって、本当に必要なの? 1つにできなかったの?

 感想

ここのところRubyとかQtとか、名前の付け方にかなりこだわった開発環境をいじってたから・・・ ネーミングセンスの無さだけで使う気力が半減。

インタープリタとコンパイラの両方の利点って、単純に、言語がC++にコンバートできるってだけじゃないよね?

マルチスレッド対応とか、ガーベージコレクションとか、できて当たり前のことはそこそこできてるようだけど・・・ 全体的に、言語設計が古い感じ。ターゲットはRubyやPythonじゃなくて、C++の置き換えなのかな?

その、ターゲット設定自体が間違えてるような気もするけど。

(´-`).。о〇(こんな言語でも、Googleの力で流行したりするのかなぁ・・・)


(2009/11/11 雑談

Ubuntu 8.04にQtをインストールメモ

Ubuntu 8.04にQtをインストールしたときのメモ。Qtのインストールというより、開発環境を整えるまでがメイン?

インストールした環境はこんな感じ。

種類内容
OSUbuntu 8.04 LTS(ubuntu-ja-8.04.2-desktop-i386.iso)
Qtのソースqt-x11-opensource-src-4.5.3.tar.gz

 開発環境の構築

build-essentialをインストール

Synapticからbuild-essentialをインストール。

libxext-devをインストール

>sudo apt-get install libxext-dev

なぜか、こっちはコマンドラインから。

 Qtをインストール

アーカイブの展開先は、なぜか『~/qt-x11-opensource-src-4.5.3』。

project.proを修正

『QT_BUILD_PARTS = libs』を追加。デモもサンプルも必要なし。

configureを実行

> cd ~/qt-x11-opensource-src-4.5.3
> ./configure

3分ほど度で無事に終了。インストール先は変えておくべきだったか?

makeを実行

>make

90分近くかかった。

install

>sudo make install

そんなに時間かからず終了。

clean

>make clean

ばっさり削除。

 pathを修正

/usr/local/Trolltech/Qt-4.5.3/bin』をパスに追加。

あとは適当なプロジェクトをコンパイルしてみて、無事にコンパイルできればOK。

ss002a.png

漢字が化けてるのは・・・ 漢字コードの問題か、それとも、フォントの設定の問題か。


(2009/11/11 メモ,Qt

QtのGUIメモ(応用編)

QtでGUI関係の処理をするときのメモ。Qt Designerを使った場合のやり方。もしかして、こっちが基本編か?w

テストプログラムの外見はこんな感じに。

ss002.png

1.Qt Designerでウィンドウを作成

Qt Designerでは“Main Window”を選択する。

ss005.png

2.リソースを登録

リソースブラウザーでリソースを登録する。

  • 1.鉛筆アイコンを押してリソースの編集を開始

ss006.png

  • 2.白紙アイコンで新しいリソースファイルを作成

ss007.png

リソースファイルを置く位置に注意。

  • 3.『+』アイコンを押してPrefixを追加

ss008.png

“/”だけにしておくのがポイント?

  • 4.水没白紙アイコンを押してファイルを追加

ss009.png

複数選択できるのが便利。

ss010.png

リソースを登録したらOKを押して終了。

3.アクションを登録

アクションエディターでアクションを登録する。

  • 白紙アイコンを押してアクションを登録

ss012.png

  • 必要な項目を入力

ss014.png

ショートカットのところがわかりにくいけど、一度クリックしてから登録したいキーを押せばOK。

あとは、必要なだけ繰り返す。

4.メニューを作成

  • 『Type Here』をメニューの名前に変更

ダブルクリックで編集できるようになるので変更。

image6.png

  • アクションをドラッグ&ドロップで登録

image7.png

アクションをドラッグして・・・

image8.png

登録したい位置でドロップ。これを必要なだけ繰り返してメニュー完成。

5.ツールバーを作成

  • ツールバーを追加

image11.png

適当なところを右クリックして“Add Tool Bar”を選択。

  • アクションをドラッグ&ドロップで登録

image12.png

アクションをドラッグして・・・

image13.png

登録したい位置でドロップ。必要なだけ繰り返してツールバー完成。

6.ついでにウィジットも登録

  • 『Plain Text Edit』をメインウィンドウにドロップ

image14.png

どこでも同じこと。

  • 適当にレイアウトを変更

image16.png

どれでも同じこと・・・ かな?

  • マージンを調整して余白を消す

image17.png

どれも0に。あえて少し残すのも手?

7.シグナルとスロットを接続

シグナル/スロットエディターでそれぞれ接続。

  • 『+』ボタンを押して接続を追加

ss021.png

単純な処理ならこれだけで十分。


プログラム側の処理は.uiファイルからダイアログを作るときと大差ないので省略。

当たり前と言えば当たり前だけど、アクション作成〜メニュー・ツールバー作成あたりの処理はこっちの方が楽。かなり楽。

アクションの登録はこれでも少し面倒だったりするけど、何なら、.uiファイルを直接編集するっていう力業も。

参考になるサイトは前回と同じ。

ソースコードはこちら:test04.zip


(2009/11/10 メモ,Qt

QtのGUIメモ(基本編)

QtGUI関係の処理をするときのメモ。メニュー・ツールバー・ステータスバーなどなど。

テストプログラムはこんな感じ。

ss001.png

1.アクションを作成

こんな感じで。

52|void        AMainWindow::createActions( void )
53|{
54|    //      アクションを作成
55|
56|    m_exit_a    = new QAction( tr("E&xit"),this );
57|    m_exit_a->setShortcut( tr("Ctrl+Q") );
58|    m_exit_a->setStatusTip( tr("Exit the application") );
59|    m_exit_a->setIcon( QIcon(":/images/exit.png") );
60|    connect( m_exit_a,SIGNAL(triggered()),this,SLOT(close()) );
61|
62|    m_about_a   = new QAction( tr("&About"),this );
63|    m_about_a->setStatusTip( tr("Show the application's About box") );
64|    m_about_a->setIcon( QIcon(":/images/icon.png") );
65|    connect( m_about_a,SIGNAL(triggered()),this, SLOT(about()) );
66|}

QtでのGUI関係の処理は『アクション作成→必要なところに登録』これが基本。しかし、アクションの数が増えると大変なことに・・・

2.メニューを作成

68|void        AMainWindow::createMenus( void )
69|{
70|    //      メニューを追加してアクションを登録
71|
72|    QMenu*  me  = NULL;
73|
74|    me  = menuBar()->addMenu( tr("&File") );
75|    me->addAction( m_exit_a );
76|
77|    me  = menuBar()->addMenu( tr("&Help") );
78|    me->addAction( m_about_a );
79|}

アクションを登録してるだけ。

3.コンテキストメニューを作成

81|void        AMainWindow::createContextMenu( void )
82|{
83|    //      ウィジットにアクションを登録
84|
85|    addAction( m_exit_a );
86|
87|    //      コンテキストメニューを表示するように設定
88|
89|    setContextMenuPolicy( Qt::ActionsContextMenu );
90|}

ウィジットに直接アクションを登録。あとはsetContextMenuPolicy()で設定を変更。コンテキストメニューを表示する方法としては、イベントを受けて自分でメニューを表示する方法もあり。

4.ツールバーを作成

092|void        AMainWindow::createToolBars( void )
093|{
094|    //      ツールバーを追加してアクションを登録
095|
096|    QToolBar*   tb  = NULL;
097|
098|    tb  = addToolBar( tr("&All") );
099|    tb->addAction( m_exit_a );
100|    tb->addAction( m_about_a );
101|}

ツールバーを作ってアクションを登録してるだけ。

5.ステータスバーを作成

103|void        AMainWindow::createStatusBar( void )
104|{
105|    //      ステータスバーを作成
106|
107|    statusBar()->showMessage( tr("Ready") );
108|}

QMainWindow::statusBar()の呼び出しで、必要に応じてステータスバーを作ってくれる。

6.QSettingsでファイルに保存

ちょっと番外編。Windowsの場合、QSettingsは標準だとレジストリにデータを保存するけど、それをプログラムと同じフォルダに変更する方法。

amainwindow.cpp
112|void        AMainWindow::settings( bool read )
113|{
114|    //      保存先を変更
115|
116|    QString     fn  = qApp->applicationDirPath() +
117|                        QDir::separator() +
118|                        tr( "test03.ini" );
119|
120|    QSettings   set( fn,QSettings::IniFormat );
121|    set.beginGroup( skGetUserName() );
122|
123|    if( read == true ) {
124|
125|        //      セッティングを復元
126|
127|        QVariant    var;
128|
129|        var = set.value( "geometry",QRect(200,200,480,320) );
130|        setGeometry( var.toRect() );
131|
132|    } else {
133|
134|        //      セッティングを保存
135|
136|        set.setValue( "geometry",geometry() );
137|    }
138|
139|    set.endGroup();
140|}

QSettings::setPath()で無理矢理パスを変更する方法は失敗(´・ω・`)

仕方がないので、QSettingsのコンストラクタでフルパスを指定する方法に。この場合、QSettingsの保存内容がすべてのユーザーで共通になっているので、ユーザー名を無理矢理取得してグループ名に使用。

ユーザー名を取得する関数ぐらい、Qtに標準であっても良いのでは?(´・ω・`)

参考になるのはこのあたり。というか、そのまんま?

ソースコードはこちら:test03a.zip


(2009/11/09 メモ,Qt

Windows7のVirtual PCにUbuntu 8.04をインストールメモ

Virtual PCにUbuntu 8.04をインストールしたときの手順メモ?

インストールした環境はこんな感じ。

種類内容
ホストOSWindows 7 Professional (64bit)
ゲストOSUbuntu 8.04 LTS(ubuntu-ja-8.04.2-desktop-i386.iso)

Virtual PCのバージョンは・・・ どこで見られるんだ、これ?(´∀`;)

 Ubuntuをインストール

インストールの参考にさせてもらったのはこちら。

手順の通りに進めて、特に問題なく終了。

 ネットワークの設定を修正

仮想マシンの設定を確認

ネットワークの設定が『共有ネットワーク(NAT)』になっていることを確認。

ss005.png

Ubuntuの設定を変更

ネットワークの設定で“ローミングを有効にする”のチェックを外して、『設定の種類』を“自動設定(DHCP)”に。

ss020.png

これで、ネットワークが使えるようになるはず・・・ たぶん。

ネットワーク経由でアップデートを当てて最新の状態にしたところで、HDDの使用量は6GB程度。

 解像度を変更できるように修正

800x600は狭すぎるので、解像度を変更できるようにする。

xorg.confを修正

修正後のxorg.confはこんな感じ。

33|Section "Device"
34|    Identifier  "Configured Video Device"
35|    Driver      "s3"
36|    VendorName  "Microsoft Virtual PC 2007"
37|    BoardName   "S3 Trio 32/64 PCI 8MB"
38|    VideoRam    8192
39|EndSection
40|
41|Section "Monitor"
42|    Identifier  "Configured Monitor"
43|    VendorName   "Monitor Vendor"
44|    ModelName    "LCD Panel 1280x1024"
45|    HorizSync    31.5 - 96.0
46|    VertRefresh  50.0 - 80.0
47|    Option      "dpms"
48|EndSection
49|
50|Section "Screen"
51|    Identifier  "Default Screen"
52|    Monitor     "Configured Monitor"
53|    Device      "Configured Video Device"
54|    DefaultDepth    16
55|    SubSection  "Display"
56|        Viewport    0 0
57|        Depth       16
58|        Modes       "1280x1024" "1280x960" "1280x800" "1280x768" "1152x864" "1152x768" "1024x768" "800x600" "640x480"
59|    EndSubSection
60|EndSection

修正後のxorg.confはこちら:xorg.conf.zip

xorg.confを上書き

コマンドはこんな感じ?

sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf.backup
sudo cp ~/xorg.conf /etc/X11/xorg.conf

再起動して『画面の解像度』から解像度を変更できれば成功。・・・1152x768になってるのはなぜだ(´・ω・`)


(2009/11/09 メモ

Qtのインストールメモ2

Qtをインストールしたときのメモ、第2弾。応用編? DLLを一切使用しない形でコンパイルできるように、ライブラリを構築します。細かいところは前回の話を参照で。

前回の話はこちら>Qtのインストールメモ

 準備

アーカイブを展開して環境変数を設定するところまでは前回と同じ。debug版は使わないので、qmakeをいじる必要は無し。

qmake.confをいじる

ファイル:C:\devenv\qt\qt4.5.3\mkspecs\win32-msvc2008\qmake.conf
修正箇所:22-23行目
修正前:

QMAKE_CFLAGS_RELEASE    = -O2 -MD
QMAKE_CFLAGS_DEBUG      = -Zi -MDd

修正後:

QMAKE_CFLAGS_RELEASE    = -O2 -MT
QMAKE_CFLAGS_DEBUG      = -Zi -MTd

つまり、コンパイルフラグを修正してDLLを使わないように指定。

project.proをいじる

project.proを修正

ファイル:C:\devenv\qt\qt4.5.3\projects.pro
修正箇所:22-23行目
修正後:

CONFIG += ordered
TEMPLATE = subdirs

QT_BUILD_PARTS = libs

cross_compile: CONFIG += nostrip

libsのみを処理の対象に。これで、srcフォルダの中だけを処理してくれる。

 コンパイル

最低限必要な部分だけ作業。

configure

> cd C:\devenv\qt\qt4.5.3
> configure -release -static -D _CRT_SECURE_NO_WARNINGS

静的なライブラリでリリースのみ。

make

> nmake sub-src

必要なライブラリのみをコンパイル。

clean

> nmake clean

いらないファイルをばっさり削除。

この時点でコンパイルテスト。プログラムの方でも、リンクするライブラリの指定を修正する必要があることに注意。コンパイルしたプログラムをVisual Studio 2008もQtも無い環境に持って行って、無事に動作すれば成功。

 不要なファイルを削除

基本編と同じ。demos / doc / examples / toolsフォルダも削除可能。srcフォルダは削除不可。

この状態で511MB程度。

あとは、必要に応じてライブラリを入れ替えればOK。ライブラリの入れ替えは・・・ スマートにやろうと思ったらシンボリックリンク? 手っ取り早くやろうと思ったら、フォルダの名前を変更で。


(2009/11/08 メモ,Qt

Qtの多言語対応メモ

Qtでプログラムをするときの多言語対応メモ。基本編。

1.画面に表示する文字列をtr()形式にする

こんな感じで。

aselectdialog.cpp

15|void            ASelectDialog::listChanged( int no )
16|{
17|    static pcchar const code[] = {
18|        QT_TR_NOOP( "R:254 G:244 B:244" ),
19|        QT_TR_NOOP( "R:253 G:239 B:242" ),
20|        QT_TR_NOOP( "R:233 G:223 B:229" ),
21|        QT_TR_NOOP( "R:228 G:210 B:216" ),
22|        QT_TR_NOOP( "R:246 G:191 B:188" ),
23|        QT_TR_NOOP( "R:245 G:177 B:170" ),
24|        NULL
25|    };
26|
27|    m_code_ed->setText( tr( "no %1: %2" ).arg( no+1 ).arg( tr(code[no]) ) );
28|}

Qtでプログラムを組む場合、ユーザーが目にする文字列は、すべてtr()で挟んでおくのが基本。深く考えずに当たり前のようにやっておく。

2.lupdateで文字列を抜き出す

> lupdate project-file -ts ts-file

プロジェクトファイルに加えて、出力先のts-fileも指定する必要あり。ちょっと面倒。

3.Qt Linguistで翻訳

> linguist

画面を見ながら翻訳。

4.文字列をメッセージファイルに変換

> lrelease ts-file

これで.qm形式のファイルができる。プログラムからはこのファイルを使用。

5.プログラム側をメッセージファイルを読み込むように修正

こんな感じで。

test02.cpp

1|    //      翻訳に備える
2|
3|    QTranslator     tra;
4|    tra.load( "test02.qm",qApp->applicationDirPath() );
5|
6|    app.installTranslator( &tra );

本当なら、読み込むロケールに応じて.qmを切り替えるべきだけど・・・ そこは省略。

翻訳前の画面がこんな感じ。

ss001.png

翻訳後はこう。

ss002.png

起動中の切り替え対応は・・・ 必要に応じて調べましょう(´∀`;)

参考になるのはこのあたり。

ソースコードはこちら:test02.zip


(2009/11/07 メモ,Qt

[ 1 2 3 4 5 6 ]