【GUI】wxWidgets(旧wxWindows) その5【サイザー】
クロスプラットフォーム GUI ライブラリの wxWidgets (旧 wxWindows)についてのスレ。 本家 ttp://www.wxwidgets.org/ wxWindows日本語プロジェクト ttp://wxwindowsjp.sourceforge.jp/ Cross-Platform Programming with wxWidgets ttp://wxwidgets.info/ Let's wxWidgets ttp://dot-gray.s33.xrea.com/ wxWindowsで始めるC++ GUIプログラミング ttp://www.h3.dion.ne.jp/~k5_n/wxwin/ wxWidgets でクロスプラットフォーム GUIアプリを作ろう ttp://0xcc.net/pub/uu-2004-08/ 前スレ 【GUI】wxWidgets(旧wxWindows) その4【サイザー】 http://pc12.2ch.net/test/read.cgi/tech/1214657360/ ググったら>>64 がヒットした。 x64のgcc4.7以降でソースからコンパイルすると途中でcc1plusが止まった x64のvc9じゃ止まらない。更新途絶えてるから修正期待するのは無理か >>64 >>542 共有ライブラリもしくはモノリシックライブラリをビルドする場合、公式のMinGWだとメモリを使い果たしてしまう TDM-GCCに切り替えた上で CXXFLAGS='-fno-keep-inline-dllexport' を付けて configure実行するよろし これはwxWidegts側のバグと言うよりもMinGWのバグだ >>543 あらゆるオプションくっつけてもダメだった FLTKはvcでもgccでも問題なかったんだけどな、これgccじゃなくてmingw側の問題なのか wxWidgetsってVisualStudio2012で動く? >>545 普通にVS2012でビルドして使ってるよ 昨晩発見、mingw-w64-dgnってトコのパッチ当てたらx64MinGWでもビルド出来た。 gccはTDM4.7.1、時間が無いのでconfigureのオプションくっつけて無いけど一発で通った 具体的には、textentry.cppの#include <shlguid.h>を削除するだけ ハードディスクのMBR領域をバックアップしたいんだけど どうやってプログラム書いたらいいかな Linuxのときは/dev/sdaを開いて読むだけだったけど Windowsとコード一緒にできない wxPythonなんですがベジエ曲線を書くにはどうすれば良いですか? Latest Development Release: 2.9.4 Current Stable Release: 2.8.12 Previous Stable Release: 2.6.4 http://www.codeproject.com/Articles/11515/Introduction-to-wxWidgets Mac OSX LionだとwxWidgets 2.8 がビルドできない・・・ wxWidgets 2.9ビルドするとダイナミックリンクライブラリが一部作成されない・・・ Mac PortのwxWidgets-devをダウンロード するのが一番良さげ あとMac OSXでpthreadをバイナリにリンクさせたらいきなり実行ファイルが落ちやがる 罠多すぎだろあのOS ttp://www.HackInt0sH.org/ wxWidgets-2.9.5では>>429 で言ってたバグが直ってるぞ、やったぜ みなさんお世話になりました 明日で2ch終了らしいので 今のうちに最後のご挨拶をしておきます wxWidgetsのコミッタのVadim ZeitlinがC++11でwxWidgets書いてるぞ wxWidgets and C++ 11 http://wxwidgets.blogspot.com/2013/08/wxwidgets-and-c-11.html >>566 昔から何度も提唱されてるブラウザによる全てのGUIの描画ですか Googleは達成できるか mozillaに出来なくともgoogleになら出来る >>572 どうしてるんだろうな そのプロジェクト... 3もRC2まで行ってるし、次は今月中に正式版出るかな 出たとしたらLinuxのパッケージにwx-3.0が出て使えるようになる 楽しみ おいおい3.0だぞ?出たんだぞ?なんでこんなに盛り上がんないんだよ… メインの機能追加がUnicode対応だからなぁ 今までも別に日本語使えなかったわけではないし 何言ってだこいつ unicodeは前から使えてるっての 所感 ・Mac向けビルドの安定化 ・wxwebviewが全ポートで使える → ネットワーク接続して、html, Javascriptの解釈可能に ・aui系のバグ修正と見た目の品質向上 ・c++11, clang対応 ・その他即死系のバグ修正 間違ってたらすまん とりあえず2.9で出てたバグは直ってるはず あと>>364 で出てたUTF-8以外の文字列からの変換とかどうなったんだろ うまく変換できてるなら嬉しいけど その他にもクラスは2.8の時より増加してるよね MinGW gcc + wxWidgets 2.8.12で作っていたプログラムを3.0.0で作り直したら、 ウィンドウリサイズ時のwxStaticText、wxCheckBox、wxListBoxのフリッカーが見るに耐えんレベルになった。 かと言ってSetDoubleBufferを使うとリサイズがモタつく上に、何故かwxRadioBoxの枠線が消えるんだよなー。 仕方ない、一つ一つwxEVT_ERASE_BACKGROUNDを潰す作業を初めるか…。 gcc4.8で動くなら使う x86_64-w64-mingw32じゃ、2.9はとうとうビルドさえ無理だった 4.8だとやっぱりcc1plusが停止した、しかも2.9と同じファイル 公式から落としてきたライブラリ使ってもリンクに失敗 4.7ならライブラリのビルドもリンクも問題なし あ、やっぱ出来た パラレル無しでビルドするか>>543 の CXXFLAGS='-fno-keep-inline-dllexport' をつけると大丈夫みたい、後者だと1度止まるけど再ビルドすれば通るしサンプルもビルド出来た 連投失礼、>>584-585 は見なかった事にしてね 当方の環境、win7 64bit msys上からビルド、gccは4.9、静的リンクでビルド configureにCXXFLAGS="-fno-keep-inline-dllexport"をつけてもevent.cppで止まる その時あらためてmake CXXFLAGS="-fno-keep-inline-dllexport"としてビルドすると通る gcc4.8だと2.9はビルドでこけるしリンクも失敗するってのは国内外でよく見かけたし、実際俺も あきらめてたけど…ひょっとして2.9もこの方法で通ったのかなあ。 でも、なぜかサンプルのimage.exeだけ強制終了した(ビルドは可能) constexprも使えないコンパイラは要らないんですよ メタプログラミングって奴でしょ? 何が何だかサッパリ分からないよー。 つまり俺にはまだ早い代物だという事は承知してるが、 どういう用途で使うものなのか教えてほしい。 GCC3xの頃はvc++の方が速かった気がするけど、4.6から急激に速度が向上した気がする あくまで自作プログラムでの話だけどね ただ、gccでビルドされる様々なテストプロブラム見てるとvc++でビルドって安全性って意味 でヤバいんじゃないかって思っちゃうの >>591 実行時の計算オーダーを減らす機能。事前計算機能だね。 コンパイルタイムにできるだけ計算して結果を出しておくことで実行時の計算量を減らす。 ネットの変人がそれでレイトレーシングやったりしてる。 C++14のやつはそれなりに簡単だよ。 >>590 はちょっと冗談気味だが 正直VC++はC++とは言えない C++の機能を最大限活かす/楽しむにはgccやclangを使うべきだと思います 会社でプログラム書けと依頼されたらもしかしてVC++使うかもしれないけど chrome のブックマークバー、 IE のお気に入りバーのようなコントロールクラスを探しています。 全てのアイテムが編集可能でアイコンとテキストが表示されて そのアイテムの値のテキストを編集できるメニューを作りたいのですが 最適なコントロールクラスはどれか教えてください。 wx.Menu を使おうと思ったのですが、 右クリックやコンテキストメニューのイベントが Bind しても呼び出されず苦戦しています。 wx.ListCtrl を使った場合は右クリックのイベントは受けられるのですが、 左クリックのイベントが wx.EVT_COMMAND_LEFT_CLICK のみで これは MS Windows のみと書いてあるのでできたら使いたくありません。 これらのイベントについても誤りがあれば教えて欲しいです。 環境は wxPython 2.8-msw-unicode です。 よろしくお願いします。 >>596 理想の実装になるかわからない&C++しかわからないが wxMenuをそのまま使うのが良いと思います 実装の骨子 ・メニューの項目一つ一つにwxWindowID ( enum )を振る ・wxWindowIDはwxCommandEventで起動するようにしておく ・上記のwxCommandEventを処理する関数はenumをswitch文で処理する ・wxCommandEventはEVT_MENU_RANGEで定義しておく(enum値が 1000~1200の場合反応する関数を作るなど) アイテムを編集可能にするために ・EVT_UPDATE_UIをwxMenuに設定しておき、ユーザーがメニューの項目を触ったら更新を実施 右クリック ・wxのConnectとかBindでwxMouseEventをくっつければいいと思う ------------------------------------------------------- 上記をやろうとすると、ユーザーが設定した項目でループを回して常に更新かける 感じになるんじゃないでしょうか。 wxMenu *menu = new wxMenu; wxMenu *foo = new wxMenu; for ( ユーザーが設定した数だけループ ) { foo->Append(wxID_HOGEHOGE_RANGE + i , wxT("ユーザー設定項目1")); foo->Connect(); // 右クリックイベントを定義しておく } >>597 レスありがとうございます。 wxMenu に対して Connect/Bind を試してみたのですが、 クリックイベントは wxEVT_MENU または wxEVT_MENU_RANGE だけが呼び出されました。 LEFT_UP, RIGHT_UP, COMMAND_LEFT_UP, COMMAND_RIGHT_UP, CONTEXT_MENU のイベントを試しましたが、 こちらは EVT_MENU の有無にかかわらず呼び出されませんでした。 試したソースコード : http://codepad.org/S9vtw4yX wxEVT_MENU の際に右クリックか左クリックかわかれば処理を分岐できるのですが、 wxCommandEvent でクリックしたボタンの情報の取得方法がわかりません。 wxWindow::PopupMenu では wxMenu を参考にして GUI を作り出すようですが、 そこですでにイベントが途絶えているように思えてしまいます。 ウィンドウハンドルも得られないようだし、 ポップアップメニューにイベントを追加することはサポートされていないように感じます。 wx.ListCtrl でも思ったことなのですが、 wx.CommandEvent 系のイベントを使うコントロールクラスでは wx.MouseEvent 系のイベントは関連付けられないのでしょうか? >>598 う〜ん、メニュー上での右クリックは悲しいことにできなさそうね [wx-users] Trapping wxMouse events over wxMenus https://groups.google.com/d/msg/wx-users/xAGPwk-f9Ao/0BGV9JD55L4J この会話の中で、Vadimさん(wxWidgetsのコミッタ)が無理やでとか言ってる メニューの項目の中で右クリックするとイベントはメニューのほうに行ってしまう から、そのイベントをつかむのは無理だと。 で、それはWindowsとGTKのネイティブ実装がそうなっているから。 > Ideally, I would like to be able to left-click and > right-click WITHOUT the menu disappearing. This is impossible under the two main platforms: MSW and GTK. Menus grab the mouse when popped up (down?) and so all mouse events go to them. いや、ちょっと違うか メニューの右クリックイベントは掴めるけど その時呼び元のメニューの項目が消えるといってるのか その解決策としてはwxMenuを使わずに menuのウィジェットを自分でエミュレートするしかないとのこと >>599-600 ありがとうございました。 wxMenu を流用できないのは残念ですが、 これで踏ん切りがつけたので、 wxListCtrl を使ったものを試そうと思います。 引き続き、wxListCtrl のような wxControl 派生に対して wxMouseEvent 系のイベントをつける方法を求めていますので 何か参考になることがありましたらよろしくお願いします。 >>601 です。 >>596 について進展したので参考になればと思い報告します。 メニューアイテムの上で右クリックしてポップアップメニューを表示することが可能なクラスが wxPython にありました。 wx.lib.agw.flatmenu がまさにぴったりのクラスでした。 RIGHT_UP のイベントはありませんが、 FlatMenuItem::SetContextMenu(FlatMenu) で >>596 でしたいことが簡単にできます。 自作のために PopupWindow あたりを調べているときに見つけました。 また何かありましたらよろしくお願いします。 サンプルが多すぎて逆にわからないのですが、 ランタイム時にGUIパーツを生成消滅させることって可能ですよね? 例えばユーザが読み込んだファイルによってボタンの数を変化させるなど ありがとうございます 関連するサンプルなどありましたら教えていただけると幸いです そうなんですよね〜でもsample多くてどっから見ればよいか、という感じです まあできるということがわかればとりあえず見て回ります チュートリアルで最初の方から見ればすぐ出ると思う。 デモ実行してみて自分の欲しい機能と似たものを見つけたら「ソースを見る」をクリック。 すいません、見てるものが違うかもしれないので確認させてください チュートリアルとは何を指してますか? デモはdemosフォルダの中にあるプロジェクトですよね?「ソースを見る」とはなんでしょうか? ごめん。 見てるものが違った。 wxPython の方見てた。 wxPythonのDemo見て目星を付けて wxPythonのソースを参考にwxWidgetsでCソース書くのもあり なるほど wxPythonでコードを書いたものがC++に直接変換できたりしたら便利ですね wxGladeみたいに なんか久しぶりにwxスレが伸びてるぞ、新規ユーザー大歓迎 ボタンとかテキストエリアの動的な生成は、wxPanelとかwxSizerを使った簡単なサンプルを作ったら理解できると思う 言葉で説明するよりコード書いたほうがよいけど一応書いとく 例えばボタンを生成・削除しようとする場合 親Panelをparent, 子panelをchildとすると 1. ウィジェットの生成:parentをnewして、必要な分だけchildをnew child = new wxPanel(parent, …); ... 2. ウィジェットの削除:parent.DestoryChildren(); この関数で子ウィジェットを全部きれいに削除できる 説明の意味がわからなければ、まずは適当なチュートリアルサイトに行くべし おすすめ http://zetcode.com/gui/wxwidgets/ >>614 慣れたら直接C++で書けるから多分コンバータは需要無いよ >>615 詳しくありがとうございます 拝見致します >>616 wxGladeも要りませんかね? フローはwxGladeで枠を作って機能をC++で書く感じになるのかと どっちも1992年頃にできた。OSSといえども商業的な成功がコミュニティ形成の鍵。 それ以外はGood Oldを懐かしむロートルか宗教的価値観に支えられているだけ。 GUI比較スレってなんだよね・・・ 比較的な話ってここで展開してもよいものやら というかwxWidgetとQtどっちも使ってる人っているのか 世の中のアプリケーションはQtかAwt/Swingが採用される流れ。 直交性ならgtk。サクッと安定したものを書くならtk。 トイプログラムならSDL+OpenGL。生きるとは残酷なことである。 バイナリサイズでかいですな VC2010でサイズ最適化オプションかけてもHelloWorldで5MB... これはもうどうしようもない感じ? どうしようもないっす ベース部分(wxStringとかwxWindowとか)の定義が容量食ってるから?ではないかという疑惑 うーんなるほど ランタイムで色々判断出来るような設計なんですかねえ そうですねwxWidgetsはRTTIの仕組みが活かされてるみたいなドキュメントはどっかで見た たぶんwxWidgetsの中核であるwxWindowクラスはそんなんばっかしなんだろう ファイル操作系が異様にやりにくい wxString dir_name("some directly name"); dir_name.Traverse(some_traverser,wxString(""),flags); でディレクトリたどりながらファイル抽出できるかなとおもったが flags = wxDIR_FILES だとそのディレクトリの中身”のみ”探す flags = wxDIR_DIRS だとその下の”全ての”階層のディレクトリを抽出する wxDIR_DEFAULT だとその下の”すべての”ファイルを探す なんでこんな仕様なんだ ああわかった ディレクトリが見つかった場合のみその下も探す、ということなんだな するとファイルのみだと当然下なんぞ無いからそれ以下を探すことはなく ディレクトリのみ、とすると下にもいけるから最下層まで探そうとするわけか うーん 連投失礼 Traverserクラスを継承してそのOnDir関数の返り値で制御すればいいということでした 浮動小数点を扱えるsliderってデフォルトではなさそうですか? たとえば 0 - 100 を 10 で割ると 0.0 - 10.0 のレンジになります やっぱそんな感じなんすね 最大値最小値現在値ラベル表示が便利だなーとおもったんですが、小数点付きでやろうと思ったら 自分でラベル付けるしかなさそうですね 右側のボタンを押したら左側のパネルを再描写させたい、など あるイベントから(親でない)ほかのイベントを誘発させたい時ってあると思うのですが その辺に関する記事てどっかにあります? >>634 そのへんはイベント処理の領域になりますね wxWiki見るしかない感じ イメージとしては Sample::LeftPanelRedraw(wxCommandEvent& event); というイベント関数のIDがID_LeftPanelRedrawであった場合 そのイベントは wxCommandEvent e(wxCommandEvent(wxEVT_COMMAND_BUTTON_CLICKED, ID_LeftPanelRedraw)); LeftPanelRedraw(e); で呼べる glcanvasを使ってパネルを描写し、ドラッグに反応するようにしたのですが ドラッグ中に、ポインタがパネルの範囲外に出た時に、反応が止まってしまいます sampleのdragimagではドラッグ中であれば範囲外でもイベントが取れるようですが sampleのopengl/penguinだと取れないようです マウスイベントの接続は両者ともEVT_MOUSE_EVENTSで行っているので 何が違って取れているのかわかりません その辺の事情、どなたかご存知ないですか? わかりました wxWindowBase::wCaptureMouse()を呼び出すと以降座標とイベントが取得されるようです クロスプラットフォームの開発環境について調べてるんですが、wxWidgetsの GUIは外観とかは各プラットフォームのものが使われるんですか?それとも 独自のテーマになってしまうんでしょうか? read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる