2011-01-01から1年間の記事一覧

DockWidget の paintEvent

DockWidgetを継承したクラスで paintEvent を実装し、 QPainter painter( this ); painter.drawRect( .... ) という形で描画を行うと、floating状態だとクライアント内に描画が行われますが、dock状態だとタイトル部分に描画が重なってしまいます。なので、Q…

IMEを無効にできない

IMEが有効になっていると、keyPressEventが来なくなるようです。IMEを無効にするには、 setAttribute( Qt::WA_InputMethodEnabled, false ); http://doc.qt.nokia.com/latest/qt.html#WidgetAttribute-enumで良さそうに見えるんですが、さっぱり無効化してく…

Macでの不具合? (3)

不具合なのか仕様なのか分かりませんが、ついでに(笑)。MacでのDockWidgetは、Dock状態の時の Widget のリサイズがし辛いですね。ウィンドウ境界上にカーソルが来た時に、リサイズ用のカーソルに変化してくれない事が多いです。Windows版のように、きちん…

Macでの不具合? (2)

MainWindow でアプリを新規作成し、ビルドしてアプリを起動します。MainWindow上でマウス操作 (ぐるぐる円を描くなど) をするだけで、CPUの負荷が5〜6%まで上がります (最新のMacBook Air調べ)。Windowsでは無いことなので、Mac固有の現象なんでしょう。ちょ…

Macでの不具合? (1)

ちょっと古いSDKを使ってるので、その所為かもしれませんが書き留めておきます。 MainWindowでアプリを新規作成 ToolBarにQActionを幾つか追加して、それぞれsetStatusTipを設定しておく statusBarに addWidgetでラベルを幾つか追加する そしてビルドし、ア…

僕はJpegが読めない

自分の環境では、QImage や QImageWrite で jpg ファイルを読み書きできたんですが、Release出力にして他のPCに持っていったら、jpgの読み書きに失敗している事が分かりました…なんてこった(涙)。どうやら、デフォルトの状態ではJpegの読み書きに対応して…

MDIウィンドウを閉じる

QMdiAreaで子ウィンドウを沢山開いている時、MainWindowのcloseEventはどう処理すれば良いのでしょう? 最初、SubWindowのリストを一つ一つcloseしていったんですが、この方法だと、「保存していませんが閉じますか? Yes/No/Cancel」のようなダイアログで子…

Mac用アプリをリリースする

Mac版のQtCreatorでビルドをすると、*.app というバイナリが生成されます。Windows風に言うと、Mac用の実行ファイルですね。右クリックで「パッケージの内容を表示」すると、ディレクトリ構成になっていてファイルが色々入ってるのが分かります。 http://doc…

DockWidgetsの表示・非表示を一気に切り替えたい

QtのDockWidgetの表示・非表示を一時的に切り替えたいのですが、例えば、 dockWidget1->setVisible( false ); dockWidget2->setVisible( false ); dockWidget3->setVisible( false ); といった感じで「非表示になっているDockWidgetsを再表示」すると、DockW…

右クリック時のポップアップメニューを抑制したい

DockWidgetやToolbarの上で右クリックをすると、MainWindowに追加されているDockWidgetやToolbarのリストがポップアップ表示されてしまうのですが、これを抑制するクールな方法って無いものでしょうか? MainWindow::MainWindow(QWidget *parent) : QMainWin…

qCompress/qUncompress と zlibのinflate/deflate

http://d.hatena.ne.jp/QtCoder/20110819/1313717649 (圧縮・展開する以前、qCompressとqUncompressについて「zlibと互換みたい便利!」と書いたんですが、実際にzlibで生成したストリームをdecodeすると問題がありました。どうやら、qCompressで作った QByt…

QString と UTF-8の変換

お久しぶりです。QStringとUTF-8など別の文字コードを相互変換するには、QTextCodecを使います。便利すぎますね! #include <QTextCodec> std::string s; // UTF-8の文字が設定されてる、という事で QTextCodec* codec = QTextCodec::codecForName( "UTF-8" ); // UTF8 </qtextcodec>…

並列処理中のGUIの更新

OpenMP の parallel for の最中に GUIを更新したい場合があります。ループの全てでコールバックすると、クラッシュしてしまうので、メインスレッドの時だけ呼ぶようにすると大丈夫なようです。 int step = 0; #pragma omp parallel for for (int j=0; j<100;…

サブメニューを作る

お久しぶりです。QtCreatorのフォームデザイナ上でサブメニューを作成する方法が分からなかったので、コードで書く方法を取りました。なるほど、QActionじゃなくてQMenuを追加して、そこにサブメニューとなるQActionを追加するんですね。 QMenu* menu = new …

MacとWindowsのアプリケーション用アイコンを指定する

Qt用のアイコンリソースの用意の仕方は、検索すれば詳しい解説が出てきますので、そちらを参考ください。さて、MacとWindowsではリソースが異なるのですが、一つの *.pro ファイルでどうやって指定すれば良いのでしょう? QMAKEの解説を見ていたら、 win32:R…

saveState() と saveGeometry()

