【GUIツールキット】Qt 総合スレ 4【Win/Mac/Linux】 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
09/04/18 04:29:47
Qt(キュート)は C++ ベースの GUI ライブラリです。
フォーム、ボタンなどの各種ウィジェットからネットワーク、マルチスレッド、グラフィックス(OpenGL)や
各種コンテナ、XMLパーサー、組み込み JavaScript など、ライブラリの機能は多岐に渡ります。
また、「Qt Creator」という GUI ビルダ付きの専用 IDE が用意されています。

■対応プラットフォーム(デスクトップ用途の場合)

Windows 98, Me, NT4, XP, Server2003, Vista
Mac OS X 10.3, 10.4, 10.5
Linux

■ライセンス

・オープンソース版(Open-source version)
 LGPL 2.1 または GPL 3.0 のうちどちらかを利用者が選べます。
 LGPL を選んだ場合は商用利用が可能です(いくつか制限あり)。

・商用版(Commercial version)
 こっちはQt Softwareか日本の代理店(SRA社)とライセンス契約(年間30万くらい?)を結んで使います

■Qt を使って作られたソフト例

KDE、Adobe Photoshop Elements、Google Earth、Skype、DAZ Studio など

■前スレ

[KDE/Qt]Qtについての疑問を教えあうスレ 3
スレリンク(tech板)


2:デフォルトの名無しさん
09/04/18 04:30:12
■リンク

・Qt Software (旧Trolltech社/現在はNokia社の一部門)
URLリンク(www.qtsoftware.com)

・Qt のダウンロードページ(オープンソース版は、LGPL/Free Downloads タブから)
URLリンク(www.qtsoftware.com)

・Qt のダウンロード(FTP)
fURLリンク(ftp.qtsoftware.com)

・SRA社(日本の代理店)の日本語で読める Qt 関連ドキュメント
URLリンク(www.sra.co.jp)


■ライセンス関連まとめ

各ライセンスでの自作アプリのソース公開/頒布

Qtのライセンス   アプリのライセンス     Qtの頒布/(変更部分のソース公開)
GPL           GPL(ソース公開必須)      必須
LGPL         任意(ソース公開不要)      必須
商用          任意(ソース公開不要)      不要

*: LGPLは動的リンク時

実際には他にも条件(リバースエンジニアリング関係とか)あるので、
きちんとライセンスの条文を読むこと。


3:デフォルトの名無しさん
09/04/18 04:30:29
Windows ユーザー向け Tips

■どれをダウンロードするの?

・Download Qt SDK for Windows* (194 Mb)
  IDE&コンパイラ付きインストーラー(Qt Creator&MinGW)
  すぐに使える。オススメ

・Download Qt libraries 4.5 for Windows (136 Mb)
  MinGW(gcc)版インストーラーや、その他のコンパイラ(VisualC++など)用のソースコード
  VisualC++等でQtを使うには、これを落として Qt 自体をビルドする必要がある(2〜3時間かかる)

■Qt Creator&MinGW Windows版について

・プロジェクトのパスに半角スペース、日本語を入れちゃダメ
・日本語のソースコードは UTF-8 にする
 「Projects」タブの「Editor Setting」設定でエディタの Encoding を「UTF-8」にする
 デフォルトの System(ShiftJIS)は gcc と相性が悪い
・デバッグ出力はとりあえず英語にする
 qDebug() に日本語を出力するとデバッガコンソールが文字化けする(UTF-8、ShiftJISどっちもムリ)
・配布時は mingwm10.dll も忘れずに一緒に入れておく
 MinGW 環境でコンパイルするとこのDLLが必要になる。このファイルは public domain で配布上の制限はない

4:デフォルトの名無しさん
09/04/18 09:19:30
>>1

5:デフォルトの名無しさん
09/04/18 23:15:22
ねーねー、Qtアプリの多重起動禁止ってQtのAPI使ってできる??
QMutexじゃ無理なんだよね?

6:デフォルトの名無しさん
09/04/18 23:37:26
>>1
うは、LGPLで使える様になったのか。NOKIAグッジョブb
今までGPL汚染が嫌で遠ざけていたけど、素晴らしいね。
そもそもGPLはライブラリのライセンスには不適格だから、
LGPL化は正常な方向への舵取りですね。
これでwxやGtk+に奪われた領土を少しは回復出来るかな?

7:デフォルトの名無しさん
09/04/19 11:47:16
QSettingsで、キー内容にカンマ(,)をつけると値が取れなく
なるんですが、どうしてでしょう?マニュアルにもWebでもカンマに
ついて一言も書いてないです。


8:デフォルトの名無しさん
09/04/19 18:35:40
>>7
カンマがセパレータとして認識されてるんじゃない?

9:デフォルトの名無しさん
09/04/20 00:49:52
ははは

10:デフォルトの名無しさん
09/04/20 03:18:49
>>8
うーん。セパレータと解釈されてそうですが、そういう設定ないんですよね。
QSize型を書き出すと@Size(100 100)とか出力される例がマニュアルにあって、それもカンマ
使わずにスペースで区切ってあるんですよね。どうもカンマを使えないのはNokiaも知ってるっぽい?です。
なんかこういう重要な事がマニュアルに書いてないのが
オープンソースあがりっぽい感じがして少しがっかりです。

11:デフォルトの名無しさん
09/04/20 08:23:50

>>10
環境は何ですか。
私の環境LinuxのQt4.5では、キーにカンマ(,)をつけても、
書き込み読み込みともにうまくいきました。
ただし、ファイルの中を見ると、カンマ(,)の部分は%2Cとなっています。
ASCIIの16進コードに置き換えられているようです。

12:デフォルトの名無しさん
09/04/20 11:15:20
>>11
おお。WIndowsXPのQt4.5です。
すみません、読み込みは散々調べましたが、書き込みをやってませんでした。
いまやってみたら、
settings.setValue("TEST/KEY","0,1"); // KEY="0,1"
とダブルクォーテーションに包まれて出力されました。
この場合読み込みもうまくいきました。
Linuxと挙動がちがいますね。そちらではダブルクォーテーションになってませんか?

