Qt で cout の出力が表示されない


はじめに

簡単な Qt コンソールアプリケーションを作ってみようとして躓いてしまったので、記録しておきます。Ubuntu で Qt コンソールアプリケーションを作成する場合、cout が何も表示しない場合があるという現象です。私の試した環境は、

  • Ubuntu MATE 14.10 (64bit)
  • Qt 5.4.1

です。Windows (VS 2013) では問題無いことを確認しています。

cout の出力が表示されない

以下のような単純なコンソールアプリケーションを Qt で書いてみました。

これを実行したところ、以下のように何も表示されませんでした。
cout_nothing

試しに “cout” を “cerr” に変更すると、以下のように正しく表示されることがわかりました。
cerr

バッファがフラッシュされていない

c++ – Qt standard output. cout does no print – Stack Overflow を見て、”endl” を追加してみました。

改行が追加されましたが、正しく表示されました。
cout_endl

cout の場合、endl が無いとバッファがフラッシュされないようです。ということはバッファを強制的にフラッシュしてしまえば良いので、以下のように endl でなく flush にしてみました。

cout_flush

これなら改行されません。Ubuntu 上では、flush を忘れないようにする必要がありますね。

[参考サイト]
c++ – Qt standard output. cout does no print – Stack Overflow

Xubuntu でキーボードバックライトを調整する


はじめに

ASUS のノートパソコン G75VW に Xubuntu (13.10) をインストールしたところ、キーボードのバックライトが点きっぱなしになってしまいました。Windows が載っていたときは Fn + F3/F4 でバックライトが調整できたのですが、Xubuntu ではまったく機能しません。電源をつないだまま使用しているのでバッテリーの消費は気にしなくても良いのですが、やはり精神衛生上よくありません。それで色々と調べてみました。

対処方法は

すると、このサイトで、ASUS G74SX での対処法が紹介されていました。試してみると G75VW でもうまく動作しました。内容は以下の通りです。

/sys/devices/platform/asus-nb-wmi/leds/asus::kbd_backlight/brightness
というファイルを root 権限で開き、そこにある数値を 0 にすればバックライトオフ、3 にすればバックライト最大ということです。
(私の環境では 3 = 最大になっていました。)

スクリプトによる調整

また、Script for controlling the backlight in the ASUS G74SX にあるスクリプトを利用すると、簡単に一段階ずつ調整できます。使い方は以下の通り。

  1. スクリプトを適当なファイル名で保存する (例: kblight.sh)
  2. 実行権限を付与する
  3. 1段階暗くするには、
  4. 1段階明るくするには、

以上で、G75VW のキーボードバックライトを調整できるようになりました。恐らく ASUS の他のノートパソコンにも有効な方法だと思われます。他メーカーの場合は、/sys/devices/platform/ 以下を探して該当するファイルを見つければ対応できるかもしれません。

[参考]
Tim Hentenaar’s Blog

PySide での show メソッドと geometry の挙動


PySide を使って Linux/Windows で動作するアプリケーションを作成しています。最近、QMainWindow の “geometry” プロパティの挙動が Linux と Windows とでは異なるためにいろいろと戸惑ったので、実際に調べてみました。

はじめに

私がやりたかったのは、

メインウインドウを最大化、最小化、フルスクリーン化した後、ウインドウの現在のサイズをコード上で知る

という事です。QWidget.showMaximized/Minimized/FullScreen メソッドを実行することで、表示されるウインドウサイズを変化させる事はできます。(リファレンスでは、showFullScreen() は X Window ではうまく動かない可能性がある旨記述がありますが、私の利用範囲では今のところ不都合ありません。) しかし、以下で述べるように、コードから現在の表示サイズを知るのは、Windows ではうまくいきますが、Linux ではうまくいきませんでした。

調査方法

QMainWindow に対して、show, showMaximized, showMinimized, showFullScreen, showNormal, setGeometry の各メソッドを実行して、”geometry” プロパティがどのように変化するのか表示するプログラムを作成しました。
イベントループに入ってからメソッドを実行しないとウインドウが表示された状態の値を確認できないため、QTimer で 100msec の遅延を発生させてから実行しています。(ウインドウが表示されるため、実行時に多少画面がちらつきます。)

結果

1920×1080 のスクリーンサイズを持つ同一 PC (Windows をホスト、Linux をゲストとした VirtualBox 環境) にて、上記 checkShow.py を Windows7, Xubunutu13.04, Ubunutu13.04 で実行した結果を以下にあげます。各段階での “geometry” プロパティの値を一覧にしています。(実際の表示の冗長な部分は削って有ります。)
※QRect の値は、最初の2つのパラメータが位置(左上の座標)、次の2つが大きさ(横x縦)です。

Windows の場合

Xubuntu/Ubuntu の場合

Xubuntu と Ubuntu では結果は同じでした。

まとめ

上記の結果から、”geometry” プロパティに関して以下の事がわかりました。

  • Windows / Linux 共に、show() の実行前は、仮の値として (0, 0, 640, 480) が入っている(VGA サイズということかと思われます)。
  • show() を実行すると、両者ともサイズは 200×100 に変化する。ただし、表示位置は OS によって異なる。Linux では左上隅に、Windows ではやや右下にシフトした位置になる。
  • Windows では、showMaximized/FullScreen/Normal の実行後、”geometry” は実際に表示されたウインドウのサイズに設定されるが、Linux ではこれらのメソッドは “geometry” を変化させない。(表示そのものは、最大化/フルサイズ/通常化します。つまり、表示されている状態と “geometry” の値が一致しません。)
  • Windows でも (Linux も) showMinimized() は、”geometry” を変化させない。おそらく、ウインドウをただ見えなくしているだけという事だと思われる。
  • もちろん、setGeometry() は、Windows / Linux 共に “geometry” を変化させる。

この結果から、Windows であれば、実際にウインドウが表示されていれば現在のウインドウサイズを “geometry” プロパティから知ることができますが、Linux の場合には “geometry” と現在のウインドウサイズが一致していない可能性があることがわかります。Linux では、自前で大きさを計算して setGeometry() で設定しないと両者を一致させられないようです。

[関連サイト]
junf/checkshow

[関連記事]

[参考にしたサイト]