【GUIツールキット】Qt 総合スレ 4【Win/Mac/Linux】at TECH
【GUIツールキット】Qt 総合スレ 4【Win/Mac/Linux】 - 暇つぶし2ch1:デフォルトの名無しさん
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

139:デフォルトの名無しさん
09/05/09 16:10:50
>>138
Creator 1.0までは、GDBのインターフェイスしか無かったんじゃないの?

140:デフォルトの名無しさん
09/05/09 20:32:27
>>139
1.1のリリース後に、CDB向けのコードが追加されています。
MinGWのGCCは遅くてGCCのバージョンも古過ぎるので、
Visual Studioのコンパイラーが使えないと開発には使えま
せんからよい流れです。

141:デフォルトの名無しさん
09/05/09 20:48:55
>>140
ちゃんと読めば良かった・・・
Creator 1.1 をvs2008でコンパイルしてGDBしか無くて
憮然としてたところだった。

142:デフォルトの名無しさん
09/05/10 00:43:00
>>133
最近使い始めたばっかりの自分の理解では、

イベントハンドラは、ウィジェットの振る舞いを「定義」する時に使う。
シグナルは、ウィジェットを「利用」する時に使う。

イベントを伝える手段は二通りあるけれど、それぞれを使用する目的が違う。

143:デフォルトの名無しさん
09/05/10 02:46:28
カプセル化のために中田氏と外田氏を区別してるってカンジ

144:デフォルトの名無しさん
09/05/10 13:00:13
>>135
フォーカスをあてて、矢印キーを使う。
マウスイベントは、マウスポインターの下にあるウィジェットに送られます。


145:デフォルトの名無しさん
09/05/10 14:15:02
未だに「憮然」を見ると誤用の方の意味が、先に頭に浮かんでしまう。

146:デフォルトの名無しさん
09/05/11 23:10:04
URLリンク(labs.trolltech.com)

Qtのリポジトリが公開されています。自動テストのコードも入っていました。

147:デフォルトの名無しさん
09/05/12 05:06:31
Qt、Javaバインディング「Qt Jambi」の開発打ち切りへ
URLリンク(sourceforge.jp)

ちと古い話になるが、Java向けは消えてたのか
まぁQtはC++だからこそ需要があったのであって
Javaにはあまりなさそうだしな

148:デフォルトの名無しさん
09/05/12 19:14:08
qUncompressの使い方がよくわからない・・・

httpサーバから Content-Encoding: gzip つきで帰ってきたやつを処理したいんだけど・・・

QByteArray raw(reply->readAll()); //replyはリクエストに対するQNetworkReplyのインスタンス
QByteArray uncomp(qUncompress(raw));
とやっても解凍できない・・・

マニュアルみてみると
If you want to use this function to uncompress external data compressed using zlib,
you first need to prepend four bytes to the byte array that contain the expected length
(as an unsigned integer) of the uncompressed data encoded in big-endian order
(most significant byte first).
ようするに先頭4バイトにファイルサイズをビッグエンディアンでつけろってことだとおもうんだけど、
これもなーんかうまくいかない・・・

だれかqUncompressでうまくいってる人いる?

149:デフォルトの名無しさん
09/05/12 21:18:48
>>148
QNetworkReply でとってきたデータならすでに展開済みだと思う。

150:デフォルトの名無しさん
09/05/18 11:40:57
ウエブログのなかの検索文字列に含まれるURLエンコードされた日本語を、デコードする方法について教えてください。
なぜか、下記の方法だと一部うまくいかないのですが、どうしてでしょうか。
環境はLinux、Qt4.5.1、文字コードはUTF-8。

(例)
QString string("%E3%81%82"); // "あ"をUTF-8でURLエンコードしたもの
QByteArray byteArray = string.toLatin1();
QUrl url = QUrl::fromEncoded(byteArray);
QString urlString = url.toString();
m_TextEdit->setText(urlString);

上記は、ちゃんと"あ"となるのですが、
QString string("ff%E3%81%82"); // "ffあ"をUTF-8でURLエンコードしたもの
なぜか"ff"を足すとするとうまくいきません
("off"という文字列が含まれたときにうまくいってなかった)。
こうすると結果は
"ffあ"ではなく、"ffd"となります。
どうしてでしょう?


151:デフォルトの名無しさん
09/05/18 14:45:57
>>150
その後、分かったことですが
どうやらQTextCodecのバグ?のようです。

#include <QDebug>
#include <QTextCodec>
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

qDebug() << "ffあ";
QString string("ffあ");
qDebug() << string;
とすると、
ffあ
"ffあ"
となります。
EUC-JPとかの環境でもなるか、どなたか調べてもらえないでしょうか?


152:デフォルトの名無しさん
09/05/18 14:51:23
QTextCodecの問題なら、ローカルでも再現できますよね?
QtCreatorを使っているなら、
エディタのオプションでエンコードを変えられます。
Emacsとかでもちゃんと文字コードは変えられますよ?

153:デフォルトの名無しさん
09/05/18 14:53:55
>>151
訂正

今気づいたのですが、
151の結果の
ffあ
"ffあ"
は、コンソール上では
ffdy
"ffdy"
になっていたのですが、コピーして貼り付けたら
151のようにちゃんとした結果になっていました。
こちらの環境の問題かもしれません。
もう少し自分で調べてみなす。
お騒がせしました。


154:デフォルトの名無しさん
09/05/18 15:03:25
てst

155:デフォルトの名無しさん
09/05/18 15:32:50
>>150
どうもWidgetの表示の問題のような感じ。encode/decode系は関係ないと思う。
"ff<UTF-8>" が表示で化ける感じ。 f以外を使うと化けない。
化けない環境もあるみたいなので調査中。

QString text = QString::fromUtf8("ff\xe3\x81\x82");
QLabel label( text );
label.show();
qDebug() << text;

でqDebug()は正しく表示するが、QLabel(QLineEditやQTextEditも)はNG。
先頭の文字をf以外にすると問題なし。

156:デフォルトの名無しさん
09/05/18 17:02:02
>>155
ffが先頭の文字でなくて、途中にあってもそれ以降にある日本語が化けるようです。
例えば
"testfftestあ"
また、"fiあ"
も化けします。

