【问题标题】:Change mouse cursor when dragging a floating QDockWidget拖动浮动 QDockWidget 时更改鼠标光标
【发布时间】:2013-01-30 09:46:03
【问题描述】:

拖动浮动QDockWidget 时是否可以使用不同的鼠标光标? QWidget::setCursorQApplication::setOverrideCursor 都不起作用。

【问题讨论】:

  • 你愿意修改Qt本身吗?您可以将此 QDockWidget 功能贡献给 Qt 5.1。
  • @peppe 这是一个有趣的想法。我会在某个时候进行研究,如果可行,我可能会这样做,但这对我现在正在进行的项目没有帮助。
  • 如果在主窗口设置光标会发生什么?它应该从其父窗口小部件中获取光标。

标签: qt qt4 mouse-cursor qdockwidget


【解决方案1】:

一个浮动的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(这是非客户区的“进入事件”)。

【讨论】:

  • 我希望有一个与平台无关的解决方案,但似乎没有。你从来没有得到 WM_NLCBUTTONUP 的原因是我之前遇到过,发现它已经记录在案了:bugreports.qt-project.org/browse/QTBUG-1358
猜你喜欢
  • 2020-12-18
  • 2011-06-24
  • 2018-12-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
相关资源
最近更新 更多