2012-03-09 9 views
5

Sto riscontrando un problema con il rilevamento dei movimenti del mouse in un QMainWindow. Ho un pulsante di commutazione buttonGenerate. Ecco il codice per la MainWindowQMainWindow non traccia il 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); 
} 

Quando il pulsante viene attivata, il mouse deve essere monitorato e la sua X & coordinate Y insieme se è abilitata o non dovrebbe essere mostrato in label_5. Quando il pulsante è disattivato, il tracciamento del mouse dovrebbe essere disattivato e label_5 non aggiornato. Questo non è il caso.

Indipendentemente dal fatto che il pulsante sia premuto, il mouse non viene tracciato. Solo quando tengo premuto un pulsante del mouse verrà aggiornato label_5 e questo è indipendentemente dal fatto che sia attivo setMouseTracking(bool).

Qualsiasi intuizione sarebbe molto apprezzata.

+0

Hai verificato che 'checked' in' on_buttonGenerate_toggled' è 'true' quando ti aspetti che sia? –

+0

Sì, l'argomento '% 3' è 1 quando attivato. – nerozehl

+0

Ma si vede solo quando si preme il pulsante del mouse - mi sembra una possibilità che la pressione del mouse settaggi temporaneamente 'hasMouseTracking' su 1. Quindi lo verificherei in' on_buttonGenerate_toggled'. –

risposta

12

Succede perché Qt designer crea un widget "nascosto" in QMainWindow, come si può vedere nella generato ui_MainWindow.h:

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

Così è questo widget che riceve gli eventi del mouse e su cui i widget bambino sono posizionati, non la QMainWindow.

Se si inserisce:

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

nel costruttore della vostra MainWindow, vedrete gli eventi del mouse, ma non è possibile premere il pulsante perché questo widget centrale non riceve alcun evento del mouse a tutti.

Soluzione:

design un widget nella finestra di progettazione (con il tasto & etichetta), ignorare la sua mouseMoveEvent e fare un QMainWindow::setCentralWidget con esso.

+0

Ma la documentazione dice che gli eventi di movimento del mouse dovrebbero essere propogati? – nerozehl

+1

Viene propagato fino a quando non viene accettato, che è il caso di un widget a meno che non lo si crei "evento trasparente". – Koying

+1

Per poter tenere traccia dei widget secondari nella tua QMainWindow, devi chiamare 'setMouseTracking (true)' per ogni widget! – phyatt

1

È un argomento molto vecchio, mi dispiace ma ho appena trovato un'altra soluzione. Quando vuoi catturare gli eventi su tutta la finestra principale, puoi usare QApplication::notify(QObject* obj, QEvent* ev) semplicemente controllando se obj è la tua finestra e l'evento necessario, viene chiamato per ogni evento su ogni widget. Devi solo ereditare da QApplication e inserire il tuo lavoro nel metodo di notifica overrode. Penso che possa essere utile per chiunque abbia lo stesso problema.

Problemi correlati