2012-03-09 10 views
5

Mam problem ze śledzeniem ruchów myszy w QMainWindow. Mam przycisk przełącznika buttonGenerate. Oto kod na MainWindowQMainWindow nie śledzenia myszy z 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); 
} 

Gdy przycisk zostanie przełączony na mysz powinny być śledzone, a jej współrzędne X & Y wraz z czy śledzenie jest włączone czy nie powinny być wykazywane w label_5. Gdy przycisk jest wyłączony, śledzenie myszy powinno być wyłączone, a etykieta_5 niezaktualizowana. Nie o to chodzi.

Bez względu na to, czy przycisk jest naciśnięty, mysz nie jest śledzona. Dopiero, gdy przytrzymam przycisk myszy, aktualizacja zostanie zaktualizowana i nie ma znaczenia, czy aktywna jest funkcja setMouseTracking(bool).

Każdy wgląd byłby bardzo doceniony.

+0

Czy zweryfikowałeś, że 'checked' w' on_buttonGenerate_toggled' ma wartość 'true', kiedy się tego spodziewasz? –

+0

Tak, argument '% 3' ma wartość 1 po włączeniu. – nerozehl

+0

Ale widzisz tylko, że kiedy naciskasz przycisk myszy - wydaje mi się, że mysz może chwilowo ustawić 'hasMouseTracking' na 1. Więc zweryfikuję to w' on_buttonGenerate_toggled'. –

Odpowiedz

12

Zdarza się, bo Qt designer tworzy „ukrytą” widżet w QMainWindow, jak widać na wygenerowany ui_MainWindow.h:

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

Tak więc jest to widget, który odbiera zdarzenia myszy i na którym widżety dziecko są umieszczone, a nie QMainWindow.

jeśli miejsce:

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

w konstruktorze swojej MainWindow, zobaczysz zdarzenia myszy, ale nie można nacisnąć przycisk bo to centralny widżet nie otrzymują żadnego zdarzenia myszy w ogóle.

Rozwiązanie:

Projekt widget w kreatorze (przyciskiem & etykiecie), zastępują jej mouseMoveEvent i zrobić QMainWindow::setCentralWidget z nim.

+0

Ale dokumentacja mówi, że ruchy myszy powinny być propagowane? – nerozehl

+1

Jest propagowany, dopóki nie zostanie zaakceptowany, co ma miejsce w przypadku widgetu, chyba że sprawisz, że stanie się on "przezroczysty". – Koying

+1

Aby móc śledzić na widetach podrzędnych w twoim QMainWindow, musisz wywołać 'setMouseTracking (true)' dla każdego widżetu! – phyatt

1

To naprawdę stary temat, przepraszam, ale właśnie znalazłem inne rozwiązanie. Gdy chcesz przechwycić zdarzenia w całym MainWindow, możesz użyć QApplication::notify(QObject* obj, QEvent* ev) po prostu sprawdzając, czy obiekt jest twoim oknem i potrzebne wydarzenie, jest wywoływany dla każdego zdarzenia na każdym widżecie. Musisz tylko odziedziczyć po QApplication i umieścić swoją pracę w nadrzędnej metodzie powiadamiania. Myślę, że może być przydatny dla każdego, kto ma ten sam problem.

Powiązane problemy