2

Qt4.5 を使用して Qt/C++ でアプリを作成しようとしていますが、マウスオーバー イベントでアクティブなウィンドウの不透明度を変更したいと考えています...

私が理解しているように、Qtには明示的なマウスオーバーイベントはありません。

ただし、メインウィンドウを宣言するクラスで QWidget の mousemoveevent() を再実装することで、初歩的な機能を実現しました。しかし、マウスがそこに作成したグループボックスのいずれかの上を移動するたびに、メインウィンドウの mousemoveevent は呼び出されません (当然のことながら、QGroupbox には mousemoveevent の独自の再実装があるため)。

したがって、安価な回避策として、メインウィンドウの mousemoveevent を引き続き使用していますが、グローバルマウス位置をクエリし、メインウィンドウの (x,y) 位置 (->pos() で取得) とウィンドウサイズ ( -> サイズ -> rHeight および rWidth)、マウスがメインウィンドウの領域の境界内にあるかどうかを確認し、不透明度を変更します。

これは非常に限られた成功しか収めていません。右の境界線は正常に機能し、左の境界線は不透明度を 4 ピクセル早く変更します。上部が機能せず (おそらくマウスがメニューバーとタイトル バーを通過するため)、下部の変更が早すぎます。

空のコンテナ QWidget クラスを作成し、そこに残りをすべて配置することを考えましたが、子ウィジェットに既に実装されている場合、基本ウィジェットが mousemoveevent を受信しないという大きな問題はまだ解決されないと感じました。

私の方法で行った修正/エラー、またはこれを達成するための代替方法を提案してください。

psこれが問題になるとは思えませんが、VS2008へのQtの統合ではなく、Qt Creator IDEで作業しています(とにかく同じクラスです-ただし、コンパイラは異なります、mingw

4

3 に答える 3

2

子ウィジェットごとにイベントフィルターをインストールすると、うまくいく可能性があります。これにより、メインウィンドウがグループボックスからのイベントなどの子イベントを受信できるようになります。ここにサンプルコードがあります。

于 2009-04-21T02:40:27.187 に答える
2

イベント フィルターに興味があるかもしれません。QObject は、アプリケーションを高速で処理するすべてのイベントを傍受する方法を証明します。

http://doc.trolltech.com/4.5/eventsandfilters.html#event-filters

于 2009-04-21T02:48:27.510 に答える
1

あなたが何をしようとしているのか理解できたら、ウィジェットの enterEvent() と leaveEvent() を再実装します。マウス入力イベントはフェードインをトリガーし、leaveEvent はフェードアウトをトリガーします。

編集:何度か読み直した後でも、あなたが何を達成しようとしているのかまだわかりません. 私の提案が役に立たない場合は申し訳ありません。:-)

于 2009-04-21T02:52:19.140 に答える