[Qt-interest] QWidget::enterEvent and QWidget::leaveEvent

Samuel Baxter samuel857 at gmail.com
Mon Jun 1 05:50:43 CEST 2009


In the attached program (consisting of the two files main.cpp and
test_enter_event.h ), the functions
    void enterEvent(QMouseEvent *)
    void leaveEvent(QMouseEvent *)
are overridden to record whether the mouse cursor is currently inside
the widget (a QGLWidget, to be specific). Yet neither function is
called when the mouse moves in or out of the window/widget.
The line should cease to be drawn when the mouse exits the window.

The commented out line, which tests whether the geometry includes the
current mouse location, also does not work.

Do you see why the (more efficient) first method does not work? Out of
curiosity, any ideas why the second method does not work are also
welcome.

Qt 4.4, Mac OS X 10.5, g++ 4.0.1.

TIA,
Samuel

----------------main.cpp----------------
#include <QApplication>
#include <iostream>

#include "test_enter_event.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    if (!QGLFormat::hasOpenGL()) {
        std::cerr << "This system has no OpenGL support" << std::endl;
        return 1;
    }

    Test_Enter_Event test_enter_event;
    test_enter_event.setWindowTitle(QObject::tr("Test enterEvent"));
    test_enter_event.resize(640, 480);
    test_enter_event.show();

    return app.exec();
}

----------------test_enter_event.h----------------

#ifndef TEST_ENTER_EVENT_H
#define TEST_ENTER_EVENT_H

#include <QtGui>
#include <QGLWidget>

class Test_Enter_Event : public QGLWidget
{
    Q_OBJECT

public:
    Test_Enter_Event(QWidget *parent = 0) : QGLWidget(parent),
                                            mouse_is_inside(false)
    {
        setFormat(QGLFormat(QGL::DoubleBuffer));
        setMouseTracking(true);
    }


protected:
    void initializeGL() {
        glDisable (GL_LIGHTING);
    }

    void resizeGL(int width, int height) {
        glViewport (0, 0, (GLsizei) width, (GLsizei) height);
        glMatrixMode (GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0.0, width, 0.0, height, -1.0, 1.0);
        window_height = height;

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }

    void paintGL() {
        glClearColor (0.1, 0.2, 0.5, 1.0);
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        if( mouse_is_inside ) {
            glColor3f(1.0, 1.0, 1.0);
            glBegin(GL_LINES);
            glVertex2d(0.0, 0.0);
            glVertex2d(mouse.x(), mouse.y());
            glEnd();

            glFlush ();
        }
    }
    void mouseMoveEvent(QMouseEvent * event) {

        mouse = QPoint( event->x(),
                        window_height - event->y() );
//    mouse_is_inside = geometry().contains(mouse_x, mouse_y);
        mouse_is_inside = true;
        update();
    }


    void enterEvent(QMouseEvent *) {
        mouse_is_inside = true;
    }
    void leaveEvent(QMouseEvent *) {
        mouse_is_inside = false;
    }


private:
    void draw();
    bool mouse_is_inside;
    int window_height;
    QPoint mouse;
};

#endif // TEST_ENTER_EVENT_H

----------------------------------------------------------------



More information about the Qt-interest-old mailing list