0

フローティング をドラッグするときに別のマウス カーソルを使用することは可能QDockWidgetですか? どちらQWidget::setCursorQApplication::setOverrideCursor何の効果もありません。

4

1 に答える 1

1

フローティングQDockWidgetはウィンドウなので、カーソルが非クライアント領域にある場合は、OS にカーソルを変更するように依頼する必要があります。

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 (非クライアント領域の「入力イベント」) もわからないことです。

于 2013-02-21T06:12:59.380 に答える