Russian Qt Forum
Ноябрь 24, 2024, 07:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обработка движения мыши MouseMove над элементом  (Прочитано 6274 раз)
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); . В чём может быть проблема? Заранее спасибо!
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #1 : Май 11, 2017, 11:46 »

Используйте void QWidget::mouseMoveEvent(QMouseEvent *event)
Записан
oBOXPOH
Гость
« Ответ #2 : Май 11, 2017, 11:50 »

Используйте void QWidget::mouseMoveEvent(QMouseEvent *event)

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

Сообщений: 371


Просмотр профиля
« Ответ #3 : Май 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;
}
« Последнее редактирование: Май 11, 2017, 11:57 от PimenS » Записан
oBOXPOH
Гость
« Ответ #4 : Май 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?
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #5 : Май 11, 2017, 12:16 »


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

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

Создайте свой класс на основе QChart, переопределите там нужные методы и все будет работать.
Записан
oBOXPOH
Гость
« Ответ #6 : Май 11, 2017, 12:31 »


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

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

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

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

Сообщений: 371


Просмотр профиля
« Ответ #7 : Май 11, 2017, 12:43 »

Вы писали

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

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

Для какого элемента вам нужно движение мыши отловить? Мне не совсем понятно.
Записан
oBOXPOH
Гость
« Ответ #8 : Май 11, 2017, 12:58 »

Вы писали

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

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

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

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

Сообщений: 371


Просмотр профиля
« Ответ #9 : Май 11, 2017, 14:36 »

Для этого у QChart есть сигналы
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.08 секунд. Запросов: 22.