157:デフォルトの名無しさん
09/05/18 17:31:55
>>156
フォントをDejaVu系から変えたら正常に表示されない?
こちらでは他のフォントにするとちゃんと描画される。
ややこしいバグだけど、デフォルトのフォントでうまくいかないのは困るな。

158:デフォルトの名無しさん
09/05/18 18:00:14
>>157
おっしゃる通り。フォントの問題だったようです。
ただ、DejaVu系ではだめでした。
さざなみゴシックにしたら、ちゃんと表示されました。
ありがとうございました。


159:デフォルトの名無しさん
09/05/19 06:29:42
レスの投稿日のような日付の文字列を1970年1月1日からの秒数に変換しようと思ったのですが、
QDateTime::toTime_tではQDateTime::fromStringで生成したデータを変換することは出来ませんでした
何か他に便利なメソッドはありますか?

160:デフォルトの名無しさん
09/05/19 06:48:00
と思ったら出来ました。すいません
年の入力を2桁にしていたので1909年とされていたようです
出力も2桁にしていたので気付きませんでした

161:デフォルトの名無しさん
09/05/19 10:16:54
>>151-158
この際、Qtをつかったとき、
日本語表示に一番適したフォントをまとめてみるべき?

162:デフォルトの名無しさん
09/05/20 10:04:48
QTで作成したツールをVistaで起動させたら、
オブジェクトを表示させているキャンバスが、作成したGUIから外れて、
PCのモニタの左上に張り付くような感じになってしまいました。

同様の現象になった方、居ませんか?
解決策など分かりましたら、お願いします。


163:デフォルトの名無しさん
09/05/20 11:14:04
doxygenのようにドキュメントを生成する方法をご存知の方いませんか?
用意されているようですがわかりません。


164:デフォルトの名無しさん
09/05/20 12:31:21
>>163
doxygen はQtスタイルをサポートしてるから doxygenを使えばいいんじゃないの?

165:デフォルトの名無しさん
09/05/20 12:45:34
Qtのソースにある qdoc3(tools/qdoc3) で出来るはず。
Qtのドキュメントはそれで html にしている。

166:デフォルトの名無しさん
09/05/20 12:46:18
doxygenは確か、Qtリファレンスを自分でも作りたいと思った
Qt使いが作ったんじゃなかったっけ

167:デフォルトの名無しさん
09/05/20 21:11:40
int QHttp::request ( const QHttpRequestHeader & header, const QByteArray & data, QIODevice * to = 0 )
の使い方が分かりません。
具体的にはmixiにログインして、
home.plのhtmlソースを取得したいのですが。
QHttpRequestHeader header("POST", QUrl("URLリンク(mixi.jp)").toEncodedPath(), 1,1);
QByteArray data((QString)("email=" + name + "&password=" + pass)).toAscii() );
//"email","password"など、POST時のIDはmixiのhtmlソースから取得しています。
QFile to("gotHtml.txt");
をnewでコンストラクトし、
実行スロットでrequest()を発射したところ、
gotHtml.txtは生成されるものの、ブランクファイルでした。
よい方法をご教示ください。
よろしくお願いします

168:デフォルトの名無しさん
09/05/20 22:48:15
>>167
自分も分からないので確認するべきポイントを…
・POST先URLは正しいか?
・requestの戻り値は?
・emailにnameを渡しているが正しいか?
・メアド、パスワードは正しいか?
・リクエストがPOSTで正しいとすれば、&passwordって…おかしくないですか?

169:デフォルトの名無しさん
09/05/20 23:09:24
>>168
ゴメン、適当すぎた
qtdemoにHTTPクライアントのexampleがあるから
それを参考にするといいんじゃないかな?

170:デフォルトの名無しさん
09/05/20 23:15:19
QNetworkAccessManagerのほう推奨じゃないっけ

171:デフォルトの名無しさん
09/05/21 10:11:32
QtってLGPLになった?
さらに将来LGPL版が亡くなる可能性は無い?

172:デフォルトの名無しさん
09/05/21 10:17:17
>>171
LGPLのライセンス上無くなるって事はありえない
開発停止とかはありえるけど, 入手や使用が不可能になることは無い

173:167
09/05/21 10:21:08
>>168-170
ありがとうございます。
POST先のURLなどは確認しています。
requestの戻り値は今夜確認します。
emailにnameを渡すのは、id=emailのinputにアカウント名を渡しています。
&passwordはPOSTの形式がid A,Bに対して、
"A=xxx&B=yyy"という形式だと、
POSTの仕組み関係のページに書いてあった気がします。
これも確認してみます。
qtdemoのexampleですか。
気づきませんでした、参考にします。

QNetworkAccessManagerですか。
よく分かりませんが、これも勉強してみます。

皆さん、ありがとうございました。
また詰まったらor解決できたら、
ご報告させて頂きますね。

174:デフォルトの名無しさん
09/05/21 10:56:50
>QNetworkAccessManager推奨
これは知らなんだ

175:デフォルトの名無しさん
09/05/21 12:12:18
>>165
ありがとうございます。
qdoc3ですが、私の環境ではQtのディレクトリ内のbinにコピーされていませんでした。
tools/qdoc3/releaseにはありましたが。
ちょっと試してみます。

>>164
折角なので本家のツールを使用してみたいと思います。


176:デフォルトの名無しさん
09/05/21 15:39:05
Qt から既定のブラウザの起動って出来ますか?

177:デフォルトの名無しさん
09/05/21 15:39:21
qdoc3についてのドキュメントが見当たりませんが何処かにありますか?
本家の All Tools をみたのですがないようです。
qdoc3は拡張子がqdocconfのファイルを引数とするようですがqdocconfの
書き方などのドキュメントがあればと思います。


178:デフォルトの名無しさん
09/05/21 16:07:04
>>176
QDesktopServices::openUrl()

179:デフォルトの名無しさん
09/05/21 17:06:51
QPainterでマウスカーソルにオブジェクトをくっつけて描画を行っているのですが、
Vistaマシンだと残像が残ってしまいます。
XPでは正常に描画され、VistaでもAero環境だとこれも正常に描画されます。

VistaでQPainterによる描画を行う場合、何か特別な処理が必要だったりするのでしょうか。

