Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

mouseRelease doesn't work



  • I used pressEvent and moueseReleaseEvent for dragging and resize mainwindow in an other screen, beacuse I have 2 screens I wrote in .h

    protected:
        void mousePressEvent(QMouseEvent * event);
        void mouseReleaseEvent(QMouseEvent * event);
    

    in .cpp.

    void MainWindow::mousePressEvent(QMouseEvent *event)
    {
        qDebug() << "Pressed";
    }
    
    void MainWindow::mouseReleaseEvent(QMouseEvent *event)
    {
        qDebug() << "Released";
    }
    

    I click on the titlebar ...I don't know if it's the why...I want only to move my mainWindow in the other screen and do the resize when I release the mouse



  • @vale88 the event released isn't registered


  • Lifetime Qt Champion

    Hi
    Clicking on the title bar of a Window is NOT handled by Qt.
    Its the operating system.

    You can use native code to detect it.
    Like

    #include "windows.h"
    #include "windowsx.h"
    protected:
        bool nativeEvent(const QByteArray &eventType, void *message, long *result) override
        {
            MSG *msg = (MSG *)(message);
            if (msg->message == WM_NCLBUTTONDOWN) {
    
                int mouseX = GET_X_LPARAM(msg->lParam);
                int mouseY = GET_Y_LPARAM(msg->lParam);
                QRect frame = frameGeometry();
                QRect content = geometry();
    
                qDebug() << "mouseX: " << mouseX << "mouseY:" << mouseY;
                qDebug() << "frame: " << frame;
                qDebug() << "content: " << content;
    
                if (mouseY < content.y() && mouseY >= frame.y()) {
                    qDebug() << "Hit title bar";
                }
            }
    
            *result = 0;
            return false;
        }
    

    however this ONLY works on Windows.



  • @mrjj I use press and release to move the mainWindow, but I don't understand, I must write your code and use press event and release event like I did before?


  • Lifetime Qt Champion

    @vale88
    Hi
    The code is for detecting clicking on the titlebar.
    It will not work with press event and release event like normally.

    we test here for WM_NCLBUTTONDOWN
    and you can also test for WM_NCLBUTTONUP



  • @mrjj ok, so I can't see with this when I drag the mainWindow, is there an othere way?
    Son I an't see when I release the mouse?


  • Lifetime Qt Champion

    @vale88
    well to your mainwindow you can override
    virtual void moveEvent ( QMoveEvent * event )
    then you are told when window is moved.

    -Son I an't see when I release the mouse?
    Not on the titlebar. only inside thw window.



  • @mrjj Yes I used moveEvent, in fact, to drag mainWindow and resize mainWindow in the second screen, but if I resize while I move, so with moveEvent, I have problems, I need an event which can permit me to understand when I released the mouse and mainWindow is in the other screen, becuse I use showMaximized


  • Lifetime Qt Champion

    @vale88
    well WM_NCLBUTTONUP would be send when you release mouse on
    the title bar, if that is enough?
    You can then check which screen you are on.



  • @mrjj but this event works when I click on title bar, right?so it's like pressEvent, and when release the mouse, how Can i use it?


  • Lifetime Qt Champion

    @vale88
    something like

    bool nativeEvent(const QByteArray &eventType, void *message, long *result) 
    {
        MSG *msg = (MSG *)(message);
        if (msg->message == WM_NCLBUTTONDOWN || msg->message == WM_NCLBUTTONUP) {
            int mouseX = GET_X_LPARAM(msg->lParam);
            int mouseY = GET_Y_LPARAM(msg->lParam);
            QRect frame = frameGeometry();
            QRect content = geometry();
            if (mouseY < content.y() && mouseY >= frame.y()) {
                if ( msg->message == WM_NCLBUTTONDOWN )  {
                    // ON CLICK
                }  else {
                    // ON RELEASE
                }
            }
        }
    
        *result = 0;
        return false;
    }
    


  • @mrjj Ok thanks, tomorrow I try, if there is an other way to resize the mainWindow when it's in an other screen, please tell me it, thanks



  • @mrjj I have an error in frameGeometry and geometry, qt said that isn't declared



  • @mrjj I tried you code but it works only on click and not when I release


  • Lifetime Qt Champion

    well there was a typo
    if (WM_NCLBUTTONDOWN ) {
    should have been
    if (msg->message == WM_NCLBUTTONDOWN ) {

    so it would always say it was clicked.

    Update:
    You are right - it's not sending the WM_NCLBUTTONUP
    I assume left click starts a drag, and no UP event will be seen since windows then do a mouse capture.

    So sorry. forget they code. it cannot work for what you want since you will never get the UP event.


Log in to reply