【RAD統合環境】 Qt 総合スレ 5 【Win/Mac/Linux】at TECH
【RAD統合環境】 Qt 総合スレ 5 【Win/Mac/Linux】 - 暇つぶし2ch295:デフォルトの名無しさん
09/10/22 09:47:34
>>294
>ここで、<CustomItem*>のように<>による記述を使っており、これがないとエラーが出るのですが、
>なぜ必要なのでしょうか?(C++の勉強不足かもしれない質問ですが、、、)
<>の中に型を指定して、その型にキャストしたいことを、qgraphicsitem_castに教えるためのもの。

>ヘルプには
>T qgraphicsitem_cast ( QGraphicsItem * item )
>Returns the given item cast to type T if item is of type T
>とあり、どうも理解できません。よろしくお願いします。
リファレンスの記述のしかたが、分かりにくいだけだと思う。

個人的な好みだけれどむしろ

T2* qgraphicsitem_cast<T1*>(QGraphicsItem * item)

と書いてあってキャストに失敗したときT2が0になり、キャストに成功するとT1=T2になる、みたいに表記してあった方が
わかりやすいと思う。

ちなみに、()を使うキャストは、C言語に元々あるキャスト方法で、C++でも使用できる。
C++には、C言語にはないキャストが4種類あってその記述方法では、qgraphicsitem_castのように、<>を用いる。
(ただし、まったく機能が違うという意味ではない。Cのキャストと機能が重なっているものもある。)

qgraphicsitem_castや、qobject_castはQtだけで使用できるキャストで、使用する対象がQObjectであったり、QGraphicsItemに
限定されている。

296:295
09/10/22 09:58:05
訂正、補足。

>T2* qgraphicsitem_cast<T1*>(QGraphicsItem * item)
>と書いてあってキャストに失敗したときT2が0になり、キャストに成功するとT1=T2になる、みたいに表記してあった方が
>わかりやすいと思う。
C++には、ポインターや通常の変数の他にリファレンスというのがある。
これをキャストするときにも使用する可能性があるので、*をつけた例だけを
示すのはまずい可能性がある。
少なくともC++のdynamic_castは、リファレンスのキャストが可能で、
キャストに失敗したときは例外をスローする。

qgraphicsitem_castがリファレンスに対応しているかは未確認。

297:デフォルトの名無しさん
09/10/22 11:26:31
>>294
<type T>

template

298:デフォルトの名無しさん
09/10/22 13:23:11
>>297
castのTは、templateという意味はないのでは?

299:298
09/10/22 13:24:40
訂正
>castのTは、templateという意味はないのでは?
castのtype Tは、templateという意味はないのでは?

300:デフォルトの名無しさん
09/10/22 15:13:44
iya
wakaran nonara ii

301:デフォルトの名無しさん
09/10/22 23:41:17
Qt Designer上で、フォームに配置したオブジェクトの
シグナルと別のシグナルを接続することは可能ですか?

自分で方法を探しても見つかりませんでした。

302:デフォルトの名無しさん
09/10/22 23:44:49
>286
ありがとう。狙い通りの動作ができました。

ちなみに、statusBarはフォームエディタでMainWindowを作ると、
uiの方で生成されていますが、statusBarにQLabelなどを追加するのは、
フォームエディタではできないですよね?
MainWindow::createStatusBar()のような関数を自作して、
MainWindowコンストラクタのui->setupUi(this);の後で呼ぶような
コードが考えられると思うのですが、そんな感じになるでしょうか。

303:デフォルトの名無しさん
09/10/23 01:42:58
>>302
>ちなみに、statusBarはフォームエディタでMainWindowを作ると、
>uiの方で生成されていますが、statusBarにQLabelなどを追加するのは、
>フォームエディタではできないですよね?
残念ながら知らない。

>MainWindow::createStatusBar()のような関数を自作して、
>MainWindowコンストラクタのui->setupUi(this);の後で呼ぶような
>コードが考えられると思うのですが、そんな感じになるでしょうか。
それでいいと思う。
ただ、選択肢として既に配置されているstatusBarを格上げして、
そのソースからQLabelを追加する方法が考えられる。

304:287
09/10/23 03:17:16
>>295
なるほど、C++には<>を用いるキャストの構文があり、
キャストでは常識なのですね。

詳しい説明ありがとうございました。
大変勉強になりました。

305:デフォルトの名無しさん
09/10/23 08:27:05
ねーよ

306:デフォルトの名無しさん
09/10/23 10:28:50
static_cast<>()
dynamic_cast<>()
const_cast<>()
reinterpret_cast<>()

307:デフォルトの名無しさん
09/10/23 13:19:12
Qt Creatorでデバッグを開始すると、デバッグウィンドウの
一番上のウィンドウバーに 40個のカスタムダンパが見つかりました。
ってしばらく表示されるんだけど
あれって何の意味?


308:デフォルトの名無しさん
09/10/23 14:03:53
今までqDeleteAll()の存在を知らずに、
毎回イテレータをぐるぐる回してた…

309:デフォルトの名無しさん
09/10/23 14:17:48
>>301
Qt Designer上ではできません。

310:301
09/10/23 15:24:33
>>309
レス、ありがとうございます。

>Qt Designer上ではできません。
そうですか、あまり使われないからなんでしょうね。

311:デフォルトの名無しさん
09/10/23 15:28:27
>>310
たまに使います。

312:デフォルトの名無しさん
09/10/23 18:23:33
プログラムでstd::stringを使っていますが、デバッグ中に
ローカル変数で内容が確認できません。
確認する方法はないでしょうか。


313:デフォルトの名無しさん
09/10/23 21:40:54
>>312
確認できないというのは、具体的にどのようなことをして、どのようになったのでしょうか。

もし、最適化でローカル変数がなくなって、デバッガでローカル変数が見えないならば、
まったく最適化がかからないようなデバッグレベルでコンパイルしてみてはどうでしょう。

314:312
09/10/24 10:08:09
>313
std::pass = "test";
QString qpass = pass.c_str();
とすると、ローカル変数は
▽pass
▽_M_dataplus
▽_M_p 0xXXXXX "$XXXXXX
▽*_M_p 36 '$'

qpass "test"
みたいな


315:デフォルトの名無しさん
09/10/24 12:47:38
>>314
>std::pass = "test";
これは
std::string pass = "test";
のタイポだよね。

こちらはLinux/X11 g++だけど、問題なくデバッグできるけど。

316:315
09/10/24 12:51:26
OSやコンパイラーやIDE(使っているなら)は何?


317:デフォルトの名無しさん
09/10/24 14:37:13
>>314
std::stringをtypedefしていない?

318:デフォルトの名無しさん
09/10/24 14:50:10
>>317
>>314とは別人ですが。

std名前空間の中に新しいtypedefを作るのは
未定義の動作では?



319:デフォルトの名無しさん
09/10/24 15:26:23
QGraphicsSceneにaddPixmapしてQGraphicsView::setScene()で画像を表示しているのですが、
画像が真ん中に表示されます。
この場合、GraphicsViewをマウスクリックした座標とpixmapの画像座標の対応関係は、
どのようになるのでしょうか?

QGraphicsView, Itemあたりのヘルプを読んでみたのですが、いまいち概要が把握できませんでした。

320:317
09/10/24 15:37:33
>>318
>std名前空間の中に新しいtypedefを作るのは
>未定義の動作では?
これはどういう意味?

こちらが317でいいたかったのは、314の人が

typedef std::string StringT;
//...
StringT aString("test");
std::cout << aString << std::endl;

などとしているのではないのか、ということを聞きたかったんだけど。
これって未定義?

321:デフォルトの名無しさん
09/10/24 16:12:34
これでどう。
QMessageBox(QMessageBox::NoIcon, "title", "text").exec();


322:314
09/10/24 16:44:39
すいません
std::sritng pass でした。
Debian で QtCreatorを使ってます。
デバッグは問題なくできるんですが、ローカル変数の表示で
std::string pass は 内容がバケテ表示され
QString qpass はそのまま正しく表示されます。
std::string の文字化け?を何とかできないかと言うことです。
紛らわしくて、すいません。


323:デフォルトの名無しさん
09/10/24 18:07:04
>>322
こちらもDebian GNU/LinuxでQt Creatorを使用してるけど、
文字化けはしていない。

debianのパッケージ版の安定版Qt Creator 1.2.1を
# aptitude -t sid install qtcreator
でインストールしたやつだけど。

一度そのバグが再現するシンプルなコードを作って、
コンソール上で、gdbを直接使っても文字化けしないか
確かめればいいんじゃないかな。
・本当に問題を起こしている部分が特定できる。(Qt Creatorで)
・Qt Creatorの問題なのかがわかる。
エラーの原因を絞るためにこのことは有効だと思うけど。

324:323
09/10/24 18:11:36
もし、それでQt Creatorが原因でないと分かったのなら、
違うスレにもっと詳しい人がいるかもしれない。
そちらで聞くのもいいと思う。

325:デフォルトの名無しさん
09/10/24 18:30:30
>>314
debugging helper は enable?

326:デフォルトの名無しさん
09/10/24 19:30:58
>>319
QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent*)
やQGraphicsSceneMouseEvent::lastScenePos() を調べてみてはどうでしょうか。

327:322
09/10/24 19:57:56
大変失礼いたしました。
文字化け表示は別の原因だったみたいです。
ただ、
QString qpass = pass.c_str();
でqpassが正常表示だったためてっきり
改めて、この部分だけテストプログラム書いてみたら正常に表示されました。


328:デフォルトの名無しさん
09/10/24 23:59:41
>326
とりあえずQGraphicsView::mousePressEvent(QMouseEvent* event)で
if (QGraphicsItem *item = itemAt(event->pos()))
{
qDebug() << item->pos();
}
で追加したQGraphicsItemでゲットできることがわかりました。
ただ、item->pos()がおそらくView上でitemが追加された座標で(0, 0)となります。
知りたいのはitemオブジェクト内での座標なのですが、
これを知るには、QGraphicsItemから派生したクラスのmousePressEvent()をオーバーライドして、
座標を得るしかないのでしょうか。


329:デフォルトの名無しさん
09/10/25 01:49:42
>>328
>これを知るには、QGraphicsItemから派生したクラスのmousePressEvent()をオーバーライドして、
>座標を得るしかないのでしょうか。
それでいいと思うけど。
あとは、アイテムにアイテム用のイベントフィルターをシンストールするか。

330:329
09/10/25 02:01:16
訂正
>あとは、アイテムにアイテム用のイベントフィルターをシンストールするか。
あとは、アイテムにアイテム用のイベントフィルターをインストールするか。

アイテム用のイベントフィルターは、アイテムが他のアイテムのイベントをフィルターする
から、今の場合は役に立たないかも。

331:329
09/10/25 02:19:56
補足

基本的にビューは、ウィジットとしてアイテムやシーンにを描画する役目と、
シーンへイベントを伝える役目をになう。

だからビューのイベントハンドラーをオーバーライドしてするときは、
主に、見た目に関することや、イベントをシーンに伝える役目としての処理を
書けばいいと思う。
文字通りビューウィジットとしての役割。

シーンには、ロジカル座標を提供し、背景の設定を提供する。
アイテムのリストを持っていてこれを管理する。
またビューから伝達されたイベントをアイテムに伝える。
だから、シーンのイベントハンドラーをオーバーライドして、
アイテムの共通のイベントは、こちらで処理すればいいと思う。
シーンはQObjectだから、シーンQApplication::sendEvent()
で直接イベントを送ることもできる。

アイテムはそれぞれがそれぞれの振る舞いがあるから、
アイテム自身のイベントハンドラーをオーバーライドして、
そのアイテム独自の振る舞いはそこで書けばいいと思う。

332:329
09/10/25 02:23:58
訂正。いつも訂正ばかりでごめん。

>基本的にビューは、ウィジットとしてアイテムやシーンにを描画する役目と、
基本的にビューは、ウィジットとしてアイテムやシーンを描画する役目と、