180:デフォルトの名無しさん
09/05/21 18:00:37
初心者というか、使ったことないのでつが、Mac OS X にインストロールするの簡単でつか?
wxWidgetsをMac OS Xにインスコするのには数日費やしますたw

181:デフォルトの名無しさん
09/05/21 18:37:43
>>174
QHttpクラスのリファレンスに書いてあるよ
URLリンク(doc.trolltech.com)

182:デフォルトの名無しさん
09/05/21 19:43:00
>>180
dmg版があるし、そいつをマウントしたら親切なインストーラがあるよ。


183:デフォルトの名無しさん
09/05/21 22:11:23
LPCTSTRからQStringにするにはどうしたらいいですか(;´д⊂)
調べると、QString::fromUcs2()の例があるけど、QT4にはないみたいです(⊃д⊂)

184:デフォルトの名無しさん
09/05/21 23:12:04
>>183
QString::fromUtf16() は?

185:デフォルトの名無しさん
09/05/21 23:42:27
>>183
#ifndef UNICODE
#define T2Q(tstr) QString::fromLocal8bit(tstr)
#else
#define T2Q(tstr) QString::fromUtf16(tstr)
#endif

186:デフォルトの名無しさん
09/05/22 10:48:28
QTimeが24時間までしか扱えないみたいなのですが、
24時間以上を扱うライブラリはないのでしょうか?

187:デフォルトの名無しさん
09/05/22 11:44:47
目的によっては QDateTime があるけど、QTimeの制限なしだけみたいなのはないな。

188:167
09/05/22 12:21:32
>>167
です。
QNetworkAccessManagerを使ってみました。
QNetworkReply*の扱いが若干不気味ですが、
うまく行きました。

まとめると、
・SIGNAL(finished())などを受け取る前に、
QFile::write( QNetworkReply::readAll() )を呼び出すと、
ブランクファイルになる模様です。
同一スロット内に記述せずに、分けてconnectするのが賢明らしい。
・hidden属性のinput(固定値を返す)ような場合でもPOSTで渡す必要がある。
・POSTするデータ形式はQUrl::toPercentEncode()をかませる必要がある。

また、全体的なクラス構成で、
myCoreなどとしてダイアログとは別にクラスを作り、
その中でQNetworkAccessManager等を生成した場合、
thisポインタを親として渡せず(QObject*じゃなくなる)、
コンストラクタで(QObject *parent)を受け取ることができない。

回避しようとQObjectを継承すると、
今度はダイアログからの呼び出し時に、
自分で定義したメンバ関数やpublicなスロットをうまく呼び出せない。
QObject::slotMySlot()が見つかりません、と表示される…。
myCore::slotMySlot()を呼び出したいのに。

189:デフォルトの名無しさん
09/05/22 13:21:21
>>188
>同一スロット内に記述せずに、分けてconnectするのが賢明らしい。
Qtのネットワーク系の多くのメソッドは非同期動作するので、リクエストだけ出して
返事を待たずに制御が帰る。相手からのレスポンスが来たら SIGNAL で通知される。
リクエストの送出とデータの受け取りは分けなくてはいけない。

>回避しようとQObjectを継承すると、
クラスの定義はどうやってる?
Q_OBJECT はあるか。
slotMySlot() は public slots: スコープで宣言しているか等。

190:167
09/05/22 13:48:07
>189
>リクエストの送出とデータの受け取りは分けなくてはいけない。
QHttp::post()などでは、格納先を引数で渡していたので、
QNetworkAccessManager::postでも同じだと思っていたのです。

myCoreクラスではQObjectをpublicに継承し、
Q_OBJECTは書いたり書かなかったりいろいろ試しました。
slotMySlot()はmyCore.hでpublic slots:として宣言しました。
myCore : public QObject,
myCore::myCore( QObject* parent )
   :QObejct(parent)
がいけないんでしょうか。

191:デフォルトの名無しさん
09/05/22 14:00:34
>>190
>QHttp::post()などでは、格納先を引数で渡していたので、
そうなのか。ごめん、QHttpの仕様はみてなかった。

>Q_OBJECTは書いたり書かなかったりいろいろ試しました。
Q_OBJECTはSIGNAL/SLOTに必須

class myCore : public QObject
{
Q_OBJECT
public:
myCore( QObject *parent = 0 )
: QObject(parent)
{
}

public slots:
void slotMySlot();
};

こんなクラス宣言なら問題はないはず。
これでだめだとすると connect() の方かな。
connect( replay, SIGNAL(finished()), mycore, SLOT(slotMySLot()) );
みたいな記述でいけるはずだが…。

192:167
09/05/22 14:10:23
>>191
ありがとうございます
今夜もう一度試してみます。
(今は呼び出し側のQDialog内でmyCoreの機能をすべて移しています)

このmyCore内で、
manager = new QNetworkAccessManager( this );
をしたときはどうなるんでしょうか。
(myCore *)thisだと、managerのコンストラクタに、
一致するものがありませんよね?
(QObject *)でキャストするべきなのか、
ダイナミックキャストをするべきなのか…。

193:デフォルトの名無しさん
09/05/22 14:18:11
>>192
キャストなしでOK。

194:デフォルトの名無しさん
09/05/22 14:32:02
Qtに関する本って古いものばかりですが、新しい本が出る予定は無いですか?
それとも日本語チュートリアルとかネットに落ちてますか?

195:デフォルトの名無しさん
09/05/22 20:39:52
オライリーのじゃダメなんか?

196:デフォルトの名無しさん
09/05/23 06:37:10
Xp上で使ってるんですが、Qtでlibを作りました。
これを別のQtプロジェクトのappで使いたいんですが、どこにこのlibを使うことを
記述すればいいんでしょう?
makefileかと思ったんですが、run qmakeするとデフォルトに戻ってるみたいですし...。

197:デフォルトの名無しさん
09/05/23 07:56:20
>>196
Windowsのときは、プロジェクトファイル(.pro)に次のように追記すればよい。
LIBS += c:/mylibs/math.lib

qmake Variable ReferenceのLIBS項目に書いてある。


198:デフォルトの名無しさん
09/05/23 14:41:57
Qt creater もひとつだな

199:デフォルトの名無しさん
09/05/23 15:56:28
Qt Creatorにソースファイルを個別にコンパイルする機能ってないですよね。


200:デフォルトの名無しさん
09/05/23 20:14:05
QLabelに
"TEST<a href=\"URLリンク(www.google.co.jp\)">TEST</a>"
などのリンクを設定して、ラベルをDisableにすると、
リンク部分の青字フォントがダブルストライク?のようになって汚くなります。
バグでしょうか?

201:デフォルトの名無しさん
09/05/24 00:58:02
>>200
どのOSとスタイルで、どのフォントを指定するとなるのでしょうか。

202:デフォルトの名無しさん
09/05/24 06:08:46
>>201
ごめんなさい、WinXPのXPスタイル?です。

203:デフォルトの名無しさん
09/05/24 08:33:58
ソースファイルをUTF-8にするのがQTのマナーだとかってに思ってたのですが、
それではMOCが失敗するのですね?
Unicodeでなくむしろ、Shift-JISやEUCでないとQtは正しくうごかない?

204:デフォルトの名無しさん
09/05/24 09:06:07
>>203
自分の環境はLinuxだけど、ソースファイルをUTF-8にしても問題は出ていない。
環境は?

205:デフォルトの名無しさん
09/05/24 09:42:05
>>200
確かに表示が汚いな。
4.4と比べてみないとバグとはっきりは言い難いけど。
月曜になればいろいろチェックできると思うけど、
本家に報告してみるのも手。

206:デフォルトの名無しさん
09/05/24 09:47:58
>>199
>Qt Creatorにソースファイルを個別にコンパイルする機能ってないですよね。
ファイルを指定してコンパイルすることは、多分できないと思います。
でもプロジェクトを複数個作って(読み込んで)、
プロジェクトを切り替えてビルドするというのはどうですか。
ただし、少々面倒かもしれないけれど。


207:デフォルトの名無しさん
09/05/24 10:03:31
>>197 どうもです。
LIBSをキーワードに勉強してみます。

208:デフォルトの名無しさん
09/05/24 12:10:20
>>200
Linuxのplastiqueスタイルだけど、
ラベルをDisableにするとEnableにする前より、リンク部分が強調されている感じになった。
同じような結果。

209:デフォルトの名無しさん
09/05/24 15:11:08
>>203

>ソースファイルをUTF-8にするのがQTのマナーだとかってに思ってたのですが、

Qtは、C文字列のデフォルトエンコーディングはLatin-1で、UTF-8にするという習慣は
ありません。コンパイラーが使いたいエンコーディングを正しく処理してくれるならば、
Qt では、QTextCodec::setCodecForCStrings()などでエンコーディングを設定すれば、
Qt も正しく扱えます。

>Unicodeでなくむしろ、Shift-JISやEUCでないとQtは正しくうごかない?

コンパイラーがエンコーディングをうまく扱うとは限らないので、ソースファイルには、
マルチバイト文字は記述せずに、ASCII文字にするのが最も確実です。

一番困るのは、Visual Studio 2005以上では、日本語環境でソースコード中のC文字列
をUTF-8で書いてコンパイルすると、.exe内ではSJISになってしまうことです。

210:デフォルトの名無しさん
09/05/24 15:14:11
表示が混在するような場合はどうしたらいい?

ソース自体はUTF-8で書いていて、
外部から読み出したデータをQTreeWidgetで表示させたいんだけど、
そのデータがEUC-JPなんだ。
QTreeWidgetにsetCodecとか無さそうだし…

211:デフォルトの名無しさん
09/05/24 16:36:52
>>210
外部ファイルのエンコーディングがEUC-JPなら、QTextStreamでsetCodec()
して、QStringに読込めば、それをQTreeWidgetに渡して表示できます。

生のEUC-JPへののchar*ならば、QTextCodec::codecForName("eucJP")で返る
インスタンスのtoUnicode(char*)でQStringを得られます。

212:194
09/05/25 10:40:45
>>195
>入門 Qt 4 プログラミング
>QT Createrの説明がない

Qt Createrの説明が無くてもおkなんですか?

それとも、
>Qt GUIプログラミング (C magazine)
の方が良いのかなぁ?

Qt導入するということになったら、
自分が本読むだけでなくて、
本渡すだけでQt Createrの説明終わらせる方が楽なようなw


213:210
09/05/25 11:31:56
>>211
現状では、
QString A;
QString B;
となっていて、AがUTF-8(ソースコードで直値で文字列を指定)で、
BがEUC-JP(QBufferから読み込んでいる)なんだ。
うまく切り替えができないものでしょうか?
それとも、この構成自体がナンセンスでしょうか。

214:210
09/05/25 11:36:53
ごめん、自己解決。

Aをtr("")としていて、BはそのままのQStringということで、
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr(codec);
codec = QTextCodec::codecForName("euc-JP");
QTextCodec::setCodecForCString(codec);
と、trとCStringに別々に*codecを渡せばOKでした。

215:デフォルトの名無しさん
09/05/25 14:46:34
>>213
そんなグローバルな設定変えなくても、QBufferからQStringを読み出すときに
QTextStream をかませて、 QTextStream の setCodec() 使えば良いのでは?

216:210
09/05/25 15:20:01
QBuffer *buf;
QString answer;
QTextCodec *codecEucjp = QTextCodec::codecForName("euc-JP");

という時に、
QTextStream str;
str = buf->readline((qint64)size);
str.setCodec( codec );
answer = str.read((qint64)size);
ということでしょうか。
なるほど、これを書いていて211さんの返答がようやく理解できた気がします。
表現が私には文学的で理解ができなかったのですorz

(QTextStreamじゃなくてQBufferから読みだしてるから、
 setCodec()使えないよなぁ、と思ってしまってました)

ありがとうございました

217:215
09/05/25 16:13:50
>>216
俺は PyQT ユーザーなのでリファレンス読んだだけの回答になるけど、

QTextStream strm((QIODevice*)buf); // キャストはたぶん要らない
strm.setCodec("eucJP")
QString answer = strm.readLine()

俺が「かませる」といったのは、こんな風に QBuffer を QTextStream で
wrap することであって、QBufferから一行取り出してはQTextStream に
コピーすることじゃない。

218:デフォルトの名無しさん
09/05/25 16:39:45
>>200
Linux/Windows の 4.4, 4.5 で確認。
Linux 4.4: 汚い
Linux 4.5: 強調されず(Disabledな見た目ではないが、4.4ほどでもない)
Windows 4.4/4.5: 汚い

Linux の 4.5 は最初再現していたけど、 $HOME/.config/Trolltech.conf を消したら再現しなくなったorz

バグっぽいけど聞いてみないとわからないかな。
直っても青い色が変わるわけでもなさそうなので効果は限定的かも。

219:デフォルトの名無しさん
09/05/25 18:53:56
>>212

> Qt Createrの説明が無くてもおkなんですか?

Qt Creatorは、IDEのひとつなのでなくてもやって行けます。
Qt 4を覚えるには、もうひとつはQt 3なので、Qt 4のこちらがよいです。

> Qt導入するということになったら、
> 自分が本読むだけでなくて、
> 本渡すだけでQt Createrの説明終わらせる方が楽なようなw

Qt Creatorのマニュアルの翻訳は、Qt Creatorの日本語化プロジェクトで
行なわれているので、できるまでは英語で我慢して、入門Qt 4プログラミングを渡せば楽でしょう。


220:210
09/05/25 23:48:39
>>215
ありがとう、助かりました。
改行コードが取り除かれてることに気づかず、2時間悩んだのは秘密です(w

オライリーのは版によっては誤植が多々あるので気をつけてください。
その点、原本は英語ですが割と読みやすいです。
そもそも技術書の英語は文学と違って先入観を捨てれば読みやすいと思う。
まぁ、こればかりはホントに主観だけど。
それと、チュートリアル本としてはあまりいい構成ではないと思います。
表計算ソフトのメインウィンドウのサンプルが長く、
しかも章を跨いで打ち込みをしないと、
実行してどう動くのか掴みにくいと思います…。
私の場合はそこで諦めて、後半はパラ見だけになってしまいました。

221:デフォルトの名無しさん
09/05/26 08:19:45
最近流れ早いね。

書籍はC++ GUI Programming With Qt 4 Second Editionがあれば他はいらないと思う。
英語の本とはいえ英語が赤点だった自分でも理解できているので問題ないかと。
一応、Googleブック検索でFirst Editionが読めるので、試し読みしてみることをすすめる。

Qt Creatorはまだ出たばっかりというのと軽量IDEという方向性的なため
機能がシンプルなので特に迷うことなく使用できるはず。
まぁ、裏を返せば出来ることが少ないんだけどね。

222:212
09/05/26 08:53:55
>>219 221
了解。
Qt 4本買ってみます。(英語アレルギーの人が居るかもなので、日本語買うかも)
Qt Createrは軽量IDEなんですね。
とは言っても、XCodeよりは賢い動作っぽいし(マカーが怒る?)、クロスプラットフォームなところが安心ですね。
wxDevC++で作成したコードをMACに送ってXCodeコンパイルやったら辛かった。

223:デフォルトの名無しさん
09/05/26 10:51:29
英語でよければまずはこれ
URLリンク(www.qtrac.eu)

URLリンク(doc.qtsoftware.com)
からリンクが張られているQt4本の1st edition。
2nd editionを買う前に目を通すといい。

224:デフォルトの名無しさん
09/05/26 13:23:28
1st editionのやつってサンプルコードどこかに公開されてたりはしない?
あくまでちゃんと本買ってCDROMからってことなのかな?

225:デフォルトの名無しさん
09/05/26 19:33:52
GUIでマウスが置かれたところにチェックボックスがあったときに
周りを別の色で強調するようにしたんだけど
FreeBSDではマウスをそこから離すと強調したところが真っ黒になってしまう

これってQtじゃなくてグラフィックドライバの問題なんですかね

226:デフォルトの名無しさん
09/05/26 20:24:35
googleのブック検索で入門Qt4読めるよ。
C++GUI programing with qtもセカンドエディションがある。

227:デフォルトの名無しさん
09/05/27 09:03:06
㌧クス>>223 >>226
何これ、かなり読めちゃうね。

228:デフォルトの名無しさん
09/05/27 15:18:48
Qt Designerでダイアログにボタン等を配置してからサイズ調整すると
ダイアログのサイズが配置されているウィジェットを無視して最小にな
ってしまいますが前からこんなんでしたか?
ウィジェット群に適当なマージンをとってダイアログがリサイズされたと
記憶しているけども。


229:デフォルトの名無しさん
09/05/27 16:40:37
レイアウト設定せんとだめじゃね?

230:デフォルトの名無しさん
09/05/27 18:34:10
全てのウィジェットは何らかのレイアウトに配置済み。

QVBoxLayout
 -QGridLayout
  -QWidget(4個)
 -QHBoxLayout
  -QWidget(2個)


231:デフォルトの名無しさん
09/05/27 21:13:23
どうもDesignerでダイアログをデザインすると、できるソース(ui_xxx.h))がおかしくないですか?
ウィジェットを色々配置して何らかのレイアウトを使うとui_xxx.hのclass Ui_xxxのメンバに無意
味と思えるQWidget*のインスタンスwidgetができるのですがなんでしょうね。


232:デフォルトの名無しさん
09/05/28 07:28:23
>>228 231
多分 designer のレイアウトの使い方が間違ってる。
top level widget にレイアウトを割り当てるときには
レイアウトしたいwidgetをマークしてレイアウトを選ぶのではなく、
top level widget(この場合は最上位のDialog)を選んでレイアウトを選択する。
( レイアウトを新たに作るのではなく、Dialogにレイアウトを割り当てる)

Object Treeで Dialog の直下にレイアウトがないのに
レイアウトが反映されている状態が正常。
Dialogのプロパティに Layout があるかどうかをチェック。

designerのこの仕様は正直わかりにくい。

233:デフォルトの名無しさん
09/05/28 12:09:46
それ、わかり辛いですね。
教えて頂き、ありがとうございます。


234:デフォルトの名無しさん
09/05/28 22:59:58
WindowsにてMinGWでビルドしたのですが、
QtCore4.dll,QtGui4.dll,QtNetwork4.dll,mingwの(名前忘れた).dll
が配布時に必要ですよね。
これらのdllって、\qt2009.2\Qt\binから持ってくるべきですか?
それとも\qt2009.2\binから持ってくるべきですか?