13:デフォルトの名無しさん
09/04/20 11:25:17
>>11
ああ、なるほど、キーにカンマをつけた場合の話しですね。
私はキーの値にカンマをつけた場合の話しです。
キーにカンマをつけてみたら、同じく
settings.setValue("TEST/KE,Y","0,1");//KE%2CY="0,1"
%2Cとなりました。挙動は一緒みたいですね。

14:デフォルトの名無しさん
09/04/20 11:32:35
>>11
誤るの遅くなりましたが、キー内容という表現が悪かったです。すみませんでした。

15:デフォルトの名無しさん
09/04/20 17:36:26
>>12
こちら(Linux)でも同じです。
settings.setValue("TEST/KE,Y","0,1");
とすると、ファイル内では、KE%2CY="0,1"となっています。

>>14
こちらこそ、勘違いしたみたいですね。やりたいことは、値として整数値の組をカンマで区切ったものを読み込ませたいということですね。
もしそうならば、下記のようにすればどうでしょう。

(ファイルの中)
TESTKEY=100,20,50

(サンプルコード)
#include <QDebug>
#include <QVariant>
#include <QList>

QVariant values = settings.value("TESTKEY", QVariant(QList<QVariant>()));
QList<QVariant> valueList = values.toList();
const int cSize = valueList.size();
int value;
for(int i = 0; i < cSize; ++i) {
value = valueList.at(i).toInt();
qDebug() << value;
}

(出力結果)
100
20
50



16:デフォルトの名無しさん
09/04/20 19:15:02
>>5

商用ライセンスならこれでできます。

Single Application ― Qt – A cross-platform application and UI framework
URLリンク(www.qtsoftware.com)

17:デフォルトの名無しさん
09/04/20 19:19:28
>>15
おお、すばらしいです。
やりたいことが出来ました。
ですがちょっと納得いかないので調べてみます。
大変ありがとうございました。

18:デフォルトの名無しさん
09/04/20 21:15:53
>>15
やっぱりちょっと問題があるようです。
QVariantのtoList()は、"0,1"の場合、要素数2のリストを作ってくれますが、
"0"のようにカンマが無い場合、要素数が0になってしまうようです。
要素の数でなく、カンマの数で要素数が決まる?ようです。
少々がっかりです。

↓もがっかりな点です。
QStringのtoInt()関数 int toInt ( bool * ok = 0, int base = 10 ) const
QVariantのtoInt関数 int toInt ( bool * ok = 0 ) const
同じ関数名なのに機能が統一されてない(´・ω・`)

たぶん、ほかにもいろいろとこういったものがあるのでしょうね(´・ω・`)。


19:デフォルトの名無しさん
09/04/20 21:42:39
遅れたけど>>1モツ
随分様変わりしたな




それはそうと、Qtを引っさげてIT業界へ転職しようと考えてる
応用情報午後で不合格ほぼ確定なオレにゃ甘い考えだろうか

20:デフォルトの名無しさん
09/04/20 21:57:33
>>19
いいやそんなことないぞ。がんばれ

21:デフォルトの名無しさん
09/04/21 00:17:00
Visual Studio2008でコンパイルしたQT4.5使ってます。
qt-vs-addin-1.0.0-rc1.exeもインストールし、
ほぼ問題なく使えているのですが、
ウォッチウィンドウなどの表示で、
QMapのデータがerrorと表示され、内容が見れず困っています。
autoexp.datの設定には、QMapの内容が書かれているらしいのですが、
どうもよく分かりません。一部は括弧が対応していないところも見つけたので
ひょっとするとこのファイルがおかしいのではないかと思っています。
どなたか解決できてる方いらっしゃいますか?

22:デフォルトの名無しさん
09/04/21 01:09:36
>> 18

>QVariantのtoList()は、"0,1"の場合、要素数2のリストを作ってくれますが、
>"0"のようにカンマが無い場合、要素数が0になってしまうようです。
>要素の数でなく、カンマの数で要素数が決まる?ようです。

QVariant values = settings.value("TESTKEY", QVariant(QList<QVariant>()));
として、読み込んだ場合、値によって返ってくるvaluesの型が違ってくるように実装されているようです。

ファイルの値が
TESTKEY=10,20
のとき、valuesは、QVariant(QList<QString>())になっています。
このとき、リスとの各要素(QStringの中身)は、"10"と"20"になっています。

ファイルの値が
TESTKEY=10
のとき、valuesは、QVariant(QString())になっています。
このとき、QStringの中身は、"10"です。

ファイルの値が
TESTKEY=
となって値が設定されていない時、上と同じくvaluesは、QVariant(QString())になっています。
このとき、QStringの中身は、""です。

以上を踏まえて値をとるようにすればよいのではないでしょうか。

23:デフォルトの名無しさん
09/04/21 01:10:51
22の続き

(サンプルコード)
#include <QDebug>
#include <QVariant>
#include <QList>

QVariant values = settings.value("TESTKEY", QVariant(QList<QVariant>()));

if(values.type() == QVariant::StringList) {
QList<QVariant> valueList= values.toList();
const int cSize = valueList.size();
for(int i = 0; i < cSize; ++i) {
qDebug() << valueList.at(i).toInt();
}

} else if(values.type() == QVariant::String) {
QString string = values.toString();
if(!string.isEmpty()) {
qDebug() << string.toInt();
}
} else {
qDebug() << "here is else block"; // ここにはこないはず。
}



24:デフォルトの名無しさん
09/04/21 07:52:19
>>21
RC1 だから開発元に報告した方がよいのでは?



25:デフォルトの名無しさん
09/04/21 15:36:06
>>22
丁寧に教えてくださって恐縮です。ありがとうございます。
QVariantは中に何が入っているか調べないと使えないのですね。
本当の意味のVariantじゃない気がする。。
TrollTeckはこの実装が完璧だという認識なのでしょうか。。




