拖动浮动QDockWidget时更改鼠标光标

时间:2013-02-14 14:47:40

标签: qt qt4 mouse-cursor qdockwidget

拖动浮动QDockWidget时是否可以使用不同的鼠标光标? <{1}}和QWidget::setCursor都没有任何效果。

1 个答案:

答案 0 :(得分:0)

浮动QDockWidget是一个窗口,因此您需要让操作系统在非客户区域上更改光标。

Windows的一个小错误示例:

#define WINVER 0x0500
#include <windows.h>
#include <windowsx.h>
#include <winuser.h>
bool DockWidget::winEvent(MSG * message, long * result)
{
    switch(message->message)
    {
        case WM_NCMOUSEMOVE:
            if(message->wParam == HTCAPTION)
            {
                qDebug() << "WM_NCMOUSEMOVE";
                if(!cursorHasBeenChanged && !cursorHasBeenClosed)
                {
                    cursorHasBeenChanged = true;
                    QApplication::setOverrideCursor(Qt::OpenHandCursor);
                }
            }
            else
                if(cursorHasBeenChanged)
                {
                    cursorHasBeenChanged = false;
                    QApplication::restoreOverrideCursor();
                }
            break;
        case WM_NCMOUSELEAVE:
            qDebug() << "WM_NCMOUSELEAVE";
            if(cursorHasBeenChanged && !cursorHasBeenClosed)
            {
                cursorHasBeenChanged = false;
                QApplication::restoreOverrideCursor();
            }
            break;
        case WM_NCLBUTTONDOWN:
            if(message->wParam == HTCAPTION)
            {
                qDebug() << "WM_NCLBUTTONDOWN";
                cursorHasBeenClosed = true;
                QApplication::setOverrideCursor(Qt::ClosedHandCursor);
            }
            break;
        case WM_NCLBUTTONUP:
            qDebug() << "WM_NCLBUTTONUP";
            if(cursorHasBeenClosed)
            {
                cursorHasBeenClosed = false;
                QApplication::restoreOverrideCursor();
            }
            break;
        default:
            ;
    }

    return QDockWidget::winEvent(message, result);
}

我认为代码是不言自明的,不要犹豫,询问是否有一些你不理解的东西。

有缺陷的部分,是我从未收到WM_NCLBUTTONUP消息,我不知道为什么(我得到WM_NCMOUSEMOVE)而不是WM_NCMOUSEHOVER(这是非客户区域的“输入事件”)。