Russian Qt Forum

Qt => Вопросы новичков => Тема начата: oBOXPOH от Мая 11, 2017, 11:31



Название: Обработка движения мыши MouseMove над элементом
Отправлено: oBOXPOH от Мая 11, 2017, 11:31
Всем здравствуйте!

Проблема следующая: не обрабатывается событие движения мыши над некоторым элементом.

Теперь подробнее.

Есть класс MainWindow, производный от класс QMainWindow. В его конструкторе задан созданный далее виджет, который устанавливается центральным. Код данного класса ниже:

Код:
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    inputHistogram = new HistogramWidget;
    setCentralWidget(inputHistogram);
}

MainWindow::~MainWindow() {}

Далее есть класс HistogramWidget, который выглядит следующим образом: QHBoxLayout -> QGroupBox -> QHBoxLayout -> QHBoxLayout -> QChartView -> QChart. Код данного класса ниже:

Код:
#include "histogramwidget.h"

HistogramWidget::HistogramWidget(QWidget *parent) :
    QWidget(parent)
{
    setMouseTracking(true);

    histogramMainLayout = new QHBoxLayout;
    histogramGroupBox = new QGroupBox(tr("Гистограмма"));

    histogramGroupBoxLayout = new QHBoxLayout;

    histogramChartLayout = new QHBoxLayout;
    histogramChart = new QChart;
    histogramChart->setTitle(tr("Визуализация данных"));

    histogramChart->installEventFilter(this);

    histogramChartView = new QChartView(histogramChart);
    histogramChartView->setRenderHint(QPainter::Antialiasing);

    histogramChartLayout->addWidget(histogramChartView);

    histogramGroupBoxLayout->addLayout(histogramChartLayout);

    histogramGroupBox->setLayout(histogramGroupBoxLayout);

    histogramMainLayout->addWidget(histogramGroupBox);

    setLayout(histogramMainLayout);

    sum = 0;
}

HistogramWidget::~HistogramWidget() {}

bool HistogramWidget::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == histogramChart && event->type() == QEvent::MouseMove)
    {
        QMessageBox::information(this, "", "");
        histogramChart->setTitle(QString::number(sum++));
    }

    return false;
}

Что хочется? Хочу обрабатывать событие движения мыши над QChart, но у меня это не выходит. Создал eventFilter, но по условию ничего не проходит. histogramChart->installEventFilter(this); используется, как и setMouseTracking(true); . В чём может быть проблема? Заранее спасибо!


Название: Re: Обработка движения мыши MouseMove над элементом
Отправлено: PimenS от Мая 11, 2017, 11:46
Используйте void QWidget::mouseMoveEvent(QMouseEvent *event)


Название: Re: Обработка движения мыши MouseMove над элементом
Отправлено: oBOXPOH от Мая 11, 2017, 11:50
Используйте void QWidget::mouseMoveEvent(QMouseEvent *event)

И каким образом мне его использовать, если мне нужно обрабатывать движение мыши только над QChart, а не над всем виджетом, в котором создаётся mouseMoveEvent?


Название: Re: Обработка движения мыши MouseMove над элементом
Отправлено: PimenS от Мая 11, 2017, 11:52
Используйте void QWidget::mouseMoveEvent(QMouseEvent *event)

И каким образом мне его использовать, если мне нужно обрабатывать движение мыши только над QChart, а не над всем виджетом, в котором создаётся mouseMoveEvent?

Так и переопределите его для QChart

Или попробуйте так:

Код:
bool HistogramWidget::eventFilter(QObject *watched, QEvent *event)
{
   if (watched != histogramChart)
       return false;

    if (event->type() == QEvent::MouseMove)  {
        QMessageBox::information(this, "", "");
        histogramChart->setTitle(QString::number(sum++));
        return true;
    }

    return false;
}


Название: Re: Обработка движения мыши MouseMove над элементом
Отправлено: oBOXPOH от Мая 11, 2017, 12:03
Используйте void QWidget::mouseMoveEvent(QMouseEvent *event)

И каким образом мне его использовать, если мне нужно обрабатывать движение мыши только над QChart, а не над всем виджетом, в котором создаётся mouseMoveEvent?

Так и переопределите его для QChart

Или попробуйте так:

Код:
bool HistogramWidget::eventFilter(QObject *watched, QEvent *event)
{
   if (watched != histogramChart)
       return false;

    if (event->type() == QEvent::MouseMove)  {
        QMessageBox::information(this, "", "");
        histogramChart->setTitle(QString::number(sum++));
        return true;
    }

    return false;
}

Тут я опять попробовал использовать mouseMoveEvent для всего виджета, но прикол в том, что обработчик исполняется только вне QGroupBox, т.е только во внешнем слое, наверное... Внутри - фиг! Код обработчика:

Код:
void HistogramWidget::mouseMoveEvent(QMouseEvent *event)
{
    histogramChart->setTitle(QString::number(sum--));
}

Даже тут не работает так, как надо! Неужели так коряво сделан Qt?


Название: Re: Обработка движения мыши MouseMove над элементом
Отправлено: PimenS от Мая 11, 2017, 12:16

Даже тут не работает так, как надо! Неужели так коряво сделан Qt?

В данном случае проблема не в Qt.

Создайте свой класс на основе QChart, переопределите там нужные методы и все будет работать.


Название: Re: Обработка движения мыши MouseMove над элементом
Отправлено: oBOXPOH от Мая 11, 2017, 12:31

Даже тут не работает так, как надо! Неужели так коряво сделан Qt?

В данном случае проблема не в Qt.

Создайте свой класс на основе QChart, переопределите там нужные методы и все будет работать.

Видимо, придётся так сделать. Но не особо понимаю, как мне поможет переопределение mouseMoveEvent, если влиять такое событие будет не на сам QChart, а на другой элемент в том же виджете. Можете подсказать?


Название: Re: Обработка движения мыши MouseMove над элементом
Отправлено: PimenS от Мая 11, 2017, 12:43
Вы писали

Цитировать
Хочу обрабатывать событие движения мыши над QChart

Цитировать
если влиять такое событие будет не на сам QChart, а на другой элемент в том же виджете

Для какого элемента вам нужно движение мыши отловить? Мне не совсем понятно.


Название: Re: Обработка движения мыши MouseMove над элементом
Отправлено: oBOXPOH от Мая 11, 2017, 12:58
Вы писали

Цитировать
Хочу обрабатывать событие движения мыши над QChart

Цитировать
если влиять такое событие будет не на сам QChart, а на другой элемент в том же виджете

Для какого элемента вам нужно движение мыши отловить? Мне не совсем понятно.

Я хочу обрабатывать движение мыши над QChart, но при движении такое событие должно влиять не только на сам QChart.


Название: Re: Обработка движения мыши MouseMove над элементом
Отправлено: PimenS от Мая 11, 2017, 14:36
Для этого у QChart есть сигналы