26:デフォルトの名無しさん
09/04/21 15:50:23
>>24
へんてこ英語で一応報告してきました。

27:デフォルトの名無しさん
09/04/21 16:31:19
>>25
>QVariantは中に何が入っているか調べないと使えないのですね。
通常は、受取側がQVariantの中に何が入っているか分かっていることがほとんどでしょうからこれでも結構使えると思います。
ただ、今回の例では、settings.value()は常にQVariant::StringListを返すように実装してあるのがいいような気がします。

>本当の意味のVariantじゃない気がする。
>TrollTeckはこの実装が完璧だという認識なのでしょうか
確かに、もっと便利にできるでしょう。
将来に期待しましょう。


28:デフォルトの名無しさん
09/04/21 17:58:12
QVariantにはtoBool()があるのに
QStringにはない(;´д⊂)

29:デフォルトの名無しさん
09/04/21 18:51:20
要素が一つだけの QVariantList を作って QSettings でセーブした後で
読み出すと QVariant::toList() でちゃんと取り出せる。
その場合は "LIST=1" みたいな形ではファイルに残っていないけど。
元と違う形式で読み出そうとしてるからうまくいかないって感じだな。
なんでこんな仕様なのかはよくわからないけど。

ex.
QVariantList list;
list << 1;
settings.setValue( "LIST", list );

iniファイル
LIST=@Variant(\0\0\0\t\0\0\0\x1\0\0\0\x2\0\0\0\x1)

30:デフォルトの名無しさん
09/04/21 19:17:32
QTを使ったプログラムで、ユーザ定義のクラスを作る場合、
クラスは基本QObjectを継承するのがいいのでしょうか?

QObjectを継承して、Q_OBJECTマクロを使っとけば、
connectとかtr()とかでC++の機能を拡張できる事と同等なので、
やっぱり全てのユーザクラスをそう作るのが基本になるのですよね?

31:デフォルトの名無しさん
09/04/22 13:11:03
C#なら

labelTitle.ForeColor = Color.Black;

で終わるところが、C++ + QTだと