http://d.hatena.ne.jp/QtCoder/20110811/1313022743 (ToolBarやDockWidgetの状態を保存する以前、このような内容の記事を書きましたが、勘違いしてた所がありました。MainWindow の saveGeometry() によって、DockWidgetのサイズも保存されるかと思っていた…

QtCreatorでツールチェインを指定する

IDEっ子なので知らなかったのですが、ビルド時に使うコンパイラやリンカの指定を、ツールチェインと呼ぶみたいですね。昨日のトラブルも、コンパイラがVisualStudioのものになってたのが原因でした。このツールチェインは、QtSDKに入っている「Maintain Qt S…

uint8_t, uint32_t が使えなくなった

QtSDK (QtCreator) を最新版にしたら、uint8_t, uint32_t が使えなくなりました。 #include <inttypes.h> も使えないようで、困りました……どうしよう(涙)。 uint8_t byteVar = 0; uint16_t wordVar = 0; uint32_t dwordVar = 0; ……と思ったら、mingw32でなく、MSVCを使</inttypes.h>…

ShellExecute的な何か

指定のパスをExplorerやFinderで開いたり、指定のURLをブラウザで開きたい事があります。 // ブラウザで開く QUrl url = QUrl( "http://qt.nokia.com/title-jp/" ); QDesktopServices::openUrl( url ); // ExplorerやFinderでローカルパスを開く QString pat…

AppData的な何か

アプリケーションで使う設定ファイルは何処に保存するべきでしょう? 昔は実行ファイルと同階層に保存していましたが、これはOSのセキュリティの都合上、無理になってきました。Windowsなら「AppData」と呼ばれる、アプリケーション用のファイルを保存する場…

MacとWindowsでのキーイベントの挙動の違い

KeyPress/KeyReleaseイベントを監視していて、MacとWindowsで挙動の違いを見つけたので、メモっておきます。 bool MainWindow::event( QEvent *event ) { if (event->type() == QEvent::KeyPress) { QKeyEvent *ke = static_cast<QKeyEvent *>(event); QString s = tr("Ke</qkeyevent>…

Macだとホバー時の反応がない

Mac版のQtCreatorを使っていて気づいたんですが、QToolBar + QAction の、よくあるツールボタンを実装した時に、Windows版だとボタンの上をホバーした時に反応(表示の変化)があるんですが、Mac版だと反応が無いんですよね。 Macは、トップメニューのホバー…

アプリケーションの引数を取得する

アプリケーションにドラッグ&ドロップしたファイルリストを取得する方法です。どのタイミングで発生させるのがベストなんでしょうね? 最初のshowEventが無難でしょうか。 void MainWindow::showEvent( QShowEvent* event ) { // 一回だけ if (!mFirstShow)…

圧縮画像データをメモリ上に書き込む

jpgやpng形式の画像データを、ファイルでなくメモリ上に書き込みたい場合があります。できます。 #include <QBuffer> #include <QFile> #include <QImageWriter> // 画像を読み込む QImage img; img.load( "C:\\Users\\Public\\import.png" ); // メモリ上 (buf) にjpg形式で書き込む QBuff</qimagewriter></qfile></qbuffer>…

圧縮・展開する

データ列を圧縮・展開する方法です。qCompress(), qUncompress() を使います。compressionLevel がデフォルトだと、zlibのinflate/defltateを使うようです。zlibがデフォルトで組み込まれてるのは便利! http://doc.qt.nokia.com/latest/qbytearray.html#qCo…

モーダルダイアログを作る

QDialogクラスを継承し、accept(), reject() を発生させます。uiには ButtonBoxを貼り付けておきます。 private slots: void onAccept(); void onReject(); ソース部分です。ButtonBoxで発生されるSIGNALを受け取ります。 // コンストラクタ ui->setupUi(thi…

ウェブページを表示する

QtはWebkitをサポートしているので、アプリ内でウェブページを簡単に表示できます。先ずは *.proファイルでWebkitを使えるように指示します。 QT += webkit そしてソースコードです。CentralWidgetにGoogleを表示してみます。 #include <QtWebKit/QWebView> QUrl url( "http://w</qtwebkit/qwebview>…

ドキュメントを閉じる前に

編集中のドキュメントを保存しないで閉じる際、「保存しますか? (Yes/No/Cancel)」的な警告を出すのがアプリケーションのおもてなしです。Qtでは、closeEventをオーバーライドする事で実現可能です。 void FormChild::closeEvent( QCloseEvent* event ) { /…

メニューアイテム (QAction) の状態を切り替える

ドキュメントの状態によって、メニューアイテムの有効・無効、チェックの有無を切り替えたい時があります。Undoが出来ない時は、UndoアイテムはDisabledであるべきです。Qtのメニュー (QMenu) には、aboutToShow() という SIGNALがあるので、QMenuが表示され…

これがQtアプリだ!

アプリケーションの見た目や振る舞いというのは、アプリが「今時っぽい」のか「古臭い」のかを判断する、重要なポイントです。「これ、DOS時代のアプリじゃないの?」と思ってしまう程の悲しいアプリも、たまに見かけます。Qtでは、そういった点が非常に考え…