2012-03-09 17 views
5

Tengo un problema con el seguimiento de los movimientos del mouse en un QMainWindow. Tengo un botón de alternar buttonGenerate. Aquí está el código para el MainWindowQMainWindow no rastrea el mouse con 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); 
} 

Cuando el botón se activa en, el ratón debe ser localizado y sus X & coordenadas Y junto con el hecho de seguimiento está habilitado o no debe aparecer en el label_5. Cuando el botón está desactivado, el rastreo del mouse debe estar desactivado y label_5 no actualizado. Este no es el caso.

Independientemente de si se presiona el botón, no se está siguiendo el mouse. Solo cuando mantengo presionado un botón del mouse, se actualizará label_5, independientemente de si setMouseTracking(bool) está activo.

Cualquier observación sería muy apreciada.

+0

¿Ha verificado que 'checked' en' on_buttonGenerate_toggled' es 'true' cuando espera que lo sea? –

+0

Sí, el argumento '% 3' es 1 cuando se alterna. – nerozehl

+0

Pero solo lo ve cuando presiona el botón del mouse, me parece una posibilidad que la pulsación del mouse establezca temporalmente 'hasMouseTracking' en 1. Así que lo verificaría en 'on_buttonGenerate_toggled'. –

Respuesta

12

Sucede porque diseñador Qt crea un widget "oculta" en QMainWindow, como puede verse en el generaron ui_MainWindow.h:

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

Por lo tanto, es este widget que recibe los eventos de ratón y en el que los widgets hijos se colocan, no QMainWindow.

Si coloca:

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

en el constructor de su MainWindow, verá los eventos de ratón, pero no puede pulsar el botón, porque este widget centro no reciben ningún evento de ratón en absoluto.

Solución:

Diseño de un widget en el diseñador (con el botón & etiqueta), anular su mouseMoveEvent y hacer un QMainWindow::setCentralWidget con él.

+0

¿Pero la documentación dice que los eventos de movimiento del mouse deberían propocionarse? – nerozehl

+1

Se propaga hasta que se acepta, que es el caso de un widget a menos que lo haga "evento transparente". – Koying

+1

Para poder seguir la pista de los widgets secundarios en su QMainWindow, debe llamar a 'setMouseTracking (true)' para cada widget. – phyatt

1

Es un tema muy viejo, lo siento pero acabo de encontrar otra solución. Cuando desee ver eventos en MainWindow, puede usar QApplication::notify(QObject* obj, QEvent* ev) simplemente marcando si obj es su ventana y el evento necesario, se llama para cada evento en cada widget. Solo necesita heredar de QApplication y poner su trabajo en el método de notificación de anulación. Creo que puede ser útil para cualquier persona con el mismo problema.

Cuestiones relacionadas