2012-03-09 29 views
5

QMainWindowでマウスの動きを追跡する際に問題があります。私はトグルボタンbuttonGenerateを持っています。ここでボタンがトグルされるMainWindowQMainWindowはsetMouseTracking()でマウスを追跡しません

class MainWindow : public QMainWindow, private Ui::MainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 

protected: 
    void mouseMoveEvent(QMouseEvent *); 

private slots: 
    void on_buttonGenerate_toggled(bool checked); 
}; 

void MainWindow::mouseMoveEvent(QMouseEvent *event) 
{ 
    label_5->setText(tr("%1 %2 %3") 
        .arg(event->x()) 
        .arg(event->y()) 
        .arg(hasMouseTracking())); 

    event->ignore(); 
} 

void MainWindow::on_buttonGenerate_toggled(bool checked) 
{ 
    buttonGenerate->setText(checked 
          ? tr("Stop") 
          : tr("Start")); 
    setMouseTracking(checked); 
} 

ためのコードであり、マウスを追跡し、そのX & Yは、トラッキングが有効であるか、label_5に示されるべきであるか否かと一緒に座標されるべきです。ボタンをオフにすると、マウスのトラッキングはオフになり、label_5は更新されません。これはそうではありません。

ボタンが押されているかどうかにかかわらず、マウスは追跡されていません。私がマウスボタンを押したままになると、label_5が更新されます。これはsetMouseTracking(bool)がアクティブであるかどうかにかかわらずです。

洞察力があれば幸いです。

+0

あなたは 'on_buttonGenerate_toggled'で' checked'が期待どおりに 'true'であることを確認しましたか? –

+0

はい、 '%3'引数はトグル時に1です。 – nerozehl

+0

しかし、あなたはマウスボタンを押している時だけ、マウスのプレスが一時的に 'hasMouseTracking'を1に設定する可能性があると私に気付きます。それで' on_buttonGenerate_toggled'で確認します。 –

答えて

12

生成ui_MainWindow.hに見られるようにQtのデザイナーは、QMainWindowに「隠された」ウィジェットを作成しますので、それが起こる:

[...] 
centralWidget = new QWidget(MainWindow); 
[...] 
MainWindow->setCentralWidget(centralWidget); 

したがって、それはマウスイベントと上の子ウィジェットを受け取り、このウィジェットですQMainWindowではなく、配置されます。

あなたが置いた場合:あなたのメインウィンドウのコンストラクタで

centralWidget()->setAttribute(Qt::WA_TransparentForMouseEvents); 
setMouseTracking(true); 

を、あなたは、マウスイベントが表示されますが、この中央のウィジェットは、すべての任意のマウスイベントを受信しませんので、あなたはボタンを押すことができません。

ソリューション:

デザイン(ボタン&ラベル付き)Designerのウィジェット、そのmouseMoveEventをオーバーライドして、それをQMainWindow::setCentralWidgetを行います。

+0

しかし、ドキュメントでは、マウスの移動イベントを伝える必要がありますか? – nerozehl

+1

これは受け入れられるまで伝播します。これは、ウィジェットが「イベントトランスペアレント」にならない限り、ウィジェットの場合です。 – Koying

+1

QMainWindowのサブウィジェットの上を追跡できるようにするには、各ウィジェットに対して 'setMouseTracking(true)'を呼び出す必要があります! – phyatt

1

本当に古い話ですが、申し訳ありませんが、他の解決策が見つかりました。 すべてのMainWindowでイベントをキャッチする場合は、objがウィンドウであり、必要なイベントであるかどうかをチェックするだけで、すべてのウィジェットのイベントごとに呼び出されます。QApplication::notify(QObject* obj, QEvent* ev)を使用できます。 QApplicationから継承し、作業をoverrode notifyメソッドに入れるだけです。私はそれが同じ問題を抱えている人には便利だと思います。