- 1 名前:デフォルトの名無しさん [2009/10/01(木) 12:08:27 ]
- Qt(キュート)は C++ ベースの GUI ライブラリです。
フォーム、ボタンなどの各種ウィジェットからネットワーク、マルチスレッド、グラフィックス(OpenGL)や 各種コンテナ、XMLパーサー、組み込み JavaScript など、ライブラリの機能は多岐に渡ります。 Qt Creatorのリリースにより単なるGUIライブラリ・ツールキットから、 単体でGUI作成、コーディング、デバッグも可能な クロスプラットフォーム対応のRADベースの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 など ■前スレ 【GUIツールキット】Qt 総合スレ 4【Win/Mac/Linux】 pc12.2ch.net/test/read.cgi/tech/1239996587/
- 357 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 17:04:52 ]
- ・何がしたいのか
・現状どうなっているのか ・それに対する自分の意見 ・自分の環境は何なのか(OS,CPU,GPU) ・IMEを他のものにして同じ症状があるのかどうか、ないならそのIMEは何なのか。 ・可能ならサンプルをアップローダーに。 このくらいは質問するなら情報として欲しいわ。
- 358 名前:デフォルトの名無しさん [2009/10/25(日) 17:05:15 ]
- >>355
賛成。 それぞれに長所、短所あるから一概にいえないと思う。
- 359 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 17:09:27 ]
- wxスレなんてQtの話題が出て荒れてたような記憶しかないんだが
で、なんでいきなりwxの話題が出たの? Qt Creatorが熟れてないとかそういう話題から?
- 360 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 17:10:45 ]
- >>359
wx スレを見に行けば分かる。
- 361 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 17:12:42 ]
- 聞き逃げ?
- 362 名前:351 [2009/10/25(日) 17:14:21 ]
- >>356
インプットメソッドイベントをハンドルすればできそう。 inputMethodEvent()をオーバーライドすればよい。 ただ、私は使用したことはないので、具体的にどうすればいいかは はわからない。
- 363 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 17:17:05 ]
- >>360
久々に見てきたが IDE議論とwxの新IDE、あとはQt他ライブラリとの比較ぐらいしかこれといったものはなかった もう少し具体的に書いてくれ
- 364 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 17:23:55 ]
- >>363
最新10レス位を見ただけでも何か気付くもんだと思うが… 別に謎なぞしてる訳じゃないから、本当に分からないならスルーしてくれ。 >>349を書いたのは親切心のつもりだったが、邪魔して悪かったな。
- 365 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 17:31:20 ]
- IMEがらみの話ってこと?
- 366 名前:デフォルトの名無しさん [2009/10/25(日) 17:35:09 ]
- >>357
>IMEを他のものにして同じ症状があるのかどうか、ないならそのIMEは何なのか。 特にこれだと思う。ATOKが悪さをしているか、ATOKに渡すべきキーイベントを Qtが食っているか。ATOK絡みでは、問題があったりするのか。 どっちも古めだけれど。 www.kde.gr.jp/ml/Qt-devel/msg00686.html ATOK/一太郎 統合スレッド[ その2 ] pc11.2ch.net/test/read.cgi/linux/1193271272/
- 367 名前:デフォルトの名無しさん [2009/10/25(日) 17:41:53 ]
- >>366
こちらは、Debian GNU/Linux 上で Qt immodule/anthyで日本語入力しているけれど、 同じように、日本語入力中にESCを押すとダイアログが閉じるよ。
- 368 名前:デフォルトの名無しさん [2009/10/25(日) 18:01:00 ]
- >>367
kinput2は、日本語入力中にESCを押してもダイアログが閉じませんでした。
- 369 名前:デフォルトの名無しさん mailto:sage [2009/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 lists.trolltech.com/qt-interest/2005-04/thread00872-0.html
- 370 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 18:19:57 ]
- ↑
あ、御免スルーして...
- 371 名前:367 [2009/10/25(日) 18:34:14 ]
- >>368
>>343 の意味を取り違えていたかもしれない。 >既出かもしれませんが、QLineEditで日本語入力(ATOK)中にESCを押すとIME >ではなくダイアログを抜けるので、それまで確定した内容が消えてしまいます。 この「日本語入力中」というのは、変換確定前の日本語入力中ということなの。 それとも、日本語入力モードになっているときということなの。 >>367 で出る症状は後者のことをいっているので、 質問者が前者の意味のことをいっているのなら、 私の環境でもダイアログが閉じないということになる。 話をややこしくしてごめん。
- 372 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 18:58:27 ]
- >この「日本語入力中」というのは、変換確定前の日本語入力中ということなの。
です
- 373 名前:デフォルトの名無しさん [2009/10/25(日) 18:59:10 ]
- >>371
文字列が確定しているときに、日本語入力モードかどうかに拘らず、ESCでダイアログ が閉じてしまうということならば、普通の動作ではないでしょうか。
- 374 名前:371 [2009/10/25(日) 19:14:22 ]
- >>372
>です やっぱり勘違いだったみたいね。ごめん。 >>373 >文字列が確定しているときに、日本語入力モードかどうかに拘らず、ESCでダイアログ >が閉じてしまうということならば、普通の動作ではないでしょうか。 その通りです。勘違いしていました。
- 375 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 19:44:40 ]
- OKボタンがデフォルトボタンになっていると
変換中の文字を確定するときのenterで 入力枠に文字が入ると同時に(残りの枠が未入力でも) ダイアログが確定してOKボタンを押したことになってしまいます
- 376 名前:362, 367 [2009/10/25(日) 19:48:08 ]
- >>356
QLineEditのカスタムクラスを書いて、inputMethodEvent()をオーバーライドし、 受け取ったイベントのevent->preeditString()が空かどうかで、 入力中かどうかが判断できるみたい。 また、こちら(Linux, qt immodule, anthy)では、日本語入力中(変換確定前)は、 途中でESCキーを押してもkeyPressEventは発生せず、inputMethodEventだけが発生した。 だからそちらも同じ動作ならinputMethodEvent()だけをオーバーライドすればいいと思う。 ただ、こちらの環境と違うし、ATOKの問題かもれないから、そちらの環境では、 日本語入力中にESCを押したときに、keyPressEventが発生しているかもしれない。 そのときは、keyPressEvent()もオーバーライドする必要があるかもしれない。 場合に依ってはフラグを立てて入力中かどうかを判断すればよい。
- 377 名前:デフォルトの名無しさん [2009/10/25(日) 20:07:45 ]
- >>375
>OKボタンがデフォルトボタンになっていると >変換中の文字を確定するときのenterで >入力枠に文字が入ると同時に(残りの枠が未入力でも) >ダイアログが確定してOKボタンを押したことになってしまいます >>343 の人だよね。 こちら(Linux/X11)では、単に日本語入力の確定になる。 そしてもう一度Enterを押すとデフォルトボタンにより、ダイアログが閉じる。
- 378 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 20:28:02 ]
- キーボード壊れてんじゃね
- 379 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 21:27:25 ]
- >>346
MS-IMEはマイクロソフトの製品だけど。 > IME - Wikipedia > ttp://ja.wikipedia.org/wiki/IME > IMEはWindowsにおける用語であり、 > 広く文字入力のためのシステムを表す一般名称はインプットメソッドである。 > ただし、最近ではWindows以外のプラットフォームで使われるインプットメソッド > (Mac OSの「ことえり」など)についてもIMEと呼ばれることがある。 > AndroidプラットフォームではWindows同様、IMEという用語を使用している。 うむ、微妙。
- 380 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 21:33:16 ]
- IME と呼ぶ人はほぼ Windows ユーザと考えてオケです。
- 381 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 10:42:48 ]
- Qt Creatorの一番したのバーに検索ボックスがありますよね
あれ、メソッドとか検索できて便利なんだけど ついでに、変数も検索できないですか?
- 382 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 12:52:48 ]
- 無理を承知の上でのQt初心者の質問です。
Windowsで,QMainWindowのウィンドウハンドル(HWND)を取得する方法ってないんでしょうか? 今まで他の開発環境で書きためたソースやライブラリでHWNDを引数やリターン値に持つ WIN32 APIをかなり使っているので,楽に移植したいのです。 Qtの設計思想からOS依存するようなものは排除されているのもわかりますし,WIN32 APIの 代替となるような機能が用意されているようではあるんですが... 現在アクティブなウィンドウのハンドルならWIN32 APIの ::GetActiveWindow() で取得できましたが, その他のウィンドウについては,::FindWindowEx()とか使って取得するしかないんでしょうか。
- 383 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 12:58:04 ]
- ありますが
- 384 名前:382 mailto:sage [2009/10/26(月) 12:59:29 ]
- >>383
質問する前にヘルプを探したんですが見つかりませんでした。 教えてください。
- 385 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:09:04 ]
- >>382
Qt-interest Archive - Qt 4.2.0: How to get HWND handle? lists.trolltech.com/qt-interest/2006-10/thread00800-0.html WIdはWindowsではhwndだから、WId QWidget::winId() constを使うんだってさ
- 386 名前:382 mailto:sage [2009/10/26(月) 13:24:22 ]
- >>385
やってみたらうまく行きました。ありがとうございました。
- 387 名前:デフォルトの名無しさん [2009/10/26(月) 16:08:56 ]
- >>381
できないんじゃないかな。 多分知っていると思うけど、現在開いているドキュメント以外を検索したいのなら。 「編集」メニューの「検索・置換」->「Find Dialog」や 「編集」メニューの「検索・置換」->「ディスク上のファイル」 などを選んで、複数のファイルの中の検索ができるからそれを使うしかないんじゃないかな。 検索結果は、Qt Creatorの中でリストアップされるので便利。 でもこれだと、変数限定というわけにはいかないけど。 ディスク内を検索するときは、ディレクトリを指定した方がいいよ。
- 388 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:26:23 ]
- virtual
- 390 名前:デフォルトの名無しさん [2009/10/26(月) 23:33:00 ]
- >>388
Q_OBJECTマクロ書かないといけない。 class PixmapScene : public QGraphicsScene { Q_OBJECT public: PixmapScene(); //...
- 391 名前:390 [2009/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 [2009/10/26(月) 23:54:53 ]
- 訂正);が抜けていた。
void mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent); void mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent); 分かっているとは思うけど、PixmapSceneからさらに派生させ、 その派生クラスでイベントをハンドルする場合には PixmapSceneのイベントハンドラーにも virtual void mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent); とvirtualをつけないといけない。
- 393 名前:390 [2009/10/26(月) 23:58:18 ]
- 度々ごめん
誤)lass PixmapScene : public QGraphicsScene 正)class PixmapScene : public QGraphicsScene
- 394 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/10/27(火) 00:10:24 ]
- >>390
> Q_OBJECTマクロ書かないといけない。 イベントハンドラをオーバーライドするためだけならば、なくてもよいです。 >>392 > virtualをつけないといけない。 付けなくて付けたことになるので、付けなくてもよいです。
- 396 名前:390 [2009/10/27(火) 00:32:13 ]
- >>395
誤解していた。 ありがとう。
- 397 名前:390 [2009/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 [2009/10/27(火) 01:12:38 ]
- >>394
一つ思いついた。 GraphicsViewのmousePressEvent()をオーバーライドしているのに、 その中で基底クラスのQGraphicsView::mousePressEvent()を コールしていないのが原因では? グラフィックスシーンフレームワークでは、イベントは QGraphicsView -> QGraphicsScene -> QGraphicsItem の順番に伝えられるから。
- 399 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 07:09:43 ]
- QIODeviceを継承している
- 401 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 07:13:02 ]
- pathやhostはQNetworkRequestにQUrlで指定するんじゃないの?
- 402 名前:399 mailto:sage [2009/10/27(火) 07:44:54 ]
- >>401
できました! 自動でホストとパスを分けてくれるんですね。 他のところのバグもあってうまく行かず気づきませんでした。 どうもありがとうございました。
- 403 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 21:43:30 ]
- >390
void PixmapScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent) に入ってくることができました。 がしかし、 mouseEvent->lastPos(), pos()など実行しても、(0, 0)しか返って来ません。 mouseEvent->scenePos()が目的としていた座標値のようです。 また、scenePos()がマイナスのところをクリックしても、上記イベントハンドラに来るみたいです。 てっきりそのscene内だけかと思ったら。。。 もう少しヘルプを読んでみます。ありがとうございました。
- 404 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 22:16:35 ]
- mousecapture
- 405 名前:403 mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/10/27(火) 23:38:07 ]
- >>403
>また、scenePos()がマイナスのところをクリックしても、上記イベントハンドラに来るみたいです。 >てっきりそのscene内だけかと思ったら。。。 シーンは論理座標を表現するクラスなので座標値としてマイナスもとる。
- 407 名前:デフォルトの名無しさん [2009/10/28(水) 00:38:13 ]
- >>405
>あと一息なのでお知恵を拝借いただけるとありがたいです。 がんばれ。 >MainWindow(QMainWindowから派生) >+ImageView(QGraphicsViewから派生) >+PixmapScene(QGraphicsSceneから派生) ちょっとクラスの構成や参照関係が見えないんだけど。 これらのクラスは、全てコードで書いたの?それともフォームエディタを使った? フォームエディタを使ったのならMainWinodwの下に セントラルウィジットしてQWidgetがあるはずなんだけど。 >>285 で指摘したようなことが必要になる。 それとも、ImageViewは、setCentralWidget()で指定した セントラルウィジットなの? PixmapSceneは、親オブジェクトを参照している、それともしてない? その辺が分からないから一般論で回答する。
- 408 名前:407 [2009/10/28(水) 00:39:41 ]
- つづき
QWidgetには、親ウィジットをポインターとして参照させることができるから もしコンストラクターなどで親ウィジットを参照させてないなら参照させるようにしてから そのparentWidget()で親ウィジットを参照してqobject_cast<>()でキャストして という処理を繰り返し、メインウインドウまで遡っていくか。 または >>286 で指摘した方法などの代替案をとるとか。 などが考えられる。 また、シーンのカスタムクラスを書いているのならばMainWindowをポインターメンバーとして参照し、 コンストラクト時に渡すようにすればいいんじゃないかな。 QGraphicsSceneはQWidgetではなくQObjectを継承している、parent()で親オブジェクトを得て、 qobject_cast<>()でキャストする必要がある。
- 409 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 08:30:44 ]
- ググっていたら,いつの間にか「Qt Users Forum Japan」なるフォーラムが出来てる
のにたどり着いた。 qtusersforum.s2.zmx.jp/forum/viewtopic.php?f=9&t=97 ここもいいんだけど,ソースコード書くとインデントが無視されてしまうので,ソースコート を書く必要がある場合は上の方が向いてるかも。 管理人がどんなプロフィールで,どんな背景で作られたかはわからんが。
- 410 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 11:34:49 ]
- Qtでマルチスレッドのデザインパターンの実装例がほしい。
- 411 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 11:52:00 ]
- >>410
pthread(POSIX Thread)のパターンが、そのまま使えない?
- 412 名前:403 mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 22:45:29 ]
- >>410
サブスレッドからシグナルを送るとメインスレッドのスロットで捕捉されるので スレッド間通信がすっげー簡単になるよ
- 414 名前:デフォルトの名無しさん [2009/10/28(水) 23:08:30 ]
- >>412
>グローバルなアプリのポインタ使った方がスマートかなと思ったり。。。 MainWindowまでたどるのが大変なとき(遠いとき)は、有効。
- 415 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 01:24:46 ]
- >>413
まあ、そんなところの実装例が見たいんだよな。 4.6にはQFutureとかあるし、使い方も知りたい。
- 416 名前:デフォルトの名無しさん [2009/10/29(木) 08:18:19 ]
- >>415
QFutureは、4.4からあります。
- 417 名前:403 mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/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 [2009/10/30(金) 06:11:41 ]
- >>417
QApplicationのqApp [Macro] doc.trolltech.com/4.5/qapplication.html#qApp QCoreApplicationのinstanc() [static] doc.trolltech.com/4.5/qcoreapplication.html#instance >このような感じです。(今見るとa, wとか適当な変数名。。) 個人的な意見だけど、自分だけでプログラムするのなら、どんな名前でもいいんじゃないかな。 また、簡単な動作チェックなんかのときなどは、いちいち名前なんて考えてられないし。 でも、プロジェクトとかに参加して、ネーミング規約があるのならばそれに従わなければならないし、 他の人が見るものは、ある程度わかりやすくした方がよいと思う。 そして、その”他の人”というのは、数年後の自分である可能性がある。 そうすれば何年も前に書いた、規模の大きい、もう内容を忘れてしまったコードを見たときに、どんな処理をしているか把握するための 手助けになる。 だから普段から、ある程度はわかりやすい名前を付ける癖を付けておいた方がいいと思う。 個人的な意見だから気に障ったらごめん。
- 420 名前:デフォルトの名無しさん [2009/10/30(金) 20:43:18 ]
- QtCreatorが動かん、ハングアップする……と悶々としてたがAvast切ったら改善された。何故。
悩む人がいるかもしれないから参考までに……
- 421 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 21:33:21 ]
- >418
詳しく説明していただきありがとうございました。 変数名についてですが、たぶんMainWindowのexampleのmain.cppを そのまま持ってきた気がします。 自分で書くなら、ループ変数、局所的なテンポラリ変数以外に一文字 というのはあまり使いません。 ちなみに、Qtは初めて間もないです。MFCとかC++/CLIとか趣味でやっていましたが、 どちらも中途半端な気がしており、マルチプラットフォームで純粋なC++であるQtに 興味を持った次第です。
- 422 名前:デフォルトの名無しさん [2009/10/30(金) 22:21:39 ]
- >>421
>変数名についてですが、たぶんMainWindowのexampleのmain.cppを >そのまま持ってきた気がします。 >自分で書くなら、ループ変数、局所的なテンポラリ変数以外に一文字 >というのはあまり使いません。 言い過ぎた気がするので、謝ります。ごめんなさい。 >ちなみに、Qtは初めて間もないです。MFCとかC++/CLIとか趣味でやっていましたが、 >どちらも中途半端な気がしており、マルチプラットフォームで純粋なC++であるQtに >興味を持った次第です。 どっぷりとQtの世界につかってください。 これもおせっかいかも(^_^;)。
- 423 名前:403 mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/10/31(土) 00:33:56 ]
- >>423
それでいいと思うけど。 >mainwindow.setMainWindow(&mainwindow); app.setMainWindow(&mainwindow); だね。
- 425 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 08:43:13 ]
- >425
自己解決しました。 randt.jp/?p=729 qmakeを再実行してリビルドしたら大丈夫でした。 すべてリビルドはやっていたのですが、qmakeの再実行はすべてリビルドに 入ってないのか。
- 427 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 23:10:50 ]
- >428
QApplicationのリファレンスを見ると、コンストラクタはargcが参照型なのですね。 ご指摘ありがとうございました。
- 430 名前:デフォルトの名無しさん mailto:sage [2009/11/03(火) 19:37:10 ]
- QFileDialogで、ダイアログのみのフィルタって掛けられますか?
- 431 名前:デフォルトの名無しさん [2009/11/03(火) 20:45:42 ]
- >>430
意味が分からないんだけど。 具体的に言うとどういうこと?
- 432 名前:デフォルトの名無しさん [2009/11/03(火) 20:55:18 ]
- >>430
質問しているのは、ファイルのフィルタじゃないよね?
- 433 名前:430 mailto:sage [2009/11/03(火) 21:05:32 ]
- えっと、すいません
X ダイアログ ○ ディレクトリ でした
- 434 名前:デフォルトの名無しさん [2009/11/03(火) 21:38:34 ]
- >>433
ディレクトリのフィルタはできるよ。 static関数のgetExistingDirectory()を使用するか、オプションとしてQFileDialog::ShowDirsOnlyを 指定すればよい。 参考: doc.trolltech.com/4.5/qfiledialog.html
- 435 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/11/03(火) 22:25:04 ]
- >>435
show()を後からコールすればいいだけなんじゃない?
- 437 名前:デフォルトの名無しさん mailto:sage [2009/11/03(火) 22:42:10 ]
- >436
たしかにそれでも可能です。 (MainWindowのコンストラクタで処理しても良いとも思います) あと、main()にあまりたくさん記述したくないなぁというつまらない理由でもあります。 MFCや.NETでフォームとかダイアログが生成されたときに、 一度だけ呼ばれる関数があったので、Qtでもそのようなものが あるのかなと思い、お伺いしました。
- 438 名前:デフォルトの名無しさん [2009/11/03(火) 22:46:01 ]
- QMainWindow を継承して MainWindow 創ったんなら
MainWindow::show() の中で hogehoge; this->show(); とすればよかろう
- 439 名前:デフォルトの名無しさん [2009/11/03(火) 22:57:55 ]
- >>437
その処理をするメンバー関数を定義して、そのメンバー関数をコンストラクターからコールすればいいのではないかな。 そして、そのメンバー関数からshow()をコールすればいい。 あるいは、メインにQObjectを継承したカスタムクラスPreprocessのオブジェクトを作ってそれに引数に対する処理をさせてはどう? そして、そのオブジェクトのシグナルとMainWindowオブジェクトのshow()スロットでつなげるとか?
- 440 名前:デフォルトの名無しさん [2009/11/03(火) 23:18:13 ]
- >>435
処理の内容にもよるのかもしれないけれど、アプリケーションのカスタムクラスで コマンド引数に対する処理をしたほうが自然な気がするけど。
- 441 名前:430 mailto:sage [2009/11/04(水) 07:09:52 ]
- >>434
ありがとうございました。
- 442 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 08:14:05 ]
- ・・・無限ループ?
- 443 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 10:19:59 ]
- ℃-uteのファンだから、Qt使うことにしようかな?( ・ω・)y─┛〜〜
- 444 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 22:52:16 ]
- ど……どうて?
- 445 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 14:55:22 ]
- Qtのなるべく新しい日本語ドキュメントってどれでしょうか?
4みたいだけど、あまり日本語化されていない。 qt.linux-life.net/4/doc/ja/index.html 結構日本語化されているけど、2.3.2。 www.kde.gr.jp/~ichi/qt-2.3.2/index.html これぐらいでしょうかねぇ。
- 446 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 15:12:29 ]
- きっと非公式のは期待してないんだよね
- 447 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 15:36:12 ]
- いえ、非公式のでもいいです。
- 448 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 22:57:41 ]
- Qtの正規表現で最短一致を表現したいのですが、どうしたらいいのでしょうか。
Perl5では(.+?)で出来るそうなのですが、Qtでは出来ないようでした。 Key=Value で、Valueに=が含まれる場合に、Key側を最短にしたいです。 正規表現使わない方法もありますが、正規表現使ってシンプルに実装したいです。
- 449 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 23:22:49 ]
- perlの性器表現を標準だと思わない方が良い
pc12.2ch.net/test/read.cgi/unix/1039165754/ pc12.2ch.net/test/read.cgi/tech/1241537764/ pc12.2ch.net/test/read.cgi/tech/1189246036/
- 450 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 23:37:33 ]
- 最短マッチにしたいならQRegExp::setMinimal(true);
ただ(.+)も最短マッチになったはず
- 451 名前:デフォルトの名無しさん mailto:sage [2009/11/08(日) 00:05:34 ]
- 449,450 ありがとうございます。
すみません、QRegExp::setMinimal(true); も試してだめだったの忘れてました。 Key=Value を QRegExp rxKey("^(.+)=(.*)$"); rxKey.setMinimal(true) とやっても、Key側にイコールが入ってしまいます。
- 452 名前:デフォルトの名無しさん mailto:sage [2009/11/08(日) 00:39:09 ]
- QRegExp rxKey("^(.+)=(.*)$");
rxKey.setMinimal(true); rxKey.indexIn("Key=Value\n"); qDebug() << rxKey.cap(1); 普通にこれで切り出せるけど
- 453 名前:デフォルトの名無しさん mailto:sage [2009/11/08(日) 00:46:16 ]
- QRegExp rxKey("^([^=]+)=(.*)$");
じゃだめ? setMinimal は全体を最短にするだけで、各要素を最短でとるわけではないっぽいな。
- 454 名前:デフォルトの名無しさん mailto:sage [2009/11/08(日) 09:54:35 ]
- ttp://qt.gitorious.org/qt/qt
のページにある様にgitで git clone git://gitorious.org/qt/qt.git Qtを落としてきたら、なぜかインストール先が /usr/local/Trolltech/Qt-4.7.0 になってた ……4.6.0betaのハズなんだけど
- 455 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/11/08(日) 14:22:05 ]
- gihyo.jp/dev/feature/01/qt/0003?page=2
- 457 名前:デフォルトの名無しさん [2009/11/08(日) 14:27:40 ]
- >>455
>>456の「子ウィジェットの自動メモリ解放に関連して〜」 辺りを。 >Implicitly Shared Classesの話がそうなのだと思うのですが、いまいち理解できなくて。 その通りでISCが関連します。 >みたいに使っても問題ないということなのでしょうか。 問題ないです。 >いちいちポインタを使うものではないですか? ポインタを使わないようにするものです。
|

|