QMainWindow не отслеживает мышь с помощью setMouseTracking () - PullRequest
6 голосов
/ 09 марта 2012

У меня проблема с отслеживанием движений мыши в QMainWindow. У меня есть кнопка buttonGenerate. Вот код для MainWindow

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).

Любое понимание будет с благодарностью.

Ответы [ 2 ]

15 голосов
/ 09 марта 2012

Это происходит потому, что Qt designer создает «скрытый» виджет в QMainWindow, как видно из сгенерированного ui_MainWindow.h:

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

Таким образом, именно этот виджет получает события мыши ина котором размещены дочерние виджеты, а не QMainWindow.

, если вы поместите:

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

в конструктор вашего главного окна, вы увидите события мыши, но вы не можете нажать клавишукнопка, потому что этот центральный виджет вообще не получает никакого события мыши.

Решение:

Создайте виджет в Designer (с кнопкой и меткой), переопределите его mouseMoveEvent и выполните QMainWindow::setCentralWidget с ним.

1 голос
/ 21 октября 2013

Это действительно старая тема, извините, но я только что нашел другое решение.Если вы хотите перехватывать события по всему MainWindow, вы можете использовать QApplication::notify(QObject* obj, QEvent* ev), просто проверив, является ли obj вашим окном, и необходимым событием, оно вызывается для каждого события в каждом виджете.Вам просто нужно унаследовать от QApplication и поместить вашу работу в метод уведомления о переопределении.Я думаю, что это может быть полезно для любого с той же проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...