フローティング をドラッグするときに別のマウス カーソルを使用することは可能QDockWidget
ですか? どちらQWidget::setCursor
もQApplication::setOverrideCursor
何の効果もありません。
質問する
694 次
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 に答える