>シーンはQObjectだから、シーンQApplication::sendEvent()
シーンはQObjectだから、シーンにQApplication::sendEvent()

333:329
09/10/25 03:33:00
>>329
本当にごめん。329を直してみた。

基本的にビューはウィジットとして、アイテムやシーンを描画する役目と、
シーンへ、イベントを伝える役目を担う。

だからビューのイベントハンドラーをオーバーライドしてすることは、
主に、拡大縮小などの見た目に関することを操作したり、イベントをシーンに伝える役目
としての処理を書けばいいと思う。文字通りビューウィジットとしての役割。

シーンは、ロジカル座標を提供し、背景の設定を提供する。
シーンはアイテムのリストを持っていてこれを管理する。
またビューから伝達されたイベントをアイテムに伝える。
だから、シーンのイベントハンドラーをオーバーライドして、
アイテムの共通の処理は、こちらで書けばいいと思う。
もちろん、その中でアイテムリストをイテレートして
アイテムのメソッドをコールしてもよい。
シーンはQObjectだから、シーンにQApplication::sendEvent()
で直接イベントを送ることもできる。

アイテムには、それぞれがそれぞれの振る舞いがあるから、
アイテム自身のイベントハンドラーをオーバーライドして、
そのアイテム独自の振る舞いはそこで書けばいいと思う。

334:デフォルトの名無しさん
09/10/25 08:28:58
Windowsでgccとvisual c++使ってQtビルドしてみたのだけど、
デモの動きはVCの方が明らかに早い。

335:デフォルトの名無しさん
09/10/25 08:58:06
>>334

同じく。>>74 で、VC++の方が速いのは、どうしてだろうか。

336:デフォルトの名無しさん
09/10/25 09:03:39
CよりJavaの方が早い、と同じ話
もしくはそれ以下としか思えない俺

バイナリサイズも同じソースかと疑いたくなるぐらい肥大するし

337:デフォルトの名無しさん
09/10/25 09:32:48
>>335です。間違えました。>>74 では、GCC の方が速いというのが分かりません。
VC++でビルドしたQtの方が、デモの動きが速いと見て分かります。

338:デフォルトの名無しさん
09/10/25 10:05:06
実際にQtに関してGCCの方が速かった、って人は出てないんだし、気にしないでいいんじゃね

339:デフォルトの名無しさん
09/10/25 10:05:56
>>337
>>74 はネタです。釣られないように。

340:デフォルトの名無しさん
09/10/25 10:09:55
そもそもGCCのほうが早いならQt CreatorがいちいちVCでビルドされてる理由がないしな

341:デフォルトの名無しさん
09/10/25 11:01:17
なんでVCビルド版をフリーで出してくれないの(><)

342:デフォルトの名無しさん
09/10/25 12:56:04
>>341
たぶんライセンスの関係じゃね?

343:デフォルトの名無しさん
09/10/25 15:38:35
既出かもしれませんが、QLineEditで日本語入力(ATOK)中にESCを押すとIME
ではなくダイアログを抜けるので、それまで確定した内容が消えてしまいます。
入力中だった文字はそのままの状態で消えたダイアログの親に行きます。

IME入力中のESCキーがIMEのウィンドウ?に飛ばず下のQDialog or QLineEditに
飛んでいるように見えますがが、回避するにはどこを見たらいいでしょうか。

344:デフォルトの名無しさん
09/10/25 15:43:34
>>343
WindowsとMac OS Xのどちらですか。

345:デフォルトの名無しさん
09/10/25 15:45:26
>>344
ATOKのLinuxもあるので、3つの内のどれでしょうか。

346:デフォルトの名無しさん
09/10/25 15:46:28
IME って Windows 用語でしょ。

347:デフォルトの名無しさん
09/10/25 16:02:11
SCIM-Anthy使ってるけどそんな事なったこと無いなぁ

348:デフォルトの名無しさん
09/10/25 16:08:30
Qt やるなら wxWidget のスレも読んだ方が良い

349:デフォルトの名無しさん
09/10/25 16:10:27
s が抜けた…

Qt やる人は wxWidgets のスレも見に行った方が良いよ

350:デフォルトの名無しさん
09/10/25 16:50:42
なんで?
Qtと比べたらwxとか使いにくくて仕方がないじゃん
知る価値ないと思う

351:デフォルトの名無しさん
09/10/25 16:53:03
>>343
QWidget(QDialogを含む)にフォーカス属性があるから、
このフォーカス関係の属性をセットすれば
いいのかもしれないんだけどよく知らないから、思いつく方法を列記する。

(1) QLineEditのカスタムクラスを書いてキーイベントをハンドルして
ESCキーのときは、accept()して、親ウィジットであるダイアログに
イベントを伝えないようにする。

(2) または、QLineEditにイベントフィルターをインストールして、
同様の処理をする。

(3) デザインフォーム(Qt DesignerまたはQt Creatorに組み込まれたもの)を使用しているのなら
QLineEditを格上げして、そこで同様の処理をする。

(4) あるいは、ダイアログのキーイベントをハンドルして、lineEdit->hasFocus()して、
QLineEditにフォーカスが当たっているときは、ESCキーに対してデフォルトの
振る舞いをしないようにする。

352:351
09/10/25 16:54:06
>>351 のつづき

(4)の例
void
Dialog::keyPressEvent(QKeyEvent* keyEvent)
{
if(keyEvent->key() == Qt::Key_Escape) {
if(ui->lineEdit->hasFocus()) {
keyEvent->accept();
}
} else {
QDialog::keyPressEvent(keyEvent);
}

}

(注意)
ちなみに、キャンセルボタンが配置されているときは、そのボタンがESCキーに対応している可能性もある。
ただし、QLineEditにフォーカスが当たっているときにどうなのかは未確認。

353:デフォルトの名無しさん
09/10/25 16:55:26
>>650
なんで?
wxと比べたらQtとか使いにくくて仕方がないじゃん

354:351
09/10/25 16:56:21
毎度すいません。訂正
>if(ui->lineEdit->hasFocus()) {
if(lineEdit->hasFocus()) {

355:デフォルトの名無しさん
09/10/25 16:58:18
>>350
そう毛嫌いせずに視野は広く持った方が良いよ。
まぁ見に行けば分かるさ。

356:デフォルトの名無しさん
09/10/25 17:01:28
>(4) あるいは、ダイアログのキーイベントをハンドルして、lineEdit->hasFocus()して、
>QLineEditにフォーカスが当たっているときは、ESCキーに対してデフォルトの
>振る舞いをしないようにする。

IME入力モードになってるときに限ることって出来ますか?

357:デフォルトの名無しさん
09/10/25 17:04:52
・何がしたいのか
・現状どうなっているのか
・それに対する自分の意見
・自分の環境は何なのか(OS,CPU,GPU)
・IMEを他のものにして同じ症状があるのかどうか、ないならそのIMEは何なのか。

・可能ならサンプルをアップローダーに。

このくらいは質問するなら情報として欲しいわ。

358:デフォルトの名無しさん
09/10/25 17:05:15
>>355
賛成。
それぞれに長所、短所あるから一概にいえないと思う。

359:デフォルトの名無しさん
09/10/25 17:09:27
wxスレなんてQtの話題が出て荒れてたような記憶しかないんだが
で、なんでいきなりwxの話題が出たの?
Qt Creatorが熟れてないとかそういう話題から?

360:デフォルトの名無しさん
09/10/25 17:10:45
>>359
wx スレを見に行けば分かる。

361:デフォルトの名無しさん
09/10/25 17:12:42
聞き逃げ?

362:351
09/10/25 17:14:21
>>356
インプットメソッドイベントをハンドルすればできそう。
inputMethodEvent()をオーバーライドすればよい。
ただ、私は使用したことはないので、具体的にどうすればいいかは
はわからない。

363:デフォルトの名無しさん
09/10/25 17:17:05
>>360
久々に見てきたが
IDE議論とwxの新IDE、あとはQt他ライブラリとの比較ぐらいしかこれといったものはなかった
もう少し具体的に書いてくれ

364:デフォルトの名無しさん
09/10/25 17:23:55
>>363
最新10レス位を見ただけでも何か気付くもんだと思うが…
別に謎なぞしてる訳じゃないから、本当に分からないならスルーしてくれ。
>>349を書いたのは親切心のつもりだったが、邪魔して悪かったな。

365:デフォルトの名無しさん
09/10/25 17:31:20
IMEがらみの話ってこと?

366:デフォルトの名無しさん
09/10/25 17:35:09
>>357
>IMEを他のものにして同じ症状があるのかどうか、ないならそのIMEは何なのか。
特にこれだと思う。ATOKが悪さをしているか、ATOKに渡すべきキーイベントを
Qtが食っているか。ATOK絡みでは、問題があったりするのか。

どっちも古めだけれど。

URLリンク(www.kde.gr.jp)

ATOK/一太郎 統合スレッド[ その2 ]
スレリンク(linux板)

367:デフォルトの名無しさん
09/10/25 17:41:53
>>366
こちらは、Debian GNU/Linux 上で Qt immodule/anthyで日本語入力しているけれど、
同じように、日本語入力中にESCを押すとダイアログが閉じるよ。

368:デフォルトの名無しさん
09/10/25 18:01:00
>>367
kinput2は、日本語入力中にESCを押してもダイアログが閉じませんでした。

369:デフォルトの名無しさん
09/10/25 18:15:11
QDialog::rejectをオーバーライドして
件のテキストボックスにフォーカスがある間はescを押してもQDialogのreject()が呼ばれないようにする
ってのはどうか
class なんか : public QDialog, ...
{
void reject() {
if (! lineEdit->hasFocus()) QDialog::reject();
}
};

参考:
Qt-interest Archive - QDialog and ESC
URLリンク(lists.trolltech.com)

370:デフォルトの名無しさん
09/10/25 18:19:57

あ、御免スルーして...

371:367
09/10/25 18:34:14
>>368
>>343 の意味を取り違えていたかもしれない。

>既出かもしれませんが、QLineEditで日本語入力(ATOK)中にESCを押すとIME
>ではなくダイアログを抜けるので、それまで確定した内容が消えてしまいます。
この「日本語入力中」というのは、変換確定前の日本語入力中ということなの。
それとも、日本語入力モードになっているときということなの。
>>367 で出る症状は後者のことをいっているので、
質問者が前者の意味のことをいっているのなら、
私の環境でもダイアログが閉じないということになる。
話をややこしくしてごめん。

372:デフォルトの名無しさん
09/10/25 18:58:27
>この「日本語入力中」というのは、変換確定前の日本語入力中ということなの。

です

373:デフォルトの名無しさん
09/10/25 18:59:10
>>371
文字列が確定しているときに、日本語入力モードかどうかに拘らず、ESCでダイアログ
が閉じてしまうということならば、普通の動作ではないでしょうか。

374:371
09/10/25 19:14:22
>>372
>です
やっぱり勘違いだったみたいね。ごめん。

>>373
>文字列が確定しているときに、日本語入力モードかどうかに拘らず、ESCでダイアログ
>が閉じてしまうということならば、普通の動作ではないでしょうか。
その通りです。勘違いしていました。

375:デフォルトの名無しさん
09/10/25 19:44:40
OKボタンがデフォルトボタンになっていると
変換中の文字を確定するときのenterで
入力枠に文字が入ると同時に(残りの枠が未入力でも)
ダイアログが確定してOKボタンを押したことになってしまいます

376:362, 367
09/10/25 19:48:08
>>356
QLineEditのカスタムクラスを書いて、inputMethodEvent()をオーバーライドし、
受け取ったイベントのevent->preeditString()が空かどうかで、
入力中かどうかが判断できるみたい。

また、こちら(Linux, qt immodule, anthy)では、日本語入力中(変換確定前)は、
途中でESCキーを押してもkeyPressEventは発生せず、inputMethodEventだけが発生した。
だからそちらも同じ動作ならinputMethodEvent()だけをオーバーライドすればいいと思う。

ただ、こちらの環境と違うし、ATOKの問題かもれないから、そちらの環境では、
日本語入力中にESCを押したときに、keyPressEventが発生しているかもしれない。
そのときは、keyPressEvent()もオーバーライドする必要があるかもしれない。
場合に依ってはフラグを立てて入力中かどうかを判断すればよい。

377:デフォルトの名無しさん
09/10/25 20:07:45
>>375
>OKボタンがデフォルトボタンになっていると
>変換中の文字を確定するときのenterで
>入力枠に文字が入ると同時に(残りの枠が未入力でも)
>ダイアログが確定してOKボタンを押したことになってしまいます

>>343 の人だよね。
こちら(Linux/X11)では、単に日本語入力の確定になる。
そしてもう一度Enterを押すとデフォルトボタンにより、ダイアログが閉じる。

378:デフォルトの名無しさん
09/10/25 20:28:02
キーボード壊れてんじゃね

379:デフォルトの名無しさん
09/10/25 21:27:25
>>346
MS-IMEはマイクロソフトの製品だけど。

> IME - Wikipedia
> URLリンク(ja.wikipedia.org)
> IMEはWindowsにおける用語であり、
> 広く文字入力のためのシステムを表す一般名称はインプットメソッドである。
> ただし、最近ではWindows以外のプラットフォームで使われるインプットメソッド
> (Mac OSの「ことえり」など)についてもIMEと呼ばれることがある。
> AndroidプラットフォームではWindows同様、IMEという用語を使用している。

うむ、微妙。


380:デフォルトの名無しさん
09/10/25 21:33:16
IME と呼ぶ人はほぼ Windows ユーザと考えてオケです。

381:デフォルトの名無しさん
09/10/26 10:42:48
Qt Creatorの一番したのバーに検索ボックスがありますよね
あれ、メソッドとか検索できて便利なんだけど
ついでに、変数も検索できないですか?


382:デフォルトの名無しさん
09/10/26 12:52:48
無理を承知の上でのQt初心者の質問です。

Windowsで,QMainWindowのウィンドウハンドル(HWND)を取得する方法ってないんでしょうか?
今まで他の開発環境で書きためたソースやライブラリでHWNDを引数やリターン値に持つ
WIN32 APIをかなり使っているので,楽に移植したいのです。

Qtの設計思想からOS依存するようなものは排除されているのもわかりますし,WIN32 APIの
代替となるような機能が用意されているようではあるんですが...

現在アクティブなウィンドウのハンドルならWIN32 APIの ::GetActiveWindow() で取得できましたが,
その他のウィンドウについては,::FindWindowEx()とか使って取得するしかないんでしょうか。


383:デフォルトの名無しさん
09/10/26 12:58:04
ありますが

384:382
09/10/26 12:59:29
>>383
質問する前にヘルプを探したんですが見つかりませんでした。
教えてください。

385:デフォルトの名無しさん
09/10/26 13:09:04
>>382
Qt-interest Archive - Qt 4.2.0: How to get HWND handle?
URLリンク(lists.trolltech.com)

WIdはWindowsではhwndだから、WId QWidget::winId() constを使うんだってさ

386:382
09/10/26 13:24:22
>>385
やってみたらうまく行きました。ありがとうございました。

387:デフォルトの名無しさん
09/10/26 16:08:56
>>381
できないんじゃないかな。

多分知っていると思うけど、現在開いているドキュメント以外を検索したいのなら。

「編集」メニューの「検索・置換」->「Find Dialog」や
「編集」メニューの「検索・置換」->「ディスク上のファイル」
などを選んで、複数のファイルの中の検索ができるからそれを使うしかないんじゃないかな。
検索結果は、Qt Creatorの中でリストアップされるので便利。
でもこれだと、変数限定というわけにはいかないけど。

ディスク内を検索するときは、ディレクトリを指定した方がいいよ。

388:デフォルトの名無しさん
09/10/26 23:19:11
>333
遅レスですが、レスありがとうございます。

>だから、シーンのイベントハンドラーをオーバーライドして、
>アイテムの共通の処理は、こちらで書けばいいと思う。
これを実践しようと思い、QGraphicsSceneから派生したPixmapSceneクラスを
つくり、mousePressEvent()を実装して、そこでマウスクリックされた論理座標を
得ようとしました。

class PixmapScene : public QGraphicsScene
{
public:
PixmapScene();

protected:
void mouseMoveEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event);
};
この書き方だと、マウスイベントが発生されないのですが、
どこが間違っているでしょうか?

389:デフォルトの名無しさん
09/10/26 23:26:23
virtual

390:デフォルトの名無しさん
09/10/26 23:33:00
>>388
Q_OBJECTマクロ書かないといけない。

class PixmapScene : public QGraphicsScene
{
Q_OBJECT
public:
PixmapScene();
//...

391:390
09/10/26 23:45:23
>>390 の続き

もう一つ
QGraphicsSceneのイベントハンドラーのほとんどは、
QGraphicsSceneEventから派生したイベントタイプのイベントを
ハンドルする。

lass PixmapScene : public QGraphicsScene
{
Q_OBJECT
//...
protected:
void mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent)
void mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent)
//...

QGraphicsSceneやQGraphicsItemは、qrealやQRectFなどの浮動小数点数型
の値で座標値を保持、計算する。

だから、自分でカスタムクラスを書く時は、これらの浮動小数点数型を使う。
ちなみに、一部の組込みのものを除いて、ほとんどのプラットフォームでは、
qrealはdoubleがtypedefされたも。

ただし、ユーザーとして使う時は、論理座標ということでint型などの値を
メンバー関数に渡してもよい。

392:390
09/10/26 23:54:53
訂正);が抜けていた。
void mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent);
void mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent);