それと、それらのexeファイルとdllの位置関係なのですが、
同じディレクトリに入れればいいのでしょうか。
プロジェクトファイルで指定ですか??

とりあえず、Qtの無い環境で、上のdll4つ、
同じ場所においてDependencyWalkerで走らせたのですが、
dllがないってエラー吐かれてしまいました。

235:デフォルトの名無しさん
09/05/29 06:41:36
>>234
debugでビルドしたものではありませんか?
debugビルドした場合は、QtCore4d.dllなどの
ファイル名が~dとなっているDLLに依存しますよ

236:デフォルトの名無しさん
09/05/29 08:45:57
QWinWidgetクラスを使うとWin32APIとごちゃまぜで使えそうなんですが、
LinuxとかWindowsCEとかはどうやってごちゃ混ぜに書くんでしょうか?


237:234
09/05/29 12:24:15
releaseですね…。
debugでビルドしたものは4MB近くあるのに対して、
releaseでビルドしたものは100KBなので、間違いないです。
ちなみに、プロジェクトファイルは以下のようになっています。

TEMPLATE = app
TARGET = ./bin/myApp
DEPENDPATH += ./src
INCLUDEPATH += ./src

238:デフォルトの名無しさん
09/05/29 12:56:04
>>234
具体的にどのdllがないっていわれる?

簡単なアプリなら
app.exe QtCore4.dll QtGui4.dll mingwm10.dll だけでうごいてるけど。
画像を扱う場合などは plugins の下を適当にコピーして場所を設定する必要があるかも。
ただし、この場合のエラーは別の原因だと思うが。

239:234
09/05/29 13:27:23
Dependency Walker下で実行すると、
MSJAVAとかを抜きにすれば、
QtCore4.dll
QtGui4.dll
QtNetwork4.dll
mingwm10.dll
のすべてが赤い表示になってしまいます。

画像はpngファイルをアイコンとして使っていますが、
仰っているように、
GUI表示されたときにきちんと表示されているので、
問題は他にあるのでしょう。

240:デフォルトの名無しさん
09/05/29 14:09:13
Vista(Qt SDK はインストールしたがPATHは通ってない状態)で
app.exe だけある状態で Dependency Walker (2.2) を動かすと
MINGWM10.DLL, QTCORE4.DLL QTGUI4.DLL がないと言われる。

app.exe と同じディレクトリに上記の3つのDLLをコピーすると問題なし。
(WARNINGはあるが、動作する)。
コピー元は C:\Qt\2009.02\qt\bin

その場合にツリー表示されているDLLは
KERNEL32.DLL, MSVCRT.DLL, MINGWM10.DLL, QTCORE4.DLL, QTGUI4.DLL
の5つ。後ろの3つ(or +QTNETWORK4.DLL)をコピーすれば、うまくいくはずだが…。

241:234
09/05/29 14:19:37
>240
ありがとうございます。
プロジェクトファイルでの記述は無関係でしょうか??
リファレンスを読む限りでは、
同一ソリューション内の別プロジェクトに、
依存する場合は云々と書かれているので、
おそらく関係ないんでしょうね…?

242:デフォルトの名無しさん
09/05/29 14:31:19
>>241
ビルドできていれば問題ないとは思うけど。
proファイルはこれだけ(Creatorで作成)。
app_bundle は Macにしか効果がないようなのでCONFIGはほぼ無関係。

TARGET = app
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp

そこそこ規模のあるアプリで試しているようなので、
簡単なものでチェックしてみては。


243:デフォルトの名無しさん
09/05/29 15:58:28
Qtで簡単 GUIプログラミング―Qt入門書を読む前に読む「入門書」
URLリンク(www.amazon.co.jp)

こんな本出てたんだなとおもったら、いきなり評価☆一つとはw

244:デフォルトの名無しさん
09/05/29 16:04:35
しかしこの評価もなんだかなぁ
この人にとっては役に立たなかったんだろうけど

まぁ俺にも役立ちそうに無いが

245:234
09/05/29 16:11:11
簡単なHelloWorldでもダメでしたorz
ビルド環境にも問題があるような気がしてきました。

Athlon64マシンにWindowsXP32bit版、MinGW32でビルドした場合、
動く構成はどのようになるのでしょうか。

246:デフォルトの名無しさん
09/05/29 18:48:30
俺のとこはMingwでもvisual c++でも動くけどなあ。
linuxのgccでも動く。
セロリンだけど。

247:デフォルトの名無しさん
09/05/29 18:51:21
思いついた!dllへのパスが通ってないんじゃね?

248:デフォルトの名無しさん
09/05/31 03:01:14
Windowsのファイルのプロパティで出力されるバージョン情報を扱うクラスはありますか?
setApplicationNameやsetOrganizationNameがそれだと思ったのですが違うようで。


249:デフォルトの名無しさん
09/05/31 11:35:32
>>248
そういう機能はqmakeの方だな。
URLリンク(doc.qtsoftware.com)


250:デフォルトの名無しさん
09/05/31 12:11:10
>>249
VERSIONは与えられました。
qmakeの変数には見当たりませんが会社名等は扱えないのでしょうか?
MFCのリソースのようなものがあれば良かったのですが。


251:デフォルトの名無しさん
09/05/31 13:40:42
Win32リソースのことだろ?
そういうのはwindresを使うものと思ってたが

252:デフォルトの名無しさん
09/05/31 14:15:40
>>250
マニュアルにはないけれど、 QMAKE_TARGET_COMPANY

他の関係変数は QMAKE_TARGET_DESCRIPTION, QMAKE_TARGET_COPYRIGHT, QMAKE_TARGET_PRODUCT
詳しくは qmake のソースを。(qt\qmake\generators\win32\winmakefile.cpp)

253:デフォルトの名無しさん
09/05/31 14:53:09
ありがとうございます。
マニュアルにないということは将来別の方法でサポートする可能性があるのでしょうかね。
qdoc3も表に出していないツールのようで、どうもDoxygenを使った方が良いようですし。


254:デフォルトの名無しさん
09/05/31 15:16:14
変数名くらいは変わる可能性あるかもな。
機能がなくなることはないと思うが、気になるようならrcファイルを作って、
RC_FILE でそのファイルを指定するようにした方が確かなのかもしれない。
RC_FILE についてはマニュアルに記載してある。

