2011-08-01から1ヶ月間の記事一覧

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では、そういった点が非常に考え…

QDockWidgetがリサイズできなかった

DockWidgetが、ドック状態の時に(マウス操作で)サイズ変更できなくて、ずっと困ってたんですよね。floatingの時はできるのに! 簡単なDockWigetアプリを作ってみると、ちゃんとresizeできる。でも、作りこんでるアプリの時は、resizeできない。何でだ!(…

ToolBarやDockWidgetの状態を保存する

http://d.hatena.ne.jp/QtCoder/20110810/1312993363 (設定を保存する Qtの特徴として、ToolBarやDockWidgetを使ったアプリケーション開発が挙げられますが、これらWidgetのフローティング状態や位置・サイズを保存しておくために、restoreGeometry、saveGeo…

設定を保存する

アプリケーションの設定などを簡単に保存できるように、QSettingsという便利なクラスがあります。設定の保存は、iniファイルまたはレジストリを選べます。とにかく便利なので、自作していた設定保存クラスとはおさらばですw 以下、設定クラスを開き、保存さ…

メニューアイテムにショートカットキーを指定する

指定の方法が沢山あって、超クールです! ui->action_FileNew->setShortcuts( QKeySequence::New ); ui->action_FileSaveAs->setShortcut( tr("Ctrl+Shift+S") ); ui->action_FileClose->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_W ) );

カーソルを設定する (Qt標準カーソル)

#include <QCursor> QCursor cur; cur.setShape( Qt::CrossCursor ); // cur.setShape( Qt::OpenHandCursor ); // cur.setShape( Qt::ClosedHandCursor ); setCursor( cur ); http://doc.qt.nokia.com/latest/qcursor.html (Qt標準カーソル一覧はこちら</qcursor>

MacかWindowsか判定する

色々とdefineされているようなので、それを使えばOKっぽいです。 #ifdef Q_WS_WIN // Windowsの場合に、仕方なく特別処理するコード #endif #ifdef Q_WS_MAC // Macの場合に、仕方なく特別処理するコード #endif http://doc.qt.nokia.com/latest/qtglobal.ht…

keyReleaseが勝手に発行される

キーボードを押した時、keyPressイベントが発行されますが、押し続けていると「オートリピート」という状態になり、キーを離してないのにkeyReleaseイベントも発行されてしまいます。keyReleaseイベントがオートリピートで起きたのか否かは、isAutoRepeatで…

MouseMoveが来ない!?

QtのWidgetは、デフォルトでは「MouseDown状態」でないとMouseMoveイベントが飛んで来なくてハマります。コンストラクタで setMouseTracking を呼んでやりましょう。 WidgetHoge::WidgetHoge( QWidget *parent) : QWidget(parent) { // マウスボタンを押して…

OS標準のファイルダイアログを使う

Qt標準のファイルダイアログは、普通のアプリで目にするものと大分見た目が違います。申し訳ないですが、「何この怪しいソフト」って思われても仕方ありません。というわけで、特にこだわりが無いのなら、OS標準のファイルダイアログを使っておきましょう。 …

デスクトップのパスを取得する

デスクトップやTempディレクトリなどの、特別なフォルダ (Special Folders) のパスを得るのには、QDesktopServices::storageLocationを使います。 #include <QDesktopServices> // デスクトップのパスを取得 QString folder = QDesktopServices::storageLocation( QDesktopServ</qdesktopservices>…

イベントハンドラ、connect、SIGNAL、SLOT

GUIアプリというのは、マウスやキーボードなどの外部からのイベントに対応して処理を書く、イベントドリブン方式でプログラムを書きます。古くはWin32のメッセージから、今時ならActionScriptのイベントリスナーなど、徐々に記述の仕方は洗練されています。 …

文字化けを防ぐ

UTF8でコードを書いていると、ラベルやタイトルに日本語で文字列を設定した時、文字化けします。そんな時、予めこう宣言しておくと、文字化けしなくなります。 #include <QTextCodec> QTextCodec::setCodecForTr( QTextCodec::codecForName("utf8") );</qtextcodec>

プロジェクトを移動させる

Qtのプロジェクトはシンプルで、移動させるのも簡単ですが、ひとつだけハマる事が。*.userファイルも一緒に移すと、何故だかビルドできなくなります。環境ごとの設定だったりするんでしょうか? というわけで、私はサクっと消してしまっています(笑)。特に…

OpenMPを使う

QtCreatorでOpenMPを使う方法です。先ず、*.proファイルに以下を追加します。OpenMPのヘッダを使えるようになります。 QMAKE_CXXFLAGS += -fopenmp LIBS += -fopenmp OpenMPは、pthreadGC2.dll というDLLを使うので、debugフォルダ、releaseフォルダに配置し…

timeGetTime、getTickCount的な処理

Win32における、timeGetTime や getTickCount のような、処理時間をミリ秒で測定する場合の便利なクラスがあります。 #include <QElapsedTimer> QElapsedTimer et; et.start(); ///////////////////////// // 計測したい処理をここに ///////////////////////// qint64 t = </qelapsedtimer>…

拡張子を判定する

QFileInfoというクラスがあるので、ファイル名を渡して、suffix() メソッドで拡張子を取得できます。 QFileInfo fi; fi.setFile( fileName ); QString ext = fi.suffix(); ext = ext.toLower(); if (ext == "png") img.save( fileName, "PNG" ); if (ext == …

謎のエラーメッセージ

QtCreatorでビルドしていると、 “error: collect2: ld returned 1 exit status” という謎のエラーメッセージが出力されます。「何が原因なの!?」って思いますが、「4. コンパイル出力」タブを開くと理由が出てます。「プロジェクトに追加してなかった」と…