分かっているとは思うけど、PixmapSceneからさらに派生させ、
その派生クラスでイベントをハンドルする場合には
PixmapSceneのイベントハンドラーにも
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent);
とvirtualをつけないといけない。

393:390
09/10/26 23:58:18
度々ごめん
誤)lass PixmapScene : public QGraphicsScene
正)class PixmapScene : public QGraphicsScene

394:デフォルトの名無しさん
09/10/27 00:06:04
>391, 392
virtualの件は承知しております。ご指摘ありがとうございます。

sceneのマウスイベントがうまく補足できません。
class PixmapScene : public QGraphicsScene
{
Q_OBJECT
public:
PixmapScene();

protected:
void mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent);
void mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent);
};

void PixmapScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent)
{
int x = mouseEvent->lastPos().x();
int y = mouseEvent->lastPos().y();
qDebug() << QString("into PixamapScene::mousePressEvent() (x, y) = (%1, %2)").arg(x).arg(y);
}
とかやってみましたが、コンソールに何も表示されません。
MainWindowでPixmapScene m_scene;として、
m_scene.addPixmap(QPixmap::fromImage(m_imge));
ui->graphicsView->setScene(&m_scene);
を行って、sceneをgraphicsviewにセットはしております。

何か根本的に理解が間違っているのか。。。

395:デフォルトの名無しさん
09/10/27 00:10:24
>>390
> Q_OBJECTマクロ書かないといけない。
イベントハンドラをオーバーライドするためだけならば、なくてもよいです。

>>392
> virtualをつけないといけない。
付けなくて付けたことになるので、付けなくてもよいです。

396:390
09/10/27 00:32:13
>>395
誤解していた。
ありがとう。

397:390
09/10/27 00:47:07
>>394
ちょっと原因が分からない。
こちらで確認した限りでは、394のコードで問題なくマウスプレスイベントがハンドルできた。

ただ、ハンドラーの中でQGraphicsScene::mousePressEvent()をコールした方がいいと思う。
そうしないとアイテムが配置されている時に、そのアイテムにイベントが伝わらなくなる。

void
PixmapScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent)
{
qreal x = mouseEvent->lastScenePos().rx();
qreal y = mouseEvent->lastScenePos().ry();
qDebug() << QString("PixamapScene::mousePressEvent() (x, y) = (%1, %2)").arg(x).arg(y);

QGraphicsScene::mousePressEvent(mouseEvent);
}

398:390
09/10/27 01:12:38
>>394
一つ思いついた。

GraphicsViewのmousePressEvent()をオーバーライドしているのに、
その中で基底クラスのQGraphicsView::mousePressEvent()を
コールしていないのが原因では?

グラフィックスシーンフレームワークでは、イベントは
QGraphicsView -> QGraphicsScene -> QGraphicsItem
の順番に伝えられるから。

399:デフォルトの名無しさん
09/10/27 06:50:56
Qtのネットワークに関しての質問です。

HTTPプロトコルを使って、Webサイトにアクセスするために、今まではQHttpとその周辺のクラスを使っていました。

しかし、QHttpのヘルプを見ると、Qt 4.4で導入された、QNetworkAccessManagerを使ったほうがよいと書いてありました。
確かにこちらだと、アクセスした後に返ってくる返答をQIODeviceを継承しているQNetworkReplyで受け取れるみたいで、使いやすそうでした。

そこで、こちらに移行しようと思い、書き直しているのですが、QHttpで実装していたときに、
headerを記述するために用いたQHttpRequestHeaderクラスの

QHttpRequestHeader::QHttpRequestHeader ( const QString & method, const QString & path, int majorVer = 1, int minorVer = 1 )

このメソッドの、request-URIを指定するpathや、protocol-versionを指定するmajorVerなどを
記述するものがQNetworkReplyクラスやその周辺クラスのQNetworkRequestクラスに見当たりません。
また、QHttp::setHost(...)のようなホストを指定するメソッドも見当たりません。

どうかご存知の方がおられましたら、ご教授お願いします。

400:デフォルトの名無しさん
09/10/27 07:09:43
QIODeviceを継承している

401:デフォルトの名無しさん
09/10/27 07:13:02
pathやhostはQNetworkRequestにQUrlで指定するんじゃないの?

402:399
09/10/27 07:44:54
>>401
できました!
自動でホストとパスを分けてくれるんですね。

他のところのバグもあってうまく行かず気づきませんでした。
どうもありがとうございました。


403:デフォルトの名無しさん
09/10/27 21:43:30
>390
void PixmapScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent)
に入ってくることができました。

がしかし、
mouseEvent->lastPos(), pos()など実行しても、(0, 0)しか返って来ません。
mouseEvent->scenePos()が目的としていた座標値のようです。

また、scenePos()がマイナスのところをクリックしても、上記イベントハンドラに来るみたいです。
てっきりそのscene内だけかと思ったら。。。

もう少しヘルプを読んでみます。ありがとうございました。

404:デフォルトの名無しさん
09/10/27 22:16:35
mousecapture

405:403
09/10/27 23:32:40
あと一息なのでお知恵を拝借いただけるとありがたいです。

MainWindow(QMainWindowから派生)
+ImageView(QGraphicsViewから派生)
+PixmapScene(QGraphicsSceneから派生)

MainWindowでui->graphicsView->setScene()でPixmapSceneオブジェクトを設定
という前提で、

void PixmapScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent)
上記イベントハンドラから、MainWindowのメンバ関数を呼びたいのですが、
どのようにしたらよいのでしょう?

PixmapSceneからImageViewのポインタをゲットできれば、
ImageViewからMainWindowのポインタを得て、MainWindowのメンバ関数を呼べるのでは
と考えております。

やりたいことに対して煩雑な気がするのですが、こんなものですかね。

406:デフォルトの名無しさん
09/10/27 23:38:07
>>403
>また、scenePos()がマイナスのところをクリックしても、上記イベントハンドラに来るみたいです。
>てっきりそのscene内だけかと思ったら。。。
シーンは論理座標を表現するクラスなので座標値としてマイナスもとる。

407:デフォルトの名無しさん
09/10/28 00:38:13
>>405
>あと一息なのでお知恵を拝借いただけるとありがたいです。
がんばれ。

>MainWindow(QMainWindowから派生)
>+ImageView(QGraphicsViewから派生)
>+PixmapScene(QGraphicsSceneから派生)

ちょっとクラスの構成や参照関係が見えないんだけど。
これらのクラスは、全てコードで書いたの?それともフォームエディタを使った?
フォームエディタを使ったのならMainWinodwの下に
セントラルウィジットしてQWidgetがあるはずなんだけど。
>>285 で指摘したようなことが必要になる。

それとも、ImageViewは、setCentralWidget()で指定した
セントラルウィジットなの?
PixmapSceneは、親オブジェクトを参照している、それともしてない?
その辺が分からないから一般論で回答する。

408:407
09/10/28 00:39:41
つづき

QWidgetには、親ウィジットをポインターとして参照させることができるから
もしコンストラクターなどで親ウィジットを参照させてないなら参照させるようにしてから
そのparentWidget()で親ウィジットを参照してqobject_cast<>()でキャストして
という処理を繰り返し、メインウインドウまで遡っていくか。

または
>>286 で指摘した方法などの代替案をとるとか。
などが考えられる。

また、シーンのカスタムクラスを書いているのならばMainWindowをポインターメンバーとして参照し、
コンストラクト時に渡すようにすればいいんじゃないかな。

QGraphicsSceneはQWidgetではなくQObjectを継承している、parent()で親オブジェクトを得て、
qobject_cast<>()でキャストする必要がある。

409:デフォルトの名無しさん
09/10/28 08:30:44
ググっていたら,いつの間にか「Qt Users Forum Japan」なるフォーラムが出来てる
のにたどり着いた。

URLリンク(qtusersforum.s2.zmx.jp)

ここもいいんだけど,ソースコード書くとインデントが無視されてしまうので,ソースコート
を書く必要がある場合は上の方が向いてるかも。
管理人がどんなプロフィールで,どんな背景で作られたかはわからんが。

410:デフォルトの名無しさん
09/10/28 11:34:49
Qtでマルチスレッドのデザインパターンの実装例がほしい。

411:デフォルトの名無しさん
09/10/28 11:52:00
>>410
pthread(POSIX Thread)のパターンが、そのまま使えない?

412:403
09/10/28 22:30:47
>407
MainWindowとImageViewはフォームエディタで作成
MainWindow上にQGraphicsViewを格上げ
QGraphicsSceneを派生したPixmapSceneを自作
PixmapSceneはMainWindowにメンバ変数としてインスタンス生成
PixmapSceneを派生する際、QGraphicsSceneがご指摘のとおり、
QObjectを引数とするコンストラクタしかなかったため、PixmapSceneの
イベントハンドラからMainWindowのメンバ関数へどうやってアクセスしたら
良いのだろうと悩みました。

繰り返しになりますが、PixmapSceneのインスタンス生成は、MainWindowの
メンバ変数としておりますが、この際、
PixmapScene::PixmaScene(QObject* parent) : QGraphicsScene(parent){}
とコンストラクタを定義して、
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow),m_pixmapscene(this) { ... }
PixmapSceneにMainWindowのポインタを渡しておき、PixmapScene::mousePressEventQGraphicsSceneMouseEvent* mouseEvent)
{
MainWindow* mainwindow = qobject_cast<MainWindow*>(parent());
qDebug() << mainwindow;
if (mainwindow != 0)
{
mainwindow->setPointToStatusBar(mouseEvent->scenePos().x(), mouseEvent->scenePos().y());
}
}
MainWindowのメンバ関数にアクセスすることができました。
どうもありがとうございました。
(長々と説明が下手ですいません。)
>>286のように、グローバルなアプリのポインタ使った方がスマートかなと思ったり。。。

413:デフォルトの名無しさん
09/10/28 22:45:29
>>410
サブスレッドからシグナルを送るとメインスレッドのスロットで捕捉されるので
スレッド間通信がすっげー簡単になるよ

414:デフォルトの名無しさん
09/10/28 23:08:30
>>412

>グローバルなアプリのポインタ使った方がスマートかなと思ったり。。。
MainWindowまでたどるのが大変なとき(遠いとき)は、有効。

415:デフォルトの名無しさん
09/10/29 01:24:46
>>413
まあ、そんなところの実装例が見たいんだよな。

4.6にはQFutureとかあるし、使い方も知りたい。

416:デフォルトの名無しさん
09/10/29 08:18:19
>>415
QFutureは、4.4からあります。

417:403
09/10/29 23:45:58
>408
>>286のようなコードに修正したいと思ったのですが、qAppはどこで生成されているものなのでしょう?

今現在main()は
int main(int argc, char *argv[])
{
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());

QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
このような感じです。(今見るとa, wとか適当な変数名。。)
QApplicationクラスを派生させて、getMainWindow()を追加するのはわかるのですが。


418:デフォルトの名無しさん
09/10/30 06:10:04
>>417

>408
>>286のようなコードに修正したいと思ったのですが、qAppはどこで生成されているものなのでしょう?

qAppは、/QTDIR/src/gui/kernel/qapplication.h内で定義されているマクロで、
次のようになっている。
#if defined(qApp)
#undef qApp
#endif
#define qApp (static_cast<QApplication *>(QCoreApplication::instance()))

マクロなのでコンパイルする前処理としてプリプロセッサがソースコードに
qApp
があると、その部分全てを
static_cast<QApplication *>(QCoreApplication::instance())
に(ソースコードとして)置き換えてくれる。
つまり、ソースコードにqAppと書いたら、そこにstatic_cast<QApplication *>(QCoreApplication::instance())
と書いたことと同じことになる。

それで、このQCoreApplication::instance()は、何かと言うと、QApplicationの基底クラスのQCoreApplicationで
定義されているstaticな関数で、アプリケーションのインスタンス(実例:メモリー上に実際に確保された変数)を指すポインターを返す。
つまり、アプリケーションを指すポインターを返す。

419:418
09/10/30 06:11:41
>>417

QApplicationのqApp [Macro]
URLリンク(doc.trolltech.com)

QCoreApplicationのinstanc() [static]
URLリンク(doc.trolltech.com)

>このような感じです。(今見るとa, wとか適当な変数名。。)

個人的な意見だけど、自分だけでプログラムするのなら、どんな名前でもいいんじゃないかな。
また、簡単な動作チェックなんかのときなどは、いちいち名前なんて考えてられないし。

でも、プロジェクトとかに参加して、ネーミング規約があるのならばそれに従わなければならないし、
他の人が見るものは、ある程度わかりやすくした方がよいと思う。

そして、その”他の人”というのは、数年後の自分である可能性がある。
そうすれば何年も前に書いた、規模の大きい、もう内容を忘れてしまったコードを見たときに、どんな処理をしているか把握するための
手助けになる。

だから普段から、ある程度はわかりやすい名前を付ける癖を付けておいた方がいいと思う。
個人的な意見だから気に障ったらごめん。

420:デフォルトの名無しさん
09/10/30 20:43:18
QtCreatorが動かん、ハングアップする……と悶々としてたがAvast切ったら改善された。何故。
悩む人がいるかもしれないから参考までに……

421:デフォルトの名無しさん
09/10/30 21:33:21
>418
詳しく説明していただきありがとうございました。

変数名についてですが、たぶんMainWindowのexampleのmain.cppを
そのまま持ってきた気がします。
自分で書くなら、ループ変数、局所的なテンポラリ変数以外に一文字
というのはあまり使いません。

ちなみに、Qtは初めて間もないです。MFCとかC++/CLIとか趣味でやっていましたが、
どちらも中途半端な気がしており、マルチプラットフォームで純粋なC++であるQtに
興味を持った次第です。

422:デフォルトの名無しさん
09/10/30 22:21:39
>>421
>変数名についてですが、たぶんMainWindowのexampleのmain.cppを
>そのまま持ってきた気がします。
>自分で書くなら、ループ変数、局所的なテンポラリ変数以外に一文字
>というのはあまり使いません。
言い過ぎた気がするので、謝ります。ごめんなさい。

>ちなみに、Qtは初めて間もないです。MFCとかC++/CLIとか趣味でやっていましたが、
>どちらも中途半端な気がしており、マルチプラットフォームで純粋なC++であるQtに
>興味を持った次第です。
どっぷりとQtの世界につかってください。
これもおせっかいかも(^_^;)。

423:403
09/10/31 00:11:27
>422
>言い過ぎた気がするので、謝ります。ごめんなさい。
全く気にしておりませんよw

ちなみに、>286のようにQApplicationの派生クラス(Application)にgetMainWindow()という
MainWindowのポインタを取得できる関数を追加する場合、
MainWindowのポインタ自体をセットするのはどのようにするものでしょうか?

自分が考えるところでは、派生クラスApplicationにsetMainWindow(MainWindow* mainwindow);を
追加して、main()で
{
Application app(argc, argv);
MainWindow mainwindow;
mainwindow.setMainWindow(&mainwindow);
mainwindow.show();

return app.exec();
}
とやるくらいしか思いつかないのです。

424:デフォルトの名無しさん
09/10/31 00:33:56
>>423
それでいいと思うけど。

>mainwindow.setMainWindow(&mainwindow);
app.setMainWindow(&mainwindow);
だね。

425:デフォルトの名無しさん
09/10/31 08:35:26
>424
ありがとうございます。

>app.setMainWindow(&mainwindow);
easy missでした。

ちなみにQApplicationの派生クラスを作る際に気をつけることって
ありますか?
リンカから
undefined reference to vtable for Application
と怒られました。(ApplicationはQApplicationの派生)
コンストラクタは
Application::Application(int argc, char* argv[]) : QApplication(argc, argv) {}
としております。

426:デフォルトの名無しさん
09/10/31 08:43:13
>425
自己解決しました。
URLリンク(randt.jp)
qmakeを再実行してリビルドしたら大丈夫でした。
すべてリビルドはやっていたのですが、qmakeの再実行はすべてリビルドに
入ってないのか。

427:デフォルトの名無しさん
09/10/31 09:21:01
>>425 >Application::Application(int argc, char* argv[]) : QApplication(argc, argv) {} Application::Application(int &argc, char* argv[]) : QApplication(argc, argv) {}

428:デフォルトの名無しさん
09/10/31 15:13:45
>>425

> コンストラクタは
> Application::Application(int argc, char* argv[]) : QApplication(argc, argv) {}
> としております。

Application::Application(int &argc, char* argv[]) : QApplication(argc, argv) {}

&argc としないと落ちることがあります。

429:デフォルトの名無しさん
09/10/31 23:10:50
>428
QApplicationのリファレンスを見ると、コンストラクタはargcが参照型なのですね。
ご指摘ありがとうございました。

430:デフォルトの名無しさん
09/11/03 19:37:10
QFileDialogで、ダイアログのみのフィルタって掛けられますか?


431:デフォルトの名無しさん
09/11/03 20:45:42
>>430
意味が分からないんだけど。
具体的に言うとどういうこと?

432:デフォルトの名無しさん
09/11/03 20:55:18
>>430
質問しているのは、ファイルのフィルタじゃないよね?

433:430
09/11/03 21:05:32
えっと、すいません
X ダイアログ
○ ディレクトリ
でした



434:デフォルトの名無しさん
09/11/03 21:38:34
>>433
ディレクトリのフィルタはできるよ。

static関数のgetExistingDirectory()を使用するか、オプションとしてQFileDialog::ShowDirsOnlyを
指定すればよい。

参考:
URLリンク(doc.trolltech.com)



435:デフォルトの名無しさん
09/11/03 22:03:56
QMainWindowでshow()が実行される直前に呼ばれるイベントハンドラはないでしょうか?
以下のソースで、引数つきで実行された場合(argc>1)の引数の処理をMainWindow内で
したいと考えています。

int main(int argc, char *argv[])
{
Application app(argc, argv);

MainWindow mainwindow;

mainwindow.show();

return app.exec();
}

436:デフォルトの名無しさん
09/11/03 22:25:04
>>435
show()を後からコールすればいいだけなんじゃない?

