2017-06-18

Qtメモ

自分がQtを使う上で知ったことなどの備忘録です。

 

 

Tips

豆知識集です。

スクロールバーの幅を取得する

style()->pixelMetric(QStyle::PM_ScrollBarExtent)

SVG形式のアイコンを使うとき

iconengines/qsvgicon4.dll が必要

Windowsでプラグインファイル(文字エンコーディング用DLL等)を読み込んでくれない対処

QApplication::addLibraryPath(qApp->applicationDirPath());

プログラムの起動時にShiftキーが押されていたら分岐する

if (QApplication::queryKeyboardModifiers() & Qt::ShiftModifier) {
}

チェックボックスをクリックする度に広がったり縮んだりするダイアログボックス

  1. ダイアログボックスをグリッドレイアウトにする
  2. layoutSizeConstraintをSetFixedSizeに設定

サンプルプログラム

ウィンドウの右上の?ボタンを消す

ウィンドウフラグから Qt::WindowContextHelpButtonHint を除去。

例:

Qt::WindowFlags flags = windowFlags();
flags &= ~Qt::WindowContextHelpButtonHint;
setWindowFlags(flags);

Windowsでシステムメニューの「サイズ変更」を無効(グレー表示)にする

ウィンドウフラグに Qt::MSWindowsFixedSizeDialogHint を付与。

例:

Qt::WindowFlags flags = windowFlags();
flags |= Qt::MSWindowsFixedSizeDialogHint;
setWindowFlags(flags);

ボタンを押すとスライダーがポップアップするサンプル

こちら

フォントサイズ(ポイント)から画面上のサイズ(ピクセル)を求める

pixel = point * QApplication::desktop()->physicalDpiY() / 72;

画面上のサイズ(ピクセル)からフォントサイズ(ポイント)を求める

point = pixel * 72 / QApplication::desktop()->physicalDpiY();

ボタンをハイパーリンクっぽい見た目にする

スタイルシートで工夫する。

例:

QString style =
"* {\n"
"border: 0;\n"
"background: transparent;\n"
"color: #0000ff;\n"
"text-decoration: underline;\n"
"}\n";
ui->pushButton->setStyleSheet(style);

もうちょっと真面目に実装したもの

Qtライブラリのバージョンを取得する

コマンドライン : qmake -v
コンパイル時 : QT_VERSION_STR マクロ
実行時 : qVersion() 関数

コンボボタン

普通のボタンと矢印ボタンが一体化したもの。

こちら

相対パスを指定してライブラリをリンク

.pro ファイルに、次のように記述する。

LIBS += $$PWD/lib/mylib.lib

または、

LIBS += -L$$PWD/lib -lmylib

QNetworkAccessManagerで同期通信

外部リンク: http://qiita.com/_nus/items/98cfedc8a344540251b5

メインウィンドウに設置されているドックウィジェットを列挙する

void MainWindow::on_action_test_triggered()  
{
	QList<QDockWidget *> dockWidgets = findChildren<QDockWidget *>();
	for (int i = 0; i < dockWidgets.size(); i++) {
		qDebug() << dockWidgets[i]->windowTitle();
	}
}

出典:http://www.qtcentre.org/threads/22812-How-to-get-list-of-DockWidgets-in-QMainWindow

ウィンドウを閉じてもプロセスが終了しない場合、以下のいずれかを試してみる

※Qt::Toolフラグを付与したウィンドウなどの場合、上記1番目の方法が有効。
参考
参考

ペンタブレットの軌跡が飛び跳ねたようにガタガタになる対策

QTabletEvent::pos()は、時々ずれた座標を返すことがあるっぽいので、信用しない方がいい。

代わりに、mapFromGlobal(QCursor::pos())を使用する。

メッセージボックス標準アイコンを取得する

QIcon icon = style()->standardIcon(QStyle::SP_MessageBoxWarning);

環境依存文字を含むシフトJIS文字列を変換する

「㈱」をはじめとした、厳密にはシフトJISではない、Windows等でコードページ932として知られる、シフトJISの亜種に対応する方法。

プログラムの開始時(main関数の初めの方で)、

putenv("UNICODEMAP_JP=cp932");

を実行しておく。その後、

QTextCodec *sjis_codec = QTextCodec::codecForName("Shift_JIS");

のように、テキストコーデックを取得する。

※ cp932 以外にも、 nec-vdc 、 ibm-vdc 、 udc など、ベンダー依存文字や、ユーザー定義文字にも対応している模様。

QPlainTextEditでドラッグアンドドロップ編集を無効化する

マウスボタンが押されたら、基底クラスが処理するより前に、選択を解除します。

void MyPlainTextEdit::mousePressEvent(QMouseEvent *e)
{
QTextCursor c = textCursor();
c.setPosition(c.selectionEnd());
setTextCursor(c);
QPlainTextEdit::mousePressEvent(e);
}

Windows 7 でグラデーションのかかった薄い青の選択フレームを描画する

void MyWidget::paintEvent(QPaintEvent *)
{
QPainter pr(this);
QStyleOptionViewItem o;
o.state = QStyle::State_Selected | QStyle::State_Active;
o.rect = rect().adjusted(4, 4, -4, -4);
o.showDecorationSelected = true;
qApp->style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &o, &pr, 0);
}

その他いろいろ

外部リンク: http://mf-atelier.sakura.ne.jp/mf-atelier/modules/tips/program/Qt/