QPalette pal = ui.labelTitle->palette();
pal.setColor(QPalette::Normal, QPalette::WindowText, QColor(Qt::black);
ui.labelTitle->setPalette(pal);

と書かないといけない(;´д⊂)
これって、QTの改良でなんとかならないのかな。

32:デフォルトの名無しさん
09/04/22 15:19:34
int i のiを文字列にする場合、
C#では、
string str = i.ToString();
で出来るけど、QTだと
QString str = QString::number(i); //static関数
もしくは、
QString str; str.setNum(i);
になる。
これをみて、最初、QTにはどうして同じ機能が二つ用意されてるのだろうと思ったが、
前者はstatic関数で、後者はメンバ関数だった。
ああ、なるほど、たしかにどちらも必要だな、と思った。
が、しかし。
どうしてこういうことがおきるか。
C++がオブジェクト指向言語であるにもかかわらず、
その基本になってるintなどの変数がオブジェクトになってないせいではないか。
それを徹底したのがC#。
でも、intなんか4バイト程度で済むのにオブジェクトなんかにしたら容量食うし、遅くてしょうがない。
やはり、C++QTがベストなのだろうか。
なんだろうこのジレンマ。(´・ω・`)

33:デフォルトの名無しさん
09/04/22 16:32:15
QSplitterの棒の位置ってデザイナで指定できる?

34:デフォルトの名無しさん
09/04/22 17:39:27
QTableWidgetItemには、
setBackgroundColor()
はあるのに
setForegroundColor()
がない(´・ω・`)
QTは抜けがいっぱい。

35:デフォルトの名無しさん
09/04/22 19:00:35
>>34
QTableWidgetItem には、setForeground() と setBackground() がある。

36:デフォルトの名無しさん
09/04/22 19:03:13
>>28
QVariant には bool を入れられるから toBool() がある。
QString には toBool() 値に対応すべき文字列がきっちりと決められないから toBool() がない。



37:デフォルトの名無しさん
09/04/22 22:21:16
>>26
autoexp.datのバグが登録されました。
URLリンク(www.qtsoftware.com)
なんだかうれしい。

38:デフォルトの名無しさん
09/04/22 22:29:13
>>35
QTableWidgetItemのsetBackgroundColor()はObsoleteとなってました。
代わりがsetForeground() と setBackground() ですね。

39:デフォルトの名無しさん
09/04/22 22:29:38
>>32
> intなんか4バイト程度で済むのにオブジェクトなんかにしたら容量食うし、遅くてしょうがない。
COOLを勉強して、ソープで童貞卒業してから出直せや
URLリンク(www.sage-p.com)

40:デフォルトの名無しさん
09/04/22 23:46:30
QTでは、関数の引数でQTのオブジェクトを渡す時は
constの参照渡し、で int とかboolの時は値渡ししてるんだね。
それが速いんだろうな

41:デフォルトの名無しさん
09/04/23 00:30:59
至極当たり前のことじゃ…(´・ω・`)

42:デフォルトの名無しさん
09/04/23 01:47:22
そっか(´・ω・`)
関数の戻り値で参照返しの時と、値返しの時があったんだけど、

QStringクラスの例
 QString & setNum ( int n, int base = 10 )
 QString toLower () const

これってどういう場合にどっちを使うのかな?(´・ω・`)

43:デフォルトの名無しさん
09/04/23 10:24:35
QString::setNum() は自分自身を書き換える。
すでに存在しているインスタンスを書き換えて返すので参照で返せる。

QString::toLower() は新たに文字列を作成して返す。
すでに存在しているインスタンスは変更せずに、新たにインスタンスを作成するので
参照ではなく値で返す。

44:デフォルトの名無しさん
09/04/23 11:30:35
自分自身の参照を返すのって、いわゆるメソッドチェーンか
Named Parameter Idiomを意識してるのかな

新しく作って返すのは依存性を考えなくて楽だけど、C++ではコピーのコストがかかるので(ry

ポインタを返すのはcreate○○みたいないかにもファクトリメソッドにして、後で解放処理をすることを使い手に強いるか
shared_ptrみたいなスマートポインタをつかって(ry

45:デフォルトの名無しさん
09/04/23 11:39:02
QWidgetの色ってpallete変えれなかったんだけど、
どうやって変えるのかな(´・ω・`)

46:デフォルトの名無しさん
09/04/23 11:55:37
>>45
環境と使用した ColorRole は?

palette.setColor( QPalette::Window, Qt::red );
w.setPalette( palette );
で変えられるけど。

47:デフォルトの名無しさん
09/04/23 12:18:11
>>43

QString & remove ( int position, int n )

の場合、

QString str = "ABC";
str.remove(0,1); //"BC"

と代入する必要はないけど、

QString toLower () const

の場合、

QString str = "ABC";
str = str.toLower();

と代入しないといけない。

これってちょっと覚えるのが難しいね。
代入しないといけないメンバ関数って何か共通点があるのかな(´・ω・`)


48:デフォルトの名無しさん
09/04/23 12:32:21
>>46
WindowsXP SP3 + VisualStudio2008 + QT4.5(open source)
です

新規作成プロジェクトで
test::test(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);

QPalette palette = ui.centralWidget->palette();
palette.setColor(QPalette::Window, Qt::red);
ui.centralWidget->setPalette(palette);

}

とやっても赤くならない(;´д⊂)

49:デフォルトの名無しさん
09/04/23 12:47:09
>>47
自分自身をインプレースで変えるメソッドと(QString::setNum: 戻り値の型はどうでもいい)
新しくインスタンスを作るメソッドの違いくらいわかろうぜ。(QString::toLower 戻り値の型がQString)
Qtじゃなくてもよく出てくるから。

戻り値の型がどうでもいいのにQString::setNumがQString &を返しているのは
自分自身の参照を返すといろいろ便利だから。
中ではreturn (*this)ってやってる。

インプレースのほうが効率がいいが、参照渡しとかで他のオブジェクトに渡すと中身を勝手に変えられる心配もある
新しくインスタンスを作ればその心配はなくなるが、ちと効率が悪い。

あと、C++は関数の評価順が未定義なので
関数の引数にインプレースで変更する処理を書くと変になる。
インスタンスを作ればそこら辺はもんだいない(たぶん)

たとえば
foo(str.remove(0,1), str) // NG
foo(str.toLower(), str) // たぶんOK

50:デフォルトの名無しさん
09/04/23 12:58:46
>>48

ui.centralWidget->setAutoFillBackground( true );

51:デフォルトの名無しさん
09/04/23 13:34:54
>>50
赤くなった(`・ω・´)
ありがとう。さすがだねぃ

52:デフォルトの名無しさん
09/04/23 18:57:42
コンボボックスが複数あって、それぞれの変更シグナルを
一つのスロット関数で受ける場合、どのコンボボックスからのシグナルなのか
判断するには、connect以外の経由で情報を渡すか、QComboBoxの継承自作クラス
で新規にシグナルを定義するしかないよね?


53:デフォルトの名無しさん
09/04/23 19:19:20
>>52
QObject::sender()が使える?


54:デフォルトの名無しさん
09/04/23 20:09:56
方法によっては QSignalMapper も使えるかも。

55:デフォルトの名無しさん
09/04/23 20:38:46
>>18

> QVariantのtoList()は、"0,1"の場合、要素数2のリストを作ってくれますが、

リストを作りませんよ。

> "0"のようにカンマが無い場合、要素数が0になってしまうようです。
> 要素の数でなく、カンマの数で要素数が決まる?ようです。

toList() は、List と StringList が対象で、"0, 1" という文字列は対象ではないです。

> ↓もがっかりな点です。
> QStringのtoInt()関数 int toInt ( bool * ok = 0, int base = 10 ) const
> QVariantのtoInt関数 int toInt ( bool * ok = 0 ) const
> 同じ関数名なのに機能が統一されてない(´・ω・`)

QSring は文字列が入っているから base を指定する意味があります。
QVariant には文字列が入っているとは限りません、int や bool もあるので
base を指定する意味がないからです。

> たぶん、ほかにもいろいろとこういったものがあるのでしょうね(´・ω・`)。

もう少しプログラミングの基本と C++ の知識をしっかり身につけてから批判するように。

56:デフォルトの名無しさん
09/04/23 20:40:25
>>31

> QPalette pal = ui.labelTitle->palette();
> pal.setColor(QPalette::Normal, QPalette::WindowText, QColor(Qt::black);
> ui.labelTitle->setPalette(pal);
>
> と書かないといけない(;´д⊂)
> これって、QTの改良でなんとかならないのかな。

palette でひとまとめにできるから統一的に色を扱えます。C# の方が古過ぎるのですよ。

57:デフォルトの名無しさん
09/04/23 20:56:33
>>53
おお、QObject::sender()で出来たよ。すごい。
超シンプルな解法!さすがだねぃ

58:デフォルトの名無しさん
09/04/23 21:37:51
QSettingsでiniファイルを読む場合、
childGroups()で得られるリストがファイル記述順になっててほしいんだけど、
やっぱり出来ないよね?やっぱり自作するしかないかな(´・ω・`)

59:デフォルトの名無しさん
09/04/24 00:05:56
Qt 4.5.1 と Qt Creator 1.1 がリリースされてますね

60:デフォルトの名無しさん
09/04/24 01:32:42
VS addin もbetaが消えたね

61:デフォルトの名無しさん
09/04/25 00:44:37
4.5.1コンパイル中だが、北森2.5GHzで150分かかって、やっとwebkitだぜ。
いい加減i7 920辺りに買い替えるべき?C2Qなら30分くらいで終わるの?

62:デフォルトの名無しさん
09/04/25 01:21:23
>>61
Q9450使っているけど、かなり時間食う。

63:デフォルトの名無しさん
09/04/25 05:51:17
どっちかって言うとSSD買った方が速くなる

64:デフォルトの名無しさん
09/04/27 10:08:28
Qtインストールしようとしてるんだけど
これインストールフォルダに日付が入ってて気持ち悪い
みんなそのままインストールしてるの?

65:デフォルトの名無しさん
09/04/27 12:56:27
SDKじゃなければ、バージョンごとのディレクトリがデフォルト

66:デフォルトの名無しさん
09/04/27 13:15:12
Windowsでmingwとqt libraryをインストールしたんだけど、win32api.hか何かが無いって
警告された。でもmingwのwin32apiパッケージ自体はインストールしてるし、問題ないよな。

67:デフォルトの名無しさん
09/04/27 16:29:42
>>64
今ダウンロードできる最新のパッケージの場合、今月(4月)リリースされてファイル名が
qt-sdk-linux-x86-opensource-2009.02.bin(Linux版の場合)。
2009は年を表していると思うけど、最後の02は2番目のリリースと言う意味だと思う。

68:デフォルトの名無しさん
09/04/27 17:37:23
>>64
気持ち悪いんだったら、自分でrenameすればokじゃない?

69:デフォルトの名無しさん
09/04/27 21:48:00
>>66
随分前(といってもVer4以降だが)、MinGWすでに入れてる環境に、
MinGWのPath指定してQtインストールしたら怒られたな

いくつかファイルが足りないとかで


気持ち悪いから、MinGWのPath指定せずQtインストーラ経由でダウンロードしたら解決した
それ以来、MinGWフォルダ圧縮して保管してあるお

70:デフォルトの名無しさん
09/04/28 09:27:21
>>61
とりあえず、メモリ余ってるならTEMPをRAMDISKにしてみるとか、
っていってもビルドしてみた感じボトルネックはCPUっぽいから効果薄いかな。

71:デフォルトの名無しさん
09/04/28 09:49:59
>>66
CPLUS_INCLUDE_PATHとか指定すると、specsのpathを見なかった事があった。
バージョンやbuild時の設定で違うのかもしれん。

72:デフォルトの名無しさん
09/04/30 17:20:50
VS2005にVisualStudioアドインを入れたんですが、
QtオプションでQtVresionsタブからAddを選んで、パスを指定しても
OKボタンがアクティブにならないので押せません。
このためか、Qtのバージョンを指定しろといわれて怒られます。
どうしたら良いんでしょうか?


73:デフォルトの名無しさん
09/04/30 18:10:44
>>72
パスに日本語が含まれているとか?

74:デフォルトの名無しさん
09/04/30 18:19:27
C:\Qt\2009.02\qt
を指定しているので日本語は入っていないです。
RC1で試すと押せるのですが、パスに追加されないでいます。


75:デフォルトの名無しさん
09/04/30 20:51:19
ExpressEdition版というオチ

76:デフォルトの名無しさん
09/04/30 22:26:59
ソースからビルドして、
C:\Qt\qt-win-opensource-src-4.5.1
を指定したら出来ました。
お騒がせしました。


77:デフォルトの名無しさん
09/05/01 14:11:48
msvc2008で-staticなビルドをしようとしたんだけどなんかエラーでる・・・

みんなどんなふうにやってますか?

78:デフォルトの名無しさん
09/05/01 16:50:26
基礎的なことですが教えてください_(._.)_
↓はQMapのkeys()関数です。(qmap.h)

template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QList<Key> QMap<Key, T>::keys(const T &avalue) const
{
QList<Key> res;
const_iterator i = begin();
while (i != end()) {
if (i.value() == avalue)
res.append(i.key());
++i;
}
return res;
}

resをreturnで返していますが、resはこの関数内で宣言されているので、
この関数ないだけでしか存在できないのではないのでしょうか?
resって自動変数ですよね?


79:デフォルトの名無しさん
09/05/01 16:57:10
78>>
自己解決しました。Orz
呼び出し元側で同じ変数が作られ、それにコピーされるわけですね

80:デフォルトの名無しさん
09/05/01 20:39:37
メインウィンドウを持つアプリケーションの多重起動をしようとしたときに
既に開いているメインウィンドウがあれば、それをアクティブにするには
どうすればよいでしょう?
多重起動防止のみならQSystemSemaphoreで可能ですが。
プラットフォーム固有の処理になってしまうでしょうか?


81:デフォルトの名無しさん
09/05/01 21:31:24
>>80
URLリンク(www.qtsoftware.com)


82:デフォルトの名無しさん
09/05/01 21:53:52
>>72
商用版のVisual Studio Integrationを使って欲しいということでは。

83:デフォルトの名無しさん
09/05/01 21:55:28
>>81
ありがとうございます。
こんなのがあったのですね。
SDKと分ける理由はなんでしょうね。
同梱で良い気がしますが。


84:デフォルトの名無しさん
09/05/02 01:00:29
QMap、QHashのkeys(), values()で取り出せるリストを
追加順にしたいのですが、出来ないものでしょうか?

85:デフォルトの名無しさん
09/05/02 11:43:32
>>84
入れるものに追加順が分かる識別子を付けて、取出したリストをソートしては?
mapやhashは、その機能からして追加順を覚えるように実装するものじゃないです。

86:デフォルトの名無しさん
09/05/02 16:57:22
>>85
ちなみに.NETのコレクションクラスは追加順を覚えています。

87:デフォルトの名無しさん
09/05/02 19:11:32
>>86
それが仕様だったとしても何も自慢にならない希ガス

88:デフォルトの名無しさん
09/05/02 20:25:30
>86
本当だったら出鱈目な実装だね。それかたまたま何かの加減でそうなっているだけでしょう。
プログラミングの心得が少しでもあるならそんなことはおかしいと思わなくてはならない。

89:デフォルトの名無しさん
09/05/02 23:16:26
>>88
心得があればMDBでKey-Value DBを作っているのと同じだと気付くと思うが。

90:デフォルトの名無しさん
09/05/03 00:48:12
>>89
酷い実装だね。

91:デフォルトの名無しさん
09/05/03 01:11:15
プログラマはバカだという前提の元に
プログラマに余計なことをさせないように
言語側で余計なことをするってのが
今の流行だろ

92:デフォルトの名無しさん
09/05/03 01:37:35
>>90
elegantではないがintelligentな実装だよ。

93:デフォルトの名無しさん
09/05/03 02:27:24
winXP+Qt4.5.1(mingw)でQtSingleApplicationを試してみました。
そのまま使うと問題ないですが、継承して使用すると
「アプリケーションを正しく初期化できませんでした(0xc0000005)。」
のメッセージボックスが出力されて落ちてしまいますが原因をご存知の方はい
らっしゃいませんか。

// MyApplication.hpp
#include <QtSingleApplication>
class MyApplication : public QtSingleApplication
{
  Q_OBJECT
public:
  MyApplication(int argc, char* argv[]) : QtSingleApplication(argc, argv) {}
};

// main.cpp
#include "MyApplication.hpp"
int main(int argc, char* argv[])
{
  MyApplication app(argc, argv);
  QMainWindow mwnd;
  mwnd.show();
  return app.exec();
}


94:デフォルトの名無しさん
09/05/03 09:30:49
辞書が挿入順を記憶するのは、PHPがそうだし、Rubyも1.9でそうなったし、
Pythonも2.7では(組み込みの辞書ではなく)標準ライブラリにcollections.OrdererdDict
が追加された。

設定ファイルとか、JSONファイルとか、シリアライズ&でしりあらいずした後に
人間がテキストエディタで触りたいとかのとき、順序が記憶されると便利。
少ない追加コストで利便性が向上するのは悪くないトレードオフで、どちらかが
正しいということは無いと思うよ。

95:デフォルトの名無しさん
09/05/03 10:18:39
>>94
おまい詳しいなw
LL系は知らないから参考になったお^^

96:デフォルトの名無しさん
09/05/03 10:57:44
>>94
hashやmapにそんな無駄なコストを入れるなんて正しくないよ。

97:デフォルトの名無しさん
09/05/03 11:11:27
>>93
argcに&が付いてないからでは?
MyApplication(int& argc, char* argv[]) : QtSingleApplication(argc, argv)

98:デフォルトの名無しさん
09/05/03 11:16:08
>>96
単に用途によるってだけだろ
両方必要なら両方作るまでだし正しいも正しくないもねーよ

99:デフォルトの名無しさん
09/05/03 11:48:30
>>98
検索速度を犠牲にするのだから正しくないよ。そんなのは偽物のはhash。

100:デフォルトの名無しさん
09/05/03 12:32:54
>>94
比較対象が違います。
PHP、Ruby、Pythonのような元々速度が遅くて大容量データを
扱うのに向かない処理系ならそういった便利そうなものが付いて
もいいと思う。

101:デフォルトの名無しさん
09/05/03 12:42:55
>>99
検索速度を犠牲にするような頭の悪い実装にするわけないでしょ?
思い込みで「酷い実装」だの批判する前にソースを読むように。

URLリンク(anonsvn.mono-project.com)

102:デフォルトの名無しさん
09/05/03 13:57:58
故事成語に蛇足という言葉があってだな


まぁ別物、とまでは行かなくとも少なくともオリジナルからは逸れてる
そのオリジナルと異なるものが標準と勘違いすればそこでトラブルが発生する

>>86の場合、Pythonどうのこうのじゃなく、
コンパイラ依存になる点が大きな問題


龍に足生えると飛べなくなる、とかそういう話じゃない

103:デフォルトの名無しさん
09/05/03 14:02:19
>>102
Monoの仕様は以前は追加順ではなかった。
Microsoftの実装と挙動が違うということで修正された。

実はオリジナルのソースも手に入るけど、
NDAの関係があるから晒すわけにはいかない。

104:デフォルトの名無しさん
09/05/03 15:06:29
>>100
PHP, Ruby はともかく、Pythonはかなりコストを意識しているぞ。
だから、組み込みのdictはそのままに拡張したOrdererdDictを追加で作った。
同じ方針でQOrdererdDictがあっても良いと思う。

105:デフォルトの名無しさん
09/05/04 01:45:45
Qtのライセンスなんだけど、公式に以下のとおりに書いてある。

Qt LGPL 版の使用に際しては以下の点にご留意ください。
* Qt 4.5 以降のバージョンでのみ LGPL でも使用でき、4.5 より前のバージョンには LGPL は適用されません。
* Qt LGPL 版を使用していることを明記する必要があります。
* Qt LGPL 版のソースコードの配布を求められた際に、配布を行う義務があります。
* Qt LGPL 版に手を加えた場合には、手を加えた部分のソースコードの公開が必要です。
* Qt LGPL 版をスタティックリンクした際には、独自開発部分のソースコードを配布するか、独自開発部分のオブジェクトを配布する必要があります。
* Qt LGPL 版を使用して作成したアプリケーションのライセンスに、リバースエンジニアリングを禁止する条項を入れてはなりません。
* 同一プロジェクト内で、Qt 商用版を使用する開発者がいる場合に、他の開発者が Qt LGPL/GPL 版のみを使用することはできません。Qt を使用して作成されたソースコードに共通部分がある場合に、同一プロジェクトとみなされます。
* Qt LGPL 版で開発をした後に、Qt 商用版に移ることはできません。

得にここ
> * Qt LGPL 版のソースコードの配布を求められた際に、配布を行う義務があります。
1. これは、Qt本体のソースコードを再配布しろって読むの?
2. それとも自作アプリのソースコードを公開しろって読むの?

漏れは1.と読んだんだけど詳しい人いる?

106:デフォルトの名無しさん
09/05/04 01:49:14
>>105
1.だよ

107:デフォルトの名無しさん
09/05/04 02:11:25
>>106
1 で正解。LGPL のソフトウェアを改変したら、改変したソースコードを
(求めに応じて)開示する必要がある。自分で書いた部分は開示する必要は一切無し。
MPL と一緒だね。

静的リンクをしてもソースコードを公開する必要がないときちんと書いてあるのは
偉いね。

108:デフォルトの名無しさん
09/05/04 02:13:28
スマソ。アンカー間違えた。>>106さんじゃなく>>105さん宛でした。失礼。

109:デフォルトの名無しさん
09/05/04 09:20:03
>>101
要素が多い場合にダブルバケットにした方が速い。無駄にメモリー使っている。

110:デフォルトの名無しさん
09/05/04 11:14:39
>>109
ここQtスレなんで、続きはこっちでやれや。

消しゴムじゃないMONOを使ってみるスレ 2個目
スレリンク(tech板)l50

111:デフォルトの名無しさん
09/05/04 14:41:24
QT4.5のLGPLライセンスを使って、
VisualStudio2008で実行ファイルを作る場合、

>dumpbin /DEPENDENTS TEST.exe
(省略)
Dump of file TEST.exe

File Type: EXECUTABLE IMAGE

Image has the following dependencies:

QtCore4.dll
QtGui4.dll
MSVCR90.dll
KERNEL32.dll

Summary

1000 .data
D000 .rdata
3000 .reloc
1000 .rsrc
1B000 .text
ってなってるから、QTは動的リンクになってるんだよね?

112:デフォルトの名無しさん
09/05/04 17:53:07
WindowsでのLGPLのQT使った実行ファイル作るメモ。
間違い、補足あったらご指摘おねがいします。

MSVCR90.dllがリンクされてると、他PCで動かなくなるので、
プロジェクトのプロパティ→C/C++→コード生成→ランタイムライブラリに「マルチスレッド(/MT)」
を設定する。(代わりにmsvcrt.libが静的リンクされるようになる)

それでコンパイルしてみると、
デフォルトでリンクされるLIBCMT.libとmsvcrt.libが競合するエラーになる。
これは、プロジェクトのプロパティ→リンカ→コマンドラインに「/nodefaultlib:"msvcrt.lib"」を設定すると
エラーがでなくなる。

このときの
dumpbin /DEPENDENTS TEST.exe
は、
Dump of file TEST.exe

File Type: EXECUTABLE IMAGE

Image has the following dependencies:

QtCore4.dll
QtGui4.dll
KERNEL32.dll

となる。

113:デフォルトの名無しさん
09/05/04 21:16:20
msvcrt.libは静的リンクしても大丈夫なライセンスなの?

114:デフォルトの名無しさん
09/05/05 07:34:25
Qtって今どういう状況なの?
数年ぐらいさわってなかったけど今みたらIDEまでフリーみたいになっちゃってるけど
コンパイラついてないんだよね

115:デフォルトの名無しさん
09/05/05 14:18:21
>>114
付属してるやつもあるよ、ちなみにMINGW

116:デフォルトの名無しさん
09/05/06 02:59:48
QHBoxLayout なんかに追加したウィジットって、後でそれを動的に全部消す場合、
そのウィジットのポインタを変数で保存して置かないといけないですか?
QHBoxLayout から追加されてるウィジットのポインタを取り出せないですよね?
追加してあるウィジット全部消す方法もないですよね?

↓適切でないかもしれない例プログラム
int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QWidget *window = new QWidget;

QPushButton *button1 = new QPushButton("Button1");
QPushButton *button2 = new QPushButton("Button2");
QPushButton *button3 = new QPushButton("Button3");

QHBoxLayout *layout = new QHBoxLayout;

layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);

window->setLayout(layout);

layout->removeWidget(button1);
delete button1;

window->show();
return a.exec();
}

117:デフォルトの名無しさん
09/05/06 04:10:47
大抵そういうのはクラス内で行う処理で、
そういう事がしたいならクラスで保持しとけばいい

class Window : public QWidget{
public:
 Window();

private:
 void init();

 QPushButton *button1;
 QPushButton *button2;
 QPushButton *button3;
};

void Window::init(){
 button1 = new QPushButton("Button1");
 //略
 setLayout(layout);
}

そういう、どうすべきかもサンプル見ればかなり参考になる
そもそもまだオブジェクト指向を理解できてなさそうだが、
それも含めてQtのサンプルはいい教材

118:デフォルトの名無しさん
09/05/06 11:17:40
単純に全部消すならtakeAtループが便利
URLリンク(doc.trolltech.com)

119:デフォルトの名無しさん
09/05/06 13:16:03
>>118
takeAtでやってみると、一見消えたようにみえましたが、
ウィンドウ背景色がいつもと違ったのでウィンドウ大きくしてみると
でっかいボタンがありました。どうも、QHBoxLayout からは削除されたけど、まだwindow上に
残ってる?ようです。deleteしてるのになぜ残るのでしょう?

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QWidget *window = new QWidget;

QPushButton *button1 = new QPushButton("Button1");

QHBoxLayout *layout = new QHBoxLayout;

layout->addWidget(button1);

window->setLayout(layout);

QLayoutItem *child;

while ((child = layout->takeAt(0)) != 0)
{
delete child;
}

window->show();
return a.exec();
}


120:デフォルトの名無しさん
09/05/06 14:07:45
while ((child = layout->takeAt(0)) != 0)
{
  delete child->widget();
  delete child;
}



121:デフォルトの名無しさん
09/05/06 21:35:13
日本語バージョンってないん?

122:デフォルトの名無しさん
09/05/06 21:37:03
Qt Creatorってどんな感じなのだろうか

123:デフォルトの名無しさん
09/05/06 23:14:48
>>121
何の日本語バージョン?

>>122
一言で言うと軽量のIDE

ここらへんを見れば大体わかるかと
URLリンク(www.qtsoftware.com)
URLリンク(www.youtube.com)

まぁ、無料なんだし自分で試してみるのが良いと思うよ
URLリンク(www.qtsoftware.com)

124:デフォルトの名無しさん
09/05/07 10:16:30
>>123
軽量だっていうことで評判はまずまずらしいのだが・・・

125:デフォルトの名無しさん
09/05/07 10:52:45
Qt Creator&MinGW Windows版をつかっています。
簡単なGUIアプリを作成しようとしているのですが、
Designerで作成したuiを継承したクラスをつくりました。
その中でint型の変数をつくったのですが、
Creatorのデバッガで値を見ようとすると、
Localsのリストになく、
Watcherに手入力すると、
<not in scope>と返ってきます。

ブレークポイントは同じクラスの関数内(private slots)なので、
スコープは生きているはずだと思うのですが…。
どこか認識に誤りがあるようでしたらご教示ください。

126:デフォルトの名無しさん
09/05/08 01:56:33
ボタンのクリックシグナルを処理するスロット関数内で
どのボタンが押されたのか判別する方法教えてくださいm(__)m

127:デフォルトの名無しさん
09/05/08 02:33:30
>>126
sender()、ダイナミックプロパティかプロパティ、QSignalMapperなど。

128:デフォルトの名無しさん
09/05/08 03:07:37
>>127
ああ、重要なこと書いてないことに気づきました。ごめんなさい><
マウスのどのボタンがトリガーになったのかを判断しようとしてました。

改めて書き直します。
QTableWidgetで8つのセルに0,1を書き、1バイトのビットをセルクリック
にて0,1の反転できるソフトを作っています。これは、cellClickedシグナルで
簡単に出来たのですが、QTableWidgetに右クリックでコンテキストメニュー
が出るようにしたところ、右クリックでも0,1の反転が動いてしまう事に気づき、
右クリックの時は反転動作をしないようにしようとした次第です。

ちなみに、QPushButtonでは、ボタンが押されるのは左クリック時のみで、
右クリックでは押されませんでした。

これからすると、問題なのは、QTableWidgetのcellClickedシグナルが右クリックでも発生して
しまう事なのではないかと思えてきました。。







129:デフォルトの名無しさん
09/05/08 03:51:36
>>127
>これからすると、問題なのは、QTableWidgetのcellClickedシグナルが右クリックでも発生して
>しまう事なのではないかと思えてきました。。

いややっぱり、これは正しい実装ですね。あるセルが選択された状態で、別のセル上で右クリックしたとき、
ユーザがやりたい事は最初のセルのコンテキストメニューを開きたいのではなくて、右クリックした
セルのコンテキストメニューを開きたいのだから。

となると、やっぱり、cellClickedの引数に押されたマウスボタンの情報が入ってないのが
いけない気がしてきました。。

130:デフォルトの名無しさん
09/05/08 03:58:32
Qtって、ちょっと癖がある気がします。
QWidgetがタイマーの機能を持っていたり、
イベントを伝える手段がsignalと
virtual void mousePressEvent ( QMouseEvent * event )
など経由の2種類あったり、なにか統一されていない気がします。
これらって、理由があっての事なのでしょうか?
それとも、過去の手本としたライブラリのプログラミングスタイルから脱却出来ていないのでしょうか。

131:デフォルトの名無しさん
09/05/08 04:07:46
>>128
どのボタンが押されたかが分かるシグナルを追加するか、イベントフィルター
でどのボタンが最後に押されたかを覚えておいて、イベントフィルターに尋ねる
ようにするというのは。


132:デフォルトの名無しさん
09/05/08 10:21:15
>>130

> QWidgetがタイマーの機能を持っていたり、

QTimerを使えば、タイマー機能は独立したクラスとして扱えます。
実装上は辿り着くのは同じです。タイマー機能があるのはQObject
で、QObjectがタイマー機能を持つのは、以降のようにイベントの
2つの性質をタイマーに持たせられ、直交性を保って統一的になり
ます。

> イベントを伝える手段がsignalと
> virtual void mousePressEvent ( QMouseEvent * event )
> など経由の2種類あったり、なにか統一されていない気がします。

イベントの性質が違うから分けているのです。シグナルはセマン
ティックなイベントで、イベントハンドラーはシンタクティックな
イベントです。

> それとも、過去の手本としたライブラリのプログラミングスタイルから脱却出来ていないのでしょうか。

過去のを手本として、脱却していると思います。


133:デフォルトの名無しさん
09/05/08 16:26:27
>>132
教えてくださってありがとうございます。
すみません、よく分からなかったのでもうちょっと詳しくお願いできないでしょうか。
QTが好きなので納得したいです。
シグナル→セマンティック→意味的?
イベントハンドラ→シンタクティック→?

自分で感じ取れているのは、
イベントハンドラはハードウェアレベルの低レベルイベントをそのまま。
シグナルは、ハードウェアの低レベルイベントを
高レベル(知的な解釈?)に解釈(QPushButtonが押されたとか)したもの。

という感じです。
でもなぜ二つの種類があるのかやっぱり分からないままです。
全てシグナルにしてしまったほうが分かりやすいのではないでしょうか?


134:デフォルトの名無しさん
09/05/08 17:01:59
>>129
>いややっぱり、これは正しい実装ですね。あるセルが選択された状態で、別のセル上で右クリックしたとき、
>ユーザがやりたい事は最初のセルのコンテキストメニューを開きたいのではなくて、右クリックした
>セルのコンテキストメニューを開きたいのだから。

やっぱり、右クリックていうのは、そのセルを選択しコンテキストメニューを出すのが目的であって、
そのセルをクリックしたいわけでないので、クリックイベントが発生するのは間違いが気がする。。



135:デフォルトの名無しさん
09/05/08 18:50:11
コンボボックスの値をマウスホイールで変える時、
コンボボックスの上からカーソルが出ないように気をつけないといけない
のがつらいのですが、なにか方法ないでしょうか?


136:デフォルトの名無しさん
09/05/09 01:32:37
QtCreatorのスナップショットをソースリポジトリからとってきてwin32-msvcでコンパイルすると、
Cdb(マイクロソフトのデバッガ)が使えるようになっていますね。
Gdbよりも良さげです。

137:デフォルトの名無しさん
09/05/09 09:40:49
>>136
Windowsなら、GCCではなくてこれでなくてはね。

138:デフォルトの名無しさん
09/05/09 15:52:20
恐ろしくあたりまえなことを言ってる気がするんだが>>136


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4183日前に更新/182 KB
担当:undef