255:デフォルトの名無しさん
09/05/31 16:23:50
QHeaderView::setResizeMode(int, QHeaderView::ResizeMode) について質問です。

以下のようにモデルが設定されていない、あるいはモデルのデータがない状態で QHeaderView::setResizeMode(int, QHeaderView::ResizeMode) を呼ぶとプログラムが落ちます。

QTreeView view;
view.header()->setResizeMode(0, QHeaderView::Interactive);

or

QTreeView view;
QStandardItemModel *model = new QStandardItemModel();
view.setModel(model);
view.header()->setResizeMode(0, QHeaderView::Interactive);

代わりに QHeaderView::setResizeMode(QHeaderView::ResizeMode) を呼んだ場合は落ちることはありません。この動作は仕様なのでしょうか?

QHeaderViewを継承してサブクラスを作成し、第一列のみサイズ変更可能にしたいのですが・・・何か対処方法をご存知の方、別のアイディアをお持ちの方がいればよろしくお願いします。

256:デフォルトの名無しさん
09/05/31 17:35:03
>>255
ASSERT出して落ちてるな。
ASSERT: "visual != -1" in file itemviews\qheaderview.cpp, line 1168
基本的に落ちるのはバグ。
qt-bugsにメール出して直してもらうのが一番。

257:デフォルトの名無しさん
09/05/31 18:48:14
>>256
確認ありがとうございます。
やっぱりバグなんですかね。トラック見てもそれらしいものが見つからなかったので、とりあえずメール出してきました。
しばらくはモデルのデータセット後にsetResizeMode()を呼ぶことにします。

258:デフォルトの名無しさん
09/05/31 19:05:58
floatingしていないQDockWidgetのサイズをプログラム側で動的に変更したいのですが、どこを弄ればいいですか?

259:デフォルトの名無しさん
09/05/31 20:44:36
>>150-156 の件、直ってるな。
URLリンク(qt.gitorious.org)

260:デフォルトの名無しさん
09/06/01 02:28:28
日付が変わったら画面を更新したいんですが、日付の変更を通知するようなシグナルってありますか?

261:デフォルトの名無しさん
09/06/01 10:41:15
>>260
ないので QDateTime と QTimer を使って作る。

262:デフォルトの名無しさん
09/06/01 15:36:12
>>258
楽な方法は見つからなかった。

setFixedSize() を呼び出すとサイズが変えられるから SizeHint や SizePolicy を
うまく設定すれば何とかなるかもしれない。

面倒だけど QMainWindow::saveState() した結果を変更して QMainWindow::restoreState()
すれば変更できるかも。

263:デフォルトの名無しさん
09/06/02 18:49:34
QHeaderViewから親のQTreeViewにアクセスする方法ってある?
QTreeView::setHeader()のソース見ると、d->header->setParent(this)っていうのがあるんだけど、QWidgetからQTreeViewへどうキャストすればいいのか分からない・・・

264:デフォルトの名無しさん
09/06/03 01:04:18
>>263
QHeaderView *header = view.header();
QObject *obj = header->parent();
QTreeView *tree = qobject_cast<QTreeView*>(obj);


265:デフォルトの名無しさん
09/06/03 01:31:26
>>264
できた、ありがとう! qobject_cast知らなかった、便利そう♪

266:デフォルトの名無しさん
09/06/04 10:52:22
Qt Creatorのチュートリアル日本語版は無いんでつか?

267:デフォルトの名無しさん
09/06/04 17:41:07
QTabWidgetでタブの配置をEast、Westにしたとき
┌┤
││
││
├┤Widget
││
││
└┤
こうではなく

┌──┤
├──┤Widget
└──┤
このような形にする方法ってありますか?

268:デフォルトの名無しさん
09/06/06 12:34:56
>>266
URLリンク(sourceforge.jp)
ヘルプファイルの日本語化をされている方がいます。

269:デフォルトの名無しさん
09/06/07 10:09:17
QSplitterの棒のデフォルト位置をデザイナで変更するはどうすればいいのでしょうか?
もしデザイナでできないならば、コードではどう書けばいいのでしょうか?

270:デフォルトの名無しさん
09/06/07 12:32:49
>>269
Splitterの下にあるWidgetの SizePolicy -> Horizontal(Vertical)Stretch の値を
それぞれのWidgetで明示するといいみたいです。
左のWidgetでは 10, 右のWidgetは 1 とか

271:デフォルトの名無しさん
09/06/09 02:28:23
QtCreatorをFreeBSDで動かせてる方いませんか?
当方Win上のVMware上のFreeBSD7.1にて、Qt4.5.1とQtCreatorのコンパイルは
何とかできたのですが、QtCreatorを実行してもウィンドウが現れないのです(;´д⊂)

PortsのKDE4.4.2も同時に動かしてあって、これにつかってるQt4.4.3が影響してるのか。。

QtCreatorを動かすために、gdbで手動デバッグ、やPrintfデバッグするしか手が思いつかなくて(;´д⊂)

272:デフォルトの名無しさん
09/06/09 02:44:47
>>271
エラーメッセージは何て言ってるのよ? っていうかメッセージの出しかたがわからんのか?
Konsoleでqtcreatorって打って(でいいのかな?)起動してみれ。

Error:うんこが漏れました

とか出てくるからそれ読んで原因究明。出てこないんならどこかに起動してる。
別のデスクトップとか。

273:デフォルトの名無しさん
09/06/09 05:30:07
Qt を使って作られたソフト例
にOperaも入れてやれ。


274:デフォルトの名無しさん
09/06/09 05:32:47
Qtってのにうすうす興味があって、
いろいろ調べているうちにさらに興味が湧いてきて

・・・ついに作ってみようかなと言う気になってきた俺が居る。


275:デフォルトの名無しさん
09/06/09 08:57:09
つ Qt Creator

276:デフォルトの名無しさん
09/06/09 12:13:42
>>271
ごめん、エラーメッセージのこと書き忘れてた(⊃д⊂)

Konsoleで
>qtcreator.bin
とやると、
即プロンプトが帰ってきて、エラーメッセージは表示されない。
(コンソールには、QObject: Do not delete object, 'unnamed', during its event handler!ってでる)

即プロンプトが帰ってくるのが落ちてるんだと思い込んでたけど、
Win上のQtcreatorをコマンドプロンプトで起動すると、同じように即プロンプトが帰ってきたから、
これは問題ないとおもひます。

qtcreator.binからqtcreator_process_stubを呼び出してるみたい。
という状況です(;´д⊂)


277:デフォルトの名無しさん
09/06/09 13:52:15
QTcreatorをデバッグするために-gつけてコンパイルする方法さがしたら、
*.proファイルのCONFIG変数にdebugを追加すればいいとあったんだけど、
自作プログラムでは-gがつくのに、QtCreatorでは付かないよ(;´д⊂)
なんでかな。
CFLAGとかに追加するのをやってみる。

278:デフォルトの名無しさん
09/06/09 14:41:35
>>277
qmake qtcreator.pro -r CONFIG+=debug
で Makefile を作ってみると -g はついているけど。

279:デフォルトの名無しさん
09/06/09 14:47:15
>>278
おおありがとう(;´д⊂)
やってみる

280:デフォルトの名無しさん
09/06/09 14:49:25
>>278
-gつきでコンパイル始まったよ
ほんとありがとう!

281:デフォルトの名無しさん
09/06/09 18:42:26
Linux + Qtで printf("\a");で音が出ない
systen("beep");でも無音
G++ で書くと、どちらも鳴るのになぜ?

282:デフォルトの名無しさん
09/06/09 21:37:48
>>281
"\a"って音を出すんだっけ?
音とは限らない何らかの信号をだせばいいんじゃなかったっけか?

まあ全然分からんから誰か頼むわ。


283:274
09/06/09 21:38:34
>>275
あんがと!
よし!やってみるわ。
ただ趣味グラマだから実際にプログラミングできるのは
相当先になりそうだがね。

284:デフォルトの名無しさん
09/06/09 23:00:11
ファイルパスが存在し得るものかどうかを判定したいのですが、便利な関数はありますか?
*等を含んでいるものや、/が連続するようなパスなどは無効と判定したいのですが・・・

285:デフォルトの名無しさん
09/06/10 00:55:44
QtCtreatorをデバッグしてるものですが、
QtCreatorをgdbでデバッグしてみると、
エラーで落ちてました。エラーメッセージを吐くコードがちゃんと
あったのですが、ターミナルにはログメッセージがでないようでした。
qDebug()でデバッグしようとしたら、その文字列さえもターミナルにでてこ無くて、
調べてみたところ、QtSingleApplicationでapp変数(return.exec()するやつ)
を生成してる行以降からqDebug()が出力されなくなってました。

QtSingleApplicationって前このスレで出てた、インスタンスを複数作れないよう制限するやつですよね。
これに関して何か知ってる方いませんか?(;´д⊂)

286:デフォルトの名無しさん
09/06/10 06:16:51
>>284
QDir::exists, QFile::exists, QFileInfo::exists

287:デフォルトの名無しさん
09/06/10 11:56:42
>>286
284じゃないが、それは実際にファイルがあるか調べるメソッドだよ

288:デフォルトの名無しさん
09/06/10 16:28:20
>>285
qDebug()関係のメッセージが表示されない原因が分かりました。
Qtのコンパイルに-no-iconvを指定すると出来ましたヽ(´ー`)ノ


289:デフォルトの名無しさん
09/06/10 22:10:33
はじめまして。
メニューの項目の作り方についてご質問なのですが、
シグナルスロットを使用しない方法か、
どのメニューを選択しても同じ関数が呼ばれて、IDで識別するような方法ってありますでしょうか。
つまり、他のGUIライブラリのメニューのような使い方がしたいのです。
サンプルだとQActionを使ったシグナルスロットの方法しか書いてありませんでした。
これだと、メニューの項目数と同じだけ関数を用意しないとだめなので、
動的なメニューが作りにくいです(´Д⊂


290:デフォルトの名無しさん
09/06/10 23:02:16
>>289
QAction を同じ SLOT につなげて、SLOTの中で
sender() を使ってどこからか判断したら。
QAction の文字列とかが欲しいなら
QAction *act = qobject_cast<QAction*>( sender() );
で sender() から QAction を取れるから、 act->text() とかも使える。

って、それでいいなら QMenu::triggered(QAction*) シグナル使えばいいのか。

291:デフォルトの名無しさん
09/06/11 14:29:58
Qtプログラムをgprofで動作解析するためには、
QTライブラリを -pg -static つきでコンパイルし直さないといけない
と英語のページで書いてあるように思えたのですが、本当ですか?

292:デフォルトの名無しさん
09/06/11 19:43:37
>>291
Qtだからというのではなく、gprofとはそういうものです。


293:デフォルトの名無しさん
09/06/11 19:49:32
Doxygenスレとどっちで聞こうか悩んだのですが、
お願いします。

URLリンク(www.doxygen.jp)
ここにある
>Qtスタイルを使うことができ、
>この例が示すように、C スタイルの
>コメント・ブロックが開いた直後に
>感嘆符 (!) を追加します。
/*!
* ... text ...
*/
って書いてあります。
私はDoxygenの知識はあるのですがQtに関しては全く無知です。
Qtにもドキュメント自動生成が出来たりするのですか?


294:デフォルトの名無しさん
09/06/12 01:47:31
>>293
開発元内製のqdocでドキュメント生成されていて、Qt 4.4からqdocのソースが公開されています。
Qt1のソースコードを見ると、この頃から /*!でドキュメントがソースに埋込まれていて、.docもありますね。

295:デフォルトの名無しさん
09/06/12 12:35:04
>>292
すみません、確認のためにもう一回お願いします。
解析対象のプログラムを-pg -static付きでコンパイルしないといけない、というのと
QTもスタティックライブラリにコンパイルしなおさないといけないのは分かってるのですが、

それだけではくQTライブラリも、-pg 付きでコンパイルしないといけないかどうか
の答えが292であってますでしょうか?

296:デフォルトの名無しさん
09/06/12 15:29:38
>>295
Qt自体をコンパイルしなおさないと、qtの中にプロファイル用の
コードが入らないから、実際にはqtの中で時間を使っているのに
プロファイル結果ではその呼び出し元が時間を使っているように
見えてしまう。

それでも良ければ別にQtをコンパイルする必要もQtをスタティック
リンクする必要もないよ。


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