Russian Qt Forum

Qt => Вопросы новичков => Тема начата: HoneyDimon от Февраль 25, 2015, 05:40



Название: Не могу разобраться с MouseMoveEvent
Отправлено: HoneyDimon от Февраль 25, 2015, 05:40
Прошу помощи.
Решил разобраться с void MouseMoveEvent(QEvent *);
конечно вначале почитал и маны и примеры. но в элементарной программе не работает. Подскажите где затык.
проект создаю в Qt Creatore, стандартное приложение QMainWindow.
код ниже:
Код:

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMouseEvent>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void mouseMoveEvent(QEvent * event);


private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindows.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setMouseTracking(true);
    centralWidget()->setMouseTracking(true);
   
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::mouseMoveEvent(QEvent *event)
{
    qDebug() << "1111111111111";
}


ui_mainvindow.h
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 5.2.1
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralWidget;
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QStringLiteral("MainWindow"));
        MainWindow->resize(400, 300);
        MainWindow->setMouseTracking(true);
        centralWidget = new QWidget(MainWindow);
        centralWidget->setObjectName(QStringLiteral("centralWidget"));
        MainWindow->setCentralWidget(centralWidget);
        menuBar = new QMenuBar(MainWindow);
        menuBar->setObjectName(QStringLiteral("menuBar"));
        menuBar->setGeometry(QRect(0, 0, 400, 21));
        MainWindow->setMenuBar(menuBar);
        mainToolBar = new QToolBar(MainWindow);
        mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
        MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
        statusBar = new QStatusBar(MainWindow);
        statusBar->setObjectName(QStringLiteral("statusBar"));
        MainWindow->setStatusBar(statusBar);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H



mainwindow.ui, сгенерирована креатором, прпосто один главный виджет, и не работает.
Подскажите в чем засада ?


Название: Re: Не могу разобраться с MouseMoveEvent
Отправлено: gil9red от Февраль 25, 2015, 07:55
Код
C++ (Qt)
void MainWindow::mouseMoveEvent(QEvent *event)
{
   qDebug() << "1111111111111";
 
   QMainWindow::mouseMoveEvent(event);
}


Название: Re: Не могу разобраться с MouseMoveEvent
Отправлено: HoneyDimon от Февраль 25, 2015, 09:32
Неправда Ваша, так тоже не работает и логика абсолютно не ясна !

Код:
void MainWindow::mouseMoveEvent(QEvent *event)
{
    qDebug() << "1111111111111";
    QMouseEvent *MousEvent = static_cast<QMouseEvent*>(event);
    QMainWindow::mouseMoveEvent(MousEvent);
}


Название: Re: Не могу разобраться с MouseMoveEvent
Отправлено: Igors от Февраль 25, 2015, 09:32
просто один главный виджет, и не работает.
Нет, есть centralWidget, поэтому до MainWindow дело не доходит. Попробуйте  
Код
C++ (Qt)
centralWidget->setAttribute(Qt::WA_TransparentForMouseEvents);


Название: Re: Не могу разобраться с MouseMoveEvent
Отправлено: HoneyDimon от Февраль 25, 2015, 10:20
Так тоже не работает. вроде по логике все просто.
Есть класс MainWindow наследуемый от QMainWindow.
В нем переопределена функция MouseMoveEvent.при перемещении мышки должна вызываться переопределенная функция, но почему то не вызывается :(


Название: Re: Не могу разобраться с MouseMoveEvent
Отправлено: Igors от Февраль 25, 2015, 10:29
Проект выложите, посмотрим


Название: Re: Не могу разобраться с MouseMoveEvent
Отправлено: HoneyDimon от Февраль 25, 2015, 10:42
Вот, проект Qt 5.2


Название: Re: Не могу разобраться с MouseMoveEvent
Отправлено: gil9red от Февраль 25, 2015, 10:48
Неправда Ваша, так тоже не работает и логика абсолютно не ясна !

Код:
void MainWindow::mouseMoveEvent(QEvent *event)
{
    qDebug() << "1111111111111";
    QMouseEvent *MousEvent = static_cast<QMouseEvent*>(event);
    QMainWindow::mouseMoveEvent(MousEvent);
}

У функции mouseMoveEvent тип параметра QMouseEvent *


Название: Re: Не могу разобраться с MouseMoveEvent
Отправлено: HoneyDimon от Февраль 25, 2015, 11:20
 Да с этим уже разобрался, спасибо. mouseMoveEvent(QEvent *ev) - неверно и работать не будет! Правильно: mouseMoveevent(QMouseEvent *ev) - так работает. Изза невнимательности убил кучу времени. Еще раз всем спасибо! копаю дальше.


Название: Re: Не могу разобраться с MouseMoveEvent
Отправлено: GreatSnake от Февраль 25, 2015, 11:39
Да с этим уже разобрался, спасибо. mouseMoveEvent(QEvent *ev) - неверно и работать не будет! Правильно: mouseMoveevent(QMouseEvent *ev) - так работает. Изза невнимательности убил кучу времени. Еще раз всем спасибо! копаю дальше.
Коли так обжёгся, возьми за правило добавлять спецификатор "override" и забудешь про такие проблемы.
Правда, применимо только с C++11.


Название: Re: Не могу разобраться с MouseMoveEvent
Отправлено: Igors от Февраль 25, 2015, 11:57
Коли так обжёгся, возьми за правило добавлять спецификатор "override" и забудешь про такие проблемы.
Правда, применимо только с C++11.
Дв, хорошая вещь. Можно и варнинг "hide virtual.." включить, но он не поможет если перепутал имя метода


Название: Re: Не могу разобраться с MouseMoveEvent
Отправлено: GreatSnake от Февраль 25, 2015, 12:01
Дв, хорошая вещь. Можно и варнинг "override virtual.." включить, но он не поможет если перепутал имя метода
Ещё как поможет, если заюзал имя несуществующего виртуального метода.