437:デフォルトの名無しさん
09/11/03 22:42:10
>436
たしかにそれでも可能です。
(MainWindowのコンストラクタで処理しても良いとも思います)
あと、main()にあまりたくさん記述したくないなぁというつまらない理由でもあります。

MFCや.NETでフォームとかダイアログが生成されたときに、
一度だけ呼ばれる関数があったので、Qtでもそのようなものが
あるのかなと思い、お伺いしました。

438:デフォルトの名無しさん
09/11/03 22:46:01
QMainWindow を継承して MainWindow 創ったんなら
MainWindow::show() の中で

hogehoge;
this->show();

とすればよかろう

439:デフォルトの名無しさん
09/11/03 22:57:55
>>437
その処理をするメンバー関数を定義して、そのメンバー関数をコンストラクターからコールすればいいのではないかな。
そして、そのメンバー関数からshow()をコールすればいい。

あるいは、メインにQObjectを継承したカスタムクラスPreprocessのオブジェクトを作ってそれに引数に対する処理をさせてはどう?
そして、そのオブジェクトのシグナルとMainWindowオブジェクトのshow()スロットでつなげるとか?



440:デフォルトの名無しさん
09/11/03 23:18:13
>>435
処理の内容にもよるのかもしれないけれど、アプリケーションのカスタムクラスで
コマンド引数に対する処理をしたほうが自然な気がするけど。

441:430
09/11/04 07:09:52
>>434
ありがとうございました。

442:デフォルトの名無しさん
09/11/04 08:14:05
・・・無限ループ?

443:デフォルトの名無しさん
09/11/05 10:19:59
℃-uteのファンだから、Qt使うことにしようかな?( ・ω・)y─┛~~

444:デフォルトの名無しさん
09/11/05 22:52:16
ど……どうて?

445:デフォルトの名無しさん
09/11/07 14:55:22
Qtのなるべく新しい日本語ドキュメントってどれでしょうか?

4みたいだけど、あまり日本語化されていない。
URLリンク(qt.linux-life.net)

結構日本語化されているけど、2.3.2。
URLリンク(www.kde.gr.jp)

これぐらいでしょうかねぇ。

446:デフォルトの名無しさん
09/11/07 15:12:29
きっと非公式のは期待してないんだよね

447:デフォルトの名無しさん
09/11/07 15:36:12
いえ、非公式のでもいいです。

448:デフォルトの名無しさん
09/11/07 22:57:41
Qtの正規表現で最短一致を表現したいのですが、どうしたらいいのでしょうか。
Perl5では(.+?)で出来るそうなのですが、Qtでは出来ないようでした。

Key=Value
で、Valueに=が含まれる場合に、Key側を最短にしたいです。

正規表現使わない方法もありますが、正規表現使ってシンプルに実装したいです。



449:デフォルトの名無しさん
09/11/07 23:22:49
perlの性器表現を標準だと思わない方が良い
スレリンク(unix板)
スレリンク(tech板)
スレリンク(tech板)

450:デフォルトの名無しさん
09/11/07 23:37:33
最短マッチにしたいならQRegExp::setMinimal(true);
ただ(.+)も最短マッチになったはず

451:デフォルトの名無しさん
09/11/08 00:05:34
449,450 ありがとうございます。

すみません、QRegExp::setMinimal(true); も試してだめだったの忘れてました。
Key=Value を
QRegExp rxKey("^(.+)=(.*)$");
rxKey.setMinimal(true)
とやっても、Key側にイコールが入ってしまいます。

452:デフォルトの名無しさん
09/11/08 00:39:09
QRegExp rxKey("^(.+)=(.*)$");
rxKey.setMinimal(true);

rxKey.indexIn("Key=Value\n");
qDebug() << rxKey.cap(1);


普通にこれで切り出せるけど

453:デフォルトの名無しさん
09/11/08 00:46:16
QRegExp rxKey("^([^=]+)=(.*)$");
じゃだめ?

setMinimal は全体を最短にするだけで、各要素を最短でとるわけではないっぽいな。

454:デフォルトの名無しさん
09/11/08 09:54:35
URLリンク(qt.gitorious.org)
のページにある様にgitで

git clone git://gitorious.org/qt/qt.git

Qtを落としてきたら、なぜかインストール先が

/usr/local/Trolltech/Qt-4.7.0

になってた
……4.6.0betaのハズなんだけど

455:デフォルトの名無しさん
09/11/08 12:08:34
QImageとかQPixmapを使うときに、QPixmap::fromImage(const QImage&)が値渡しで返ってくるのですが、
入力のQImageと出力のQPixmapは別々の領域に確保されるんでしょうか?

Implicitly Shared Classesの話がそうなのだと思うのですが、いまいち理解できなくて。

QImage img1, img2;

img1.load(filename);

img2 = img1;

みたいに使っても問題ないということなのでしょうか。
いちいちポインタを使うものではないですか?


456:デフォルトの名無しさん
09/11/08 14:22:05
URLリンク(gihyo.jp)

457:デフォルトの名無しさん
09/11/08 14:27:40
>>455
>>456の「子ウィジェットの自動メモリ解放に関連して~」 辺りを。

>Implicitly Shared Classesの話がそうなのだと思うのですが、いまいち理解できなくて。
その通りでISCが関連します。
>みたいに使っても問題ないということなのでしょうか。
問題ないです。
>いちいちポインタを使うものではないですか?
ポインタを使わないようにするものです。

458:デフォルトの名無しさん
09/11/08 15:02:31
>457
レスありがとう。

仮に、
QImage img1, img2;

img1.load(hoge1);
img2.load(hoge2);

img2 = img1;
とした場合、img2は、hoge2の画像データを自動で内部deleteして、
img2もimg1もhoge1の画像を指すようになるんですよね?
そして、img1かimg2どちらかに何らかの操作が行われた場合、初めてimg1のデータがimg2と
別々の領域になるように(内部の画像データコンテナだけだと思うが)、裏でコピー処理が行われる
という理解で良いのでしょうか。

459:デフォルトの名無しさん
09/11/08 15:35:14
>>458
その通りです。


460:デフォルトの名無しさん
09/11/08 19:13:58
>>454
master系のブランチは既に4.7向けになってる。
4.6系のソースが欲しいなら 4.6 / 4.6-stable 等の
4.6系のブランチを checkout する必要がある。

461:デフォルトの名無しさん
09/11/09 00:54:58
イベントを受け取ったときに、QLabelのテキストの色を変化させたいのですが、
どのように変えればいいのでしょうか?


462:デフォルトの名無しさん
09/11/09 01:05:29
Q_SLOTSってなに?

463:デフォルトの名無しさん
09/11/09 03:12:57
>>461
たとえばこんな感じ
QPalette labelPalette = label->palette();
labelPalette.setColor(QPalette::WindowText, Qt::red);
label->setPalette(labelPalette);

464:デフォルトの名無しさん
09/11/09 03:57:13
>>462
Qt以外のライブラリでQtの”シグナルとスロット”と同様の機能があり、
そのライブラリでslotsていうキーワードが使用されているようなときに使用する。
このマクロはboostライブラリとQtを一緒に使用できるようにするために、
Qt4.1で導入された。

いつもは

public slots:

などと書いているQtのスロット部分に

public Q_SLOTS:

と書けばよい。

ほかにも、Q_SIGNALS、Q_SIGNAL、Q_SLOT、Q_EMITがある。

URLリンク(qt.nokia.com)


465:デフォルトの名無しさん
09/11/09 10:24:40
>>463
ありがとう出来た。
labelからQPalette取り出せば良かったのか。

ただ、デバッグビルドだと色変えた時にランタイムエラー出るのに、
リリースビルドだとすんなり動いた何故なんだ・・・。

466:デフォルトの名無しさん
09/11/09 13:40:34
>>464
オマエ、イイヤツ

467:デフォルトの名無しさん
09/11/09 17:46:02
Phononってさ、WindowsではDirectX、MacOSXではQuickTime、LinuxではGStreamerだけを使うの?
いろいろ調べると、Phonon自体はWindowsでVLCバックエンドとかMPlayerバックエンドを使えるみたいなんだけど、
qtからじゃ変える方法があるのかないのかよくわかんない。

たまにDirectXのコーデックじゃうまくいかないことがあるから、
プレイヤーからVLC使って再生とかMPlayer使って再生とかしたかったんだけど。


qtは単にPhononを利用しているだけ。だけどqtが利用しているPhononに
Windowsだと、DirectX以外のバックエンドサポートプラグインを加えてないってことなのかなぁ?

理屈上は、VLC or MPlayerサイトで配布されているphonon-backendを加えて
qtのSDKを再コンパイルすると使えるようになるという話なのだろうか?

468:デフォルトの名無しさん
09/11/09 17:54:05
お、ちょっとわかった。

QTのライブラリの中にplugins\phonon_backendってディレクトリがあって
そこに、phonon_ds94.dllとかあった。
もしVLCバックエンドを使うとしたらphonon_vlc.dll?とかいうファイルを入れるわけだな。
これを作れるのかどうか、どうやって作るのか、作った後の切り替え方はしらないけど。

ちなみに、他に興味がある人のために説明しておくと、phonon_backendは
MSVC使って自分でコンパイルしたやつにしかない。つまり普通に配布されているmingw版には存在しない。
mingw版ではDirectShowあたりがコンパイルできないからPhononサポートしてないんだと。

469:デフォルトの名無しさん
09/11/09 20:25:18
Phononよか4.6の新機能に期待
Video関連はまだスケルトン状態だけどな・・・

470:デフォルトの名無しさん
09/11/09 20:48:45
4.6の新機能ってなに?

471:デフォルトの名無しさん
09/11/09 21:54:14
>>470
URLリンク(qt.nokia.com)


472:デフォルトの名無しさん
09/11/09 22:15:59
あー最新の日本語ドキュメントが見たい

473:デフォルトの名無しさん
09/11/10 11:38:55
4.6はQWebElementとQStateMachineに個人的に期待している

474:デフォルトの名無しさん
09/11/10 16:31:14
Qt Creatorの日本語化する手順について、ご存じの方がいらっしゃいましたら御教授お願いいたします。
環境は以下の通りです。
OS Windows7 64bit版
Qt qt-sdk-win-opensource-2009.04.exe
Qtインストール先 C:\Qt


475:デフォルトの名無しさん
09/11/10 21:13:57
>>474
URLリンク(qt-creator-jp.sourceforge.jp)
このサイトに書いてある
『qtcreator_ja.qm ファイルを複製して
qt_ja_JP.qm にリネームする事で日本語化させる事も可能です。』
自分は上の通りにやったら日本語化された

476:デフォルトの名無しさん
09/11/10 22:15:43
>475
レス感謝です。バッチリ日本語化されました。
ありがとうございました!!!


477:デファルトの名無しさん
09/11/11 22:49:34
Ubuntu QtCreator
先日Ubuntu9.10にバージョンアップしたら、ボタンのテキストに日本語が使えなくなりました。
どおして?


478:デフォルトの名無しさん
09/11/11 23:46:07
QToolTipでツールチップの消える時間を制御できる方法はあるでしょうか?
mouseMoveEvent()でツールチップを表示しているのですが、マウスを止めていても、
ツールチップを表示させたままにしたいのです。

479:デフォルトの名無しさん
09/11/12 07:19:28
>>477
こちらはDebian GNU/Linuxで、Ubuntuの9.1のパッケージのQt Creator1.2.1を
ダウンロードして使ってみたけど、ちゃんと日本語が表示できたよ。

うまくいかないようなら、Nokia Development Frameworksのウェブサイトから
インストーラー付きのQt Creator1.2.1がダウンロード出きるから
それを入れてみるのもいいんじゃない?
でも、Qt Creatorが原因ではないときには、同じ症状になるかも知れないけど。

URLリンク(qt.nokia.com)

480:デフォルトの名無しさん
09/11/12 18:47:11
>>478
もっといい実装があると思うけど、下記のコードで実現可能。

enterEvent()、leaveEvent()ハンドラーをオーバーライドして、
マウスポインターがウィジットの中にあるかどうかを表すm_IsEnteredの値をセットし、
QTimerを使って、アイドル時にQHelopEvent(QEvent::QToolTip,..)
を発生させている。
そして、event()ハンドラーをオーバーライドして、QHelpEventのtype()がQEvent::QToolTipの時に、
ツールチップを表示するようにしている。
下記のコードでは、0.5秒毎にQHelpEvent(QEvent::QToolTip,..)を発生させている。

class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
bool event(QEvent* event);
void enterEvent(QEvent* event);
void leaveEvent(QEvent* event);
void mouseMoveEvent(QMouseEvent* mouseEvent);
private slots:
void sendToolTipEvent();
private:
bool m_IsEntered;
QTimer* m_TipTimer;
};

481:480
09/11/12 18:48:20
つづき

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), m_IsEntered(false),
m_TipTimer(0)
{
setToolTip("Tooltip");
setMouseTracking(true);
m_TipTimer = new QTimer(this);
m_TipTimer->setInterval(0.5 * 1000);
connect(m_TipTimer, SIGNAL(timeout()), this, SLOT(sendToolTipEvent()));
resize(800, 500);
show();
}

bool MainWindow::event(QEvent* event)
{
QHelpEvent *helpEvent = static_cast<QHelpEvent*>(event);
if(helpEvent) {
if(helpEvent->type() == QEvent::ToolTip) {
QToolTip::showText(QCursor::pos(), toolTip());
return true;
}
}
return QWidget::event(event);
}

482:480
09/11/12 18:50:17
つづき
void MainWindow::enterEvent(QEvent* event)
{
m_IsEntered = true;
if(m_TipTimer and !m_TipTimer->isActive()) {
m_TipTimer->start();
event->accept();
}
QMainWindow::enterEvent(event);
}
void MainWindow::leaveEvent(QEvent* event)
{
if(m_TipTimer and m_TipTimer->isActive()) {
m_TipTimer->stop();
}
m_IsEntered = false;
event->accept();
QMainWindow::leaveEvent(event);
}
void MainWindow::mouseMoveEvent(QMouseEvent* mouseEvent)
{
Q_UNUSED(mouseEvent);
QToolTip::showText(QCursor::pos(), toolTip(), this, frameGeometry());
}
void MainWindow::sendToolTipEvent()
{
if(m_IsEntered == true) {
QHelpEvent toolTipEvent(QEvent::ToolTip, mapFromGlobal(QCursor::pos()), QCursor::pos());
QCoreApplication::sendEvent(this, &toolTipEvent);
}
}

483:480
09/11/12 18:54:22
訂正、event()内のshowText()の引数
誤)QToolTip::showText(QCursor::pos(), toolTip());
正)QToolTip::showText(QCursor::pos(), toolTip(), this, frameGeometry());


484:デフォルトの名無しさん
09/11/12 19:44:15
ドラッグ&ドロップを実装しようと思っているんだけど、
ウインドウに乗せたリストビューだけに反応させたい。
この場合、リストビューを継承したMyListviewを作らないといけないのかな?

そのMyListviewをQt Creatorでグラフィカルに使うために
パッケージ?みたいな変なものを作らないといけないのだろうか?

485:デフォルトの名無しさん
09/11/12 20:35:57
>>484
>ドラッグ&ドロップを実装しようと思っているんだけど、
>ウインドウに乗せたリストビューだけに反応させたい。
>この場合、リストビューを継承したMyListviewを作らないといけないのかな?

コードで書くのならば、それが一番素直な気がする。
あとは、イベントフィルターをインストールするとか。

Qt CreatorのGUIフォームエディタ、Qt Desingerなんかで、既に配置したQListView何かに
カスタムな振る舞いを追加したいのならば、「格上げ」でソースを追加することができる。
ソースは、通常のカスタムクラスを書くように、ヘッダと実装ファイルを用意する。

486:485
09/11/12 20:36:44
つづき

>そのMyListviewをQt Creatorでグラフィカルに使うために
>パッケージ?みたいな変なものを作らないといけないのだろうか?

この意味がよく分からないんだけれど?

Qtには、View/Modelフレームワークと呼ばれるViewがあり、
具体的にはQTableView、QTreeView、QListViewなどである。
これらはたぶんGUIでアイテムとかは配置できない。
こちらは、View-Control/ModelとDelegateを組み合わせて使用する。
柔軟性が高い。一つのモデルに対して二つのビューで表現させたりできる。
だけど、ちょっとしたものを表示するだけなら
下記のViewを使用するのがいいかもしれない。

もう一つQListWidget、QTreeWidget、QTableWidetというViewがあり、
こちらは、アイテムをGUIで配置できる(制限はあるとは思うけど:あまり使用したことがないのでよく知らない)。
これらは、Qt3に用意されていたViewと同様の機能を提供する。
大概のものはこれで間に合うので、こちらを使用するのもよい。

487:デフォルトの名無しさん
09/11/12 20:38:36
わからないなら解凍しないでください

488:デフォルトの名無しさん
09/11/12 20:41:31
パッケージ?ってのは、ようするにMyListviewを
Qt CreatorのGUIパーツ置き場に起きたいって事。
そこからpush button見たいにフォームにドラッグ&ドロップして
大きさ変えたり、右のプロパティウインドウでいじれるようにしたいってこと。

489:デフォルトの名無しさん
09/11/12 20:56:06
>>488
ありがとう。理解できた。

490:デフォルトの名無しさん
09/11/13 06:22:27
>>488
Qt Designerのプラグインを作ればできますよ。

URLリンク(doc.trolltech.com)

491:デフォルトの名無しさん
09/11/13 06:28:50
>>486
> もう一つQListWidget、QTreeWidget、QTableWidetというViewがあり、
> こちらは、アイテムをGUIで配置できる(制限はあるとは思うけど:あまり使用したことがないのでよく知らない)。
> これらは、Qt3に用意されていたViewと同様の機能を提供する。
> 大概のものはこれで間に合うので、こちらを使用するのもよい。

Q*Widgetは、そのままの機能使うだけならば、手軽に使えるのだけれど、
例えば、内部にモデルを抱えていて、差替えができなくて苦しくなったりするので、
機能を追加しようというなら、できるだけQ*Viewを使う方がよいと思う。

492:デフォルトの名無しさん
09/11/13 16:01:52
Model/Viewを使えるのって、
ListView/TreeView/TableView/ColumnView のViewシリーズのほかに何があるのかな?

ComboBoxでも使えるってのはわかった。
でもLabelやTextEditでは使えないのだろうか?

最近データベース関係やってないから忘れているんだが、
VisualStudioのADO見たいに、フィールドに連結して
値を入れたり表示したりってのを簡単にできないのだろうかと思っているのだが。

Modelからシグナルが発生するようなので、
それを使ってLabelやTextEditに手動で入れるという方法があるというのはわかる。
ただ、setModelみたいにモデルと連結するだけでできる方法があるのかという話。

493:デフォルトの名無しさん
09/11/13 21:10:19
>>492
QDataWidgetMapperはどうですか。
URLリンク(doc.trolltech.com)

494:デフォルトの名無しさん
09/11/13 22:05:12
ふう、やっとModel/Viewの具体的な書き方がわかった。
「入門Qt4プログラミング」は必須だな。

QDataWidgetMapperはこの本に載ってないなぁ・・・
ぱっとみ望んだものっぽいのでがんばってみる。

495:デフォルトの名無しさん
09/11/13 23:43:08
>480
コードまで書いてくれてありがとう。
ToolTipについてよく理解できてないのですが、
QMainWindow::setToolTip()を使ったら思い通りの動作になってくれました。


496:デフォルトの名無しさん
09/11/14 00:16:56
【科学】道路に軍手が落ちているワケ、名城大研究チームが突き止める[09/11/05]

スレリンク(hidari板)




497:495
09/11/14 00:46:39
できたできたw

代入コード書いてないのに、QListViewとQComboBoxとQLineEditとQLabelが
全部一緒に変更されるの面白いねw

QLabelの場合、mapper->addMapping(ui->label,0,"text");って
三番目の引数に"text"を指定しなければ表示されなかったので注意。

これで、GUIコードを減らして、GUIの変更にも強いコードが書けるかな。

498:デフォルトの名無しさん
09/11/14 11:11:19
>>497
>QLabelの場合、mapper->addMapping(ui->label,0,"text");って
>三番目の引数に"text"を指定しなければ表示されなかったので注意。

QLabelにはUSER属性がtrueなプロパティがないからです。

QLineEdit
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged USER true)

QLabel
Q_PROPERTY(QString text READ text WRITE setText)

ない理由は、

URLリンク(doc.trolltech.com)

The USER attribute indicates whether the property is designated as the user-facing
or user-editable property for the class. Normally, there is only one USER property
per class (default false). e.g., QAbstractButton::checked is the user editable property
for (checkable) buttons. Note that QItemDelegate gets and sets a widget's USER property.

499:デフォルトの名無しさん
09/11/14 11:31:21
>>498
おお。そっか。プロパティについては本に載っていたから
あとで調べるつもりだったけど、毎度、丁寧に書いてくれてありがとw

500:デフォルトの名無しさん
09/11/14 17:10:56
dockされているQDockWidgetのメインウィンドウとの境界線部分を右クリックすると
デフォルトコンテキストメニューが表示されてしまうのですが、このコンテキストメニューはどこで変更できますか?

501:デフォルトの名無しさん
09/11/14 17:16:37
Qt Creatorの狭さはどうにかならないのか・・・

502:デフォルトの名無しさん
09/11/14 19:18:26
>>500
QMainWindow::createPopupMenu()

503:デフォルトの名無しさん
09/11/14 20:39:38
>>501
ディスプレイを大きくする。Visual Studioでと同じ悩み。

504:デフォルトの名無しさん
09/11/14 20:40:39
>>502
この関数をオーバーライドすればいいんですね
ありがとうございました

505:デフォルトの名無しさん
09/11/14 21:09:21
Qt Conferenceがアナウンスされてたので是非参加したいのだが、
14日は出張なので行けそうにないなぁ。

506:デフォルトの名無しさん
09/11/15 18:31:19
Qtを使ったことがないのですが、
Qt creator と Qt Designer の2つのRADが提供されているのですか?

507:デフォルトの名無しさん
09/11/15 19:50:09
Creator:コーディング用
Designer:ポトペタ用

508:デフォルトの名無しさん
09/11/15 19:50:36
>>506
Qt Designerは文字通りGUIのデザインだけしてXML形式のリソースファイル(?)を出力する
だけのGUIデザイナ。

Qt CreatorはQt Designerにコンパイル/リンク/デバッグの機能を含むIDEを統合
(統合の統合で言葉が変だけど)した本格的RADツール。

509:デフォルトの名無しさん
09/11/15 19:57:31
相変わらずリストビュー系(QListWidget)は高機能な分、
難しいね。Qtに限らずだけど。

QListWidgetでドラッグ&ドロップやろうとしたんだけど少しはまった。
普通のやり方と微妙に違うんだね。
URLリンク(doc.trolltech.com)


510:デフォルトの名無しさん
09/11/15 20:26:53
普通とは?

511:506
09/11/15 20:39:17
>>507-508
なるほど。
つまり
 RADとしてQt Creatorが提供されていて、
 ただその一部分の機能だけをQt Designerという形で
 使用することができる
と言う認識で宜しいでしょうか?



512:デフォルトの名無しさん
09/11/15 21:57:05
前までは、Qt Designerだけだった。
やっとQt Creatorができた。

513:デフォルトの名無しさん
09/11/15 22:03:12
>>512
そうだったのですか。

じゃあ私が使い始めようと思ったのは
きっと良い時期なのですね。


514:デフォルトの名無しさん
09/11/15 22:04:54
>>511
URLリンク(doc.trolltech.com)
The goal of Qt Creator is to provide a cross-platform, complete Integrated
Development Environment (IDE) to develop Qt projects. It is available for
the Linux, Mac OS X and Windows platforms.

URLリンク(doc.trolltech.com)
Qt Creator is fully integrated with Qt Designer to help you design user interface
forms just like you would with the standalone version. The Qt Designer integration
also includes project management and code completion. For more information
on Qt Designer, you can refer to The Designer Manual.

URLリンク(doc.trolltech.com)
Qt Designer is Qt's tool for designing and building graphical user interfaces (GUIs)
from Qt components. You can compose and customize your widgets or dialogs
in a what-you-see-is-what-you-get (WYSIWYG) manner, and test them
using different styles and resolutions.

515:デフォルトの名無しさん
09/11/15 22:08:42
>>513
Qt Designerは、Qt 2の頃からありますね。

URLリンク(doc.trolltech.com)

Qt Creatorは、今年から。

516:デフォルトの名無しさん
09/11/15 22:30:52
>>515
楽しみになって来ました。
いじってみようと思います。

ありがとうございました。スレリンク(cchara板:902番)


517:デフォルトの名無しさん
09/11/15 22:34:29
いえいえどういたしまして。

【ぬらりひょんの孫】花開院ゆらスレ9【責め9に耐えて】
スレリンク(cchara板)

902 名前:名無しかわいいよ名無し[sage] 投稿日:2009/11/15(日) 22:19:49 ID:76U3ufnFO
>>901
竜二兄さんは逮捕されなかったから大丈夫

518:515
09/11/15 22:41:52
何ですかね?
この表示のバグは?

サーバーがおかしくなったんでしょうか?

519:デフォルトの名無しさん
09/11/16 00:35:12
QListViewでドラッグ&ドロップはさらに面倒だった。
モデル側にごちゃごちゃ書かないといかんのだな。
設計の理由はわかるんだが。

520:デフォルトの名無しさん
09/11/16 02:33:12
Qt CreatorでVisualC++のコンパイラが使いたい

521:デフォルトの名無しさん
09/11/16 02:56:56
>>520
SDKやバイナリパッケージではなく、Qt Creatorをソースからインストールすれば使えます。
来月出る1.3では、jomでの並列コンパイルでコンパイル時間も短縮。

522:デフォルトの名無しさん
09/11/16 06:32:51
Qt Creator 1.3βをVC++ 2008やSDK V6.1でビルドしてみたけど、最後の方になって「~のメイクの仕方が
わからん」と言うエラーが出てストップする。少し違う環境の複数のマシンでやってみたけど結果は同じ。
多分Makefileが間違ってるんだと思う。
同じ環境でQt 4.6βの方は問題なくビルド出来るんだが...

長い時間進んで最後の方で止まるからショック大きいw
一応、土曜日に本家のBug Trackerにログ付きで報告しておいた。
正式版では直してくれると思うけど。


523:デフォルトの名無しさん
09/11/16 10:17:48
俺普通に出来たけどな

524:デフォルトの名無しさん
09/11/16 10:59:33
はまりまくりorz

他のアプリからファイルリストをドロップできる
QListView(のサブクラス)を作ろうとしたら
ぜんぜんドロップできなかった。

呼ばれるはずの、QListViewに設定したカスタムモデルの
dropMimeDataが発生しない。

と思ったら、QListViewのサブクラスにデバッグのために書いた
dropEventが処理を奪っていたorz

QListViewなどのModel/Viewアーキテクチャでは
処理の制御をModelと、まだ試してないけど見た目をDelegateがやるから
QListViewのサブクラスは作るまでも無いのかな?

525:522
09/11/16 14:38:59
>>523
なぬ~! 何が違うんだろ。

Qt Creatorのバージョンは1.3β(1.2.92)で間違いない?
コンパイラは俺はVC++ 2008 Express Edition と Windows SDK for Windows Server 2008 and .NET Framework 3.5
(なげーよ)でやってみたんだけど,両方とも同じ結果だった。環境変数の設定が間違ってるといけないので,
普通のコマンドプロンプトやなくて,専用のコンソールウィンドウ(スタートメニューから手繰っていくと出てくるヤツ)
でやったんだけど...PCも一台じゃなくて自宅のと会社ので試したんだけどなぁorz

もちろん PATH には Qt の bin ディレクトリを追加してあるし,念のため QTDIR に Qt のインストールディレクトリ
(俺の場合は C:\Qt\4.6.0-beta1 )を設定しておいたんだけど...QMAKESPEC は自動認識するようなので,
特に設定しなかった(ビルド中のログを見ると,ちゃんと win32-msvc2008 になってる)。

どんな環境で成功したか教えてもらえると嬉しい。ヨロシク。

526:デフォルトの名無しさん
09/11/16 14:52:29
具体的にエラーメッセージ貼れ

527:522
09/11/16 16:04:21
長いので,本家のBug Trackerに報告したURLを貼らせてください。

URLリンク(bugreports.qt.nokia.com)

ここの添付ファイル qtcreator_builderror.txt がビルドに失敗した最後の方のログ。

NMAKE : fatal error U1073: don't know how to make '..\..\..\..\qtc\qt-creator-qt
-creator\src\plugins\qt4projectmanager\customwidgetwizard\customwidgetwidgetswiz
ardpage.ui'

と言うエラーが出てストップ。なのでqmakeで作成されたMakefileのバグだと思ったんだけど...
ちなみに make release してるけど,ただ make にしても結果は同じだった。

528:デフォルトの名無しさん
09/11/16 18:10:44
>>527
まず、customwidgetwidgetswizardpage.uiがあるかどうか。
次に、Makefileに、このファイルについてのルールがどう出ているか。

529:デフォルトの名無しさん
09/11/16 21:18:57
>>525
前にコンパイルしていたんだけど、OS入れ替えがあって
入れ替え後は面倒なんで配布しているやつを使っていたから
ついでに、もう一回コンパイルしてみたよ。
で、それを昼ごろやったんだけど、今思い出したw

Help->Aboutを見たら、Qt Creator 1.2.92ってかいてある。
ビルドも今日の夕方版

ソースコードは、ソースコード管理システムから落としてない。フォルダに落ちていたファイルを見る限り、
qt-creator-qt-creator-1.3.0-beta.tar.gz とqt-everywhere-opensource-src-4.6.0-beta1.zip を落としているね。

Windows SDK 7.0(Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1)を使った。
Microsoft Visual Studio 2008 Standardは入っているけど、SDK使ってコンパイルしているからこれ関係ないはず。

SDKのCMD shellを修正して、以下のようにしてシェル起動
C:\Windows\System32\cmd.exe /E:ON /V:ON /T:0E /K "C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\SetEnv.cmd" /xp /x86 /release

環境変数は特に設定していないはず。いろんな環境を入れると、コマンドが混ざっていやになるのよ。
だからインストーラーが勝手に設定するのは放置しているけど、手動では設定しないで
バッチファイルやら作って専用のシェル環境を作ってる。

今回は手抜きでSDKのCMD shellから set path=C:\Qt\4.6.0-beta1-x86\bin;%path と打ち込んだw
4.6.0-beta1-x86ってのは、4.6.0-bata1をWindows SDKでx86向けに自分でコンパイルした奴ね。

あとは、qmake、nmake で終わり。あ、nmakeにreleaseつけてないやw 遅いのか? あ、nmakeの代わりにjom使ったほうがマルチコアなら速いんだったw
念のため。生成されたqtcreatorを起動するときは、C:\Qt\4.6.0-beta1-x86\binを環境変数PATHにいれる必要があるよ。
jom.exeはどっかから探してきてね。

530:デフォルトの名無しさん
09/11/16 21:19:55
%path% ←%の忘れ物

531:522
09/11/16 22:14:55
>>528
レスサンクス。

> まず、customwidgetwidgetswizardpage.uiがあるかどうか。

あるはずだと思うんだが、なぜかない。エラーメッセージを見ると、customwidgetwidgetswizardpage.ui
を作ろうとしているように見えるけど、.ui はQt Designer等で作られるXML形式のリソースファイルで、
これを uic でコンパイルするんだから、このファイルがないのがおかしいようだ。

> 次に、Makefileに、このファイルについてのルールがどう出ているか。

いろんなところにMakefileが散らばっていて、親のMakefileから呼び出されるようなんだが、
問題の customwidgetwidgetswizardpage.ui が出てくるMakefile は、1つしかなくて、ルールは、

ui_customwidgetwidgetswizardpage.h: ..\..\..\..\qtc\qt-creator-qt-creator\src\plugins\qt4projectmanager\customwidgetwizard\customwidgetwidgetswizardpage.ui
c:\Qt\4.6.0-beta1\bin\uic.exe ..\..\..\..\qtc\qt-creator-qt-creator\src\plugins\qt4projectmanager\customwidgetwizard\customwidgetwidgetswizardpage.ui -o ui_customwidgetwidgetswizardpage.h

となってる(コピペしたら改行位置が変で読みにくくてスマソ)。
これからすると、customwidgetwidgetswizardpage.ui から uic.exe で ui_customwidgetwidgetswizardpage.h
を作ろうとしているようだjから、やはり customwidgetwidgetswizardpage.ui ファイルがないのがおかしいとしか考え
えられないと思うんだけど。


532:522
09/11/16 22:23:38
>>529
丁寧な解説ありがとう。

> ソースコードは、ソースコード管理システムから落としてない。フォルダに落ちていたファイルを見る限り、
> qt-creator-qt-creator-1.3.0-beta.tar.gz とqt-everywhere-opensource-src-4.6.0-beta1.zip を落としているね。

俺が落としたファイルと全く同じだ。

> Windows SDK 7.0(Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1)を使った。
> Microsoft Visual Studio 2008 Standardは入っているけど、SDK使ってコンパイルしているからこれ関係ないはず。

SDKのバージョンは違うけど、多分関係ないだろうなぁ。

> SDKのCMD shellを修正して、以下のようにしてシェル起動
> C:\Windows\System32\cmd.exe /E:ON /V:ON /T:0E /K "C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\SetEnv.cmd" /xp /x86 /release

サンクス。試してみる。

で、>>531に書いたとおり、customwidgetwidgetswizardpage.ui が見当たらないんだけど、あなたのところにはある?
同じファイルをダウンロードしたんだから、俺のところだけないとすると、解凍ツールのバグだったりして。
総合アーカイバープロジェクトにおいてあるDLLを使うファイラーで解凍したんだけど、なんか怪しい気がしてきた。
ダウンロード時のファイル化けは考えにくいしね。ちょっとチェックして見ようと思う。

533:デフォルトの名無しさん
09/11/16 22:49:57
それアーカイバのせいじゃね?w
俺は7zip使ってる。

tar.gzの中にこんなのがある。パス長いから見た目チェックミスりそうだから、
コピペするよw

C:\Qt\qt-creator-qt-creator-1.3.0-beta.tar.gz\qt-creator-qt-creator-1.3.0-beta.tar\qt-creator-qt-creator\src\plugins\qt4projectmanager\customwidgetwizard\
というディレクトリに

customwidgetwidgetswizardpage.ui
というファイルがある。

534:デフォルトの名無しさん
09/11/16 22:52:22
ついでに、ファイル名とMD5書いとくわ。

qt-creator-qt-creator-1.3.0-beta.tar.gz
9.17 MB (9,624,511 バイト)
34F264E4F1A06433A9CD6EDE7A39A1E4

535:522
09/11/16 23:29:10
>>533, 534

ファイルのほうは正常だった。

> それアーカイバのせいじゃね?w

やっぱりそうらしい。これまで二画面ファイラー Dyna と 統合アーカイバープロジェクトの
DLLでやってたんだけど、別のツール(Lhaz)で解凍してみたら、ディレクトリ構成が変わったorz
で、問題の customwidgetwidgetswizardpage.ui も、所定の場所にある。

なんか Dyna にバグがありそう。便利でずっと使ってたし、こんなこと初めて。
残念だけど、圧縮・解凍は別のツールに変えた方が良さそうだ。

今、nmake でビルドを始めたところ。果報は寝て待つことにしようと思う。
まだ結果は出たわけじゃないけど、皆さんありがとう & お騒がせスマソ。

明朝、うまくいってたら、本家のBug Trackerにも報告しなくちゃ...

536:デフォルトの名無しさん
09/11/17 01:23:43
bool QLayoutItem::hasHeightForWidth ()はあるのに、
bool QLayoutItem::hasWidthForHeight ()がないのはなぜでしょう?

これが無くて困ってまして、仕方なくQtへのパッチを作って対処しようかと
思うのですが、影響範囲がすごく大きくなりますよね。
なにか良い手はないでしょうか。

537:デフォルトの名無しさん
09/11/17 02:24:05
QListViewって複数列表示できるよな? うーん・・・

538:デフォルトの名無しさん
09/11/17 02:40:51
あ、できないのか? サンプルのAdress BookではQTableViewを使ってる。
いかんなぁ。リストビュー=Windowsのアレというイメージがある

539:デフォルトの名無しさん
09/11/17 03:34:03
サンプルのbasicsortfiltermodelではQTreeViewを使っていた。
こっちのほうがWindowsのリストビューに近いか?

540:デフォルトの名無しさん
09/11/17 05:53:45
>>536
>bool QLayoutItem::hasWidthForHeight ()がないのはなぜでしょう?
どんな場合に必要ですか。

541:522
09/11/17 11:07:59
>>535
おかげさまで,Qt Creator 1.3βのをWindows SDKでビルドすることに成功しました。

で,makeの最後に,

c:\Qt\4.6.0\bin\lrelease ..\..\..\..\qtcsrc\qt-creator-qt-creator\share\
qtcreator\translations\qtcreator_ru.ts -qm qtcreator_ru.qm
Updating 'qtcreator_ru.qm'...
Generated 2760 translation(s) (2607 finished and 153 unfinished)

Ignored 10 untranslated source text(s)

みたいなメッセージが10個くらい出るんだけど,これって問題ないの?
とりあえずざっと使ってみた限りでは大丈夫そうだけど。

それと,Qt Creatorからアプリをビルドする時は,nmakeじゃなくてjomを使うみたい
なので,NOKIAのサイトから拾ってきて一件落着。

ありがとうございました。

542:522
09/11/17 11:10:56
↑ビルドの最後のメッセージはちゃんと読んでみたら,多言語対応の翻訳関係で未翻訳のテキストの
数を表示してるだけみたいだね。

543:デフォルトの名無しさん
09/11/17 11:20:53
> それと,Qt Creatorからアプリをビルドする時は,nmakeじゃなくてjomを使うみたい
Qt Creator 1.3のオプションでnmakeを使うようにも設定できたよ。
まあ、jomでいいと思うけど。

544:デフォルトの名無しさん
09/11/17 12:12:28
>>540
Qt付属のFlowLayoutデモのVertical版です。
基本機能のフローレイアウトは実現できるのですが、
これを別のレイアウトの中に複数入れるようなことをすると、
高さに対応する横幅を指定出来ないために、内臓するウィジットの横幅総計
と全く関係ないサイズになってしまいます。
アドバイスありますでしょうか。


545:デフォルトの名無しさん
09/11/17 16:43:28
Qt CreatorでVisualC++のコンパイラを使うためにビルドしようと思ったけど
だいぶ大変そうだな
ビルド済みのを配ってほしい

546:522
09/11/17 17:02:48
>>543
> Qt Creator 1.3のオプションでnmakeを使うようにも設定できたよ。

うん、見つけた。左の[Projects]ボタンを押すと、[Build Steps]で設定できるね。

>>545
俺の場合は解凍ツールがアホだっただけで、ビルド自体はそんなに大変じゃ
ないよ。時間は掛かるけど。あとREADMEがちょっと説明不足気味かな。
makeの後ろにreleaseつけないとデバッグビルドになるなんて書いてないし。

547:522
09/11/17 17:19:07
で、Qt CreatorはVCでビルドして動くようになったんだけど、またまた問題発生。
アプリのコンパイル/リンクは通るんだけど、cdbが動かない。デバッグをスタート
させると。

「The application reaquires the debugger engine 'Cdb', ehich is disabled.」

というメッセージボックスが出る。

Debugging Tools for WindowsはもちろんインストールしてPATHも通してある。
Qt Creatorのマニュアルを良く見たら(下記)、

URLリンク(doc.trolltech.com)

「When building Qt Creator using the Microsoft Visual C++ Compiler, the
"%ProgramFiles%\Debugging Tools for Windows" path will be checked
to ensure that all required header files are there.」

なんて書いてある。これってもしかして、Qt Creatorをビルドする前に
Debugging Tools for Windowsをインストールしとけって意味なのか?
だとすると、やっぱり>>545の言うように、ビルドするの大変だわ。

設定いろいろ見たけど、それらしいものはない。試しに[Tools]→[Options]→[Debugger]
→[Gdb]の[Gdb location]に無理矢理cdbのパスを書いてみたが、関係なかった。

それと、cdbはデフォルトでは %ProgramFiles%\Debugging Tools for Windows (x86)
にインストールされるんだが、前述の説明では %ProgramFiles%\Debugging Tools for Windows と
なってる。これって単なる間違いだよねぇ?

cdbちゃんと動いてる人、教えてもらえると助かる。よろしく。

548:522
09/11/17 17:22:21
>>547
× 「The application reaquires the debugger engine 'Cdb', ehich is disabled.」
○ 「The application reaquires the debugger engine 'Cdb', which is disabled.」

タイポスマソ

549:デフォルトの名無しさん
09/11/17 17:28:50
VC++でQtCreatorをビルドするときは、
必要なヘッダーファイルがあるか
"%ProgramFiles%\Debugging Tools for Windows"をチェックしとけ

550:デフォルトの名無しさん
09/11/17 18:21:48
>>547
>なんて書いてある。これってもしかして、Qt Creatorをビルドする前に
>Debugging Tools for Windowsをインストールしとけって意味なのか?

そうだよ。書かれていないと何度もはまるよね。

551:522
09/11/17 18:28:17
>>549
> 必要なヘッダーファイルがあるか
> "%ProgramFiles%\Debugging Tools for Windows"をチェックしとけ

「必要なヘッダーファイル」って何ですか?
どこに書いてあります? 少なくともQt CreatorのREADMEのビルド方法の記述には見当たらないし、
マニュアルでも俺には見つけられない。

それと、デフォルトのインストールディレクトリである"%ProgramFiles%\Debugging Tools
for Windows (x86)"ではなくて、"%ProgramFiles%\Debugging Tools for Windows"に
ビルド前にインストールしとかなきゃいけないの?

そう言うんだからあなたは成功したんだと思うので、具体的に情報ください。
よろしくお願いします。


552:522
09/11/17 18:37:23
>>550
あぁ、やっぱりそうなんだ。READMEに書いといて欲しいなぁ。
情報サンクス。

とりあえずソースを展開したディレクトリ以下からgrepで"Debugging Tools"を
さらってみたら、cdb.pri と言うファイルにそれらしい記述があった。
インストールディレクトリはどちらでもいいみたい。

これ以上落とし穴がないことを祈って、もう一度ビルドし直します。

553:デフォルトの名無しさん
09/11/17 18:57:17
>>552
ビルドする前に qmake -r しておいた方がいいと思います。

554:522
09/11/17 19:08:00
>>553
> ビルドする前に qmake -r しておいた方がいいと思います。

情報ありがとう。qmake -helpで見ても-rと言うオプションは見つかりませんが、何ですか?

555:デフォルトの名無しさん
09/11/17 19:16:56
URLリンク(qt.nokia.com)

556:デフォルトの名無しさん
09/11/17 19:32:42
> なんて書いてある。これってもしかして、Qt Creatorをビルドする前に
> Debugging Tools for Windowsをインストールしとけって意味なのか?

そうなのか? 先に入れたっけなぁ?入れてたかもしれないなぁ。
覚えてないや。

> 設定いろいろ見たけど、それらしいものはない。試しに[Tools]→[Options]→[Debugger]
> →[Gdb]の[Gdb location]に無理矢理cdbのパスを書いてみたが、関係なかった。

俺のところでは、[Tools]→[Options]→[Debugger] に
Cdbの設定画面があるよ。ここで、パスを指定できる。

557:デフォルトの名無しさん
09/11/17 19:38:44
>>554
-r は、再帰的に qmake かけるオプションです。
なのでQtCreatorのトップディレクトリで実行してください。

558:デフォルトの名無しさん
09/11/17 19:53:55
QGphraicsSceneに大きい画像を追加して、QGraphicsViewに登録すると、
スクロールバーが出ます。
QGraphicsScence::RemoveItem()で消しても、スクロールバーが出っ放しなんですが、
ViewかSceneをリセットすることはできないのでしょうか?

559:デフォルトの名無しさん
09/11/17 20:19:47
リストビューでカスタマイズした描画ができたから断片おいとくわ。
まとまった情報が見つからないorz もっと良い方法があれば修正してなー。

解説
QTreeViewで一覧を描画するときそれを行うのがデリゲートというもの。
デフォルトではQStyledItemDelegateが設定されている。
QItemDelegateというのもあるがこっちはデザインが古臭い。
(たぶんQStyledItemDelegateがOSネイティブで、QItemDelegateがQt描画)

そこで、QStyledItemDelegateのサブクラスMyDelegateを作る。
paintをオーバーロードして描画すればいいだけなんだが、
選択・マウスオーバー行をあらわすハイライトは
QStyledItemDelegateのもの組み合わせて作りたい。
QItemDelegateにはそれをやってくれるdrawFocusがあるのだが・・・の解決方法。

void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
  //二列目は独自の描画
  if(index.column()==1) {
    //デフォルトの選択行の描画 selected
    QStyleOptionViewItemV4 opt = option;
    initStyleOption(&opt, index);
    const QWidget *widget = opt.widget;
    QStyle *style = widget ? widget->style() : QApplication::style();
    style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);

    //ここにpainterを使って独自の何か書く
  } else {
    //二列目以外は親クラスに渡す
    QStyledItemDelegate::paint(painter, option, index);
  }
}

560:522
09/11/17 22:10:32
>>556
先にDebugging Tools for WindowsをインストールしてからQt Creatorをビルドしたら、
CDBの設定画面が出てきました。だから>>556さんの場合は、先にデバッガをインス
トールしてあったんだと思います。

VC++でビルドすると言うことは、デバッガはCDBに決まってるわけで、ビルド時に
CDBの存在をチェックする必要はないような気がするんですけどね。
しかもCDBの設定画面から、CDBのパスが設定できるって、何か変な気がします。

561:522
09/11/17 22:18:50
>>557
-recursive の略なんですね。今回は -r を指定して qmake してみました。
nmakeでも途中で qmake を走らせて、各所に Makefile を作ってそれをまた実行する
つくりになっているのを、先に実行させて nmake ではそのプロセスをスキップさせようと
いうことでしょうか?

ちなみに今回は最初、nmake ではなくて jom でビルドを試みましたが、途中でエラー
が出てダメでした。理由はわかりませんが、いい加減調べるのに疲れたので nmake で
ビルドさせたら無事に完了しました。

やっとまともなVC++版Qt Creatorが出来ました。皆さんありがとう。

562:デフォルトの名無しさん
09/11/17 22:29:13
>>561
いえ、ちゃんと確認したわけではないですが
qmake しないと nmake するための Makefile が
生成されていないだろうから、qmake -r をオススメしたわけです。
なんにせよ、うまくいったようで何よりです、おめでとうございます

563:522
09/11/17 23:22:55
>>562
先に各所にMakefileを作るか、ビルド中に作るかの違いはありますが、
qmakeに-rを指定しなくても大丈夫なようですよ。

> なんにせよ、うまくいったようで何よりです、おめでとうございます

ありがとうございます。しかし、もう少しビルド方法を克明にREADMEなりINSTALLなりの
テキストファイルに書いて欲しいですね。せっかく苦労したから、時間が出来たら何処かに
まとめようと思います。


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