2013-02-14 4 views
0

Можно ли использовать другой курсор мыши при перетаскивании плавающего QDockWidget? Ни QWidget::setCursor, ни QApplication::setOverrideCursor не имеют никакого эффекта.Изменение указателя мыши при перетаскивании плавающего QDockWidget

+0

Готовы ли вы изменить Qt? Вы можете внести вклад в эту функцию QDockWidget в Qt 5.1. – peppe

+0

@peppe Это интересная идея. Я рассмотрю его в какой-то момент, и если это осуществимо, я могу это сделать, но это не поможет мне в проекте, над которым я сейчас работаю. –

+0

Что произойдет, если вы установите курсор в главном окне? Он должен получить курсор из своего родительского виджета. – paulm

ответ

0

Плавающее окно QDockWidget - это окно, поэтому вам нужно попросить ОС изменить курсор, когда он находится на неклиентской области.

Небольшой пример багги для окон:

#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 (что является «событием ввода» для неклиентской области).

+0

Я надеялся на платформо-агностическое решение, но, похоже, его нет. Причина, почему вы никогда не получаете WM_NLCBUTTONUP, - это то, с чем я столкнулся раньше, и обнаружил, что он уже задокументирован: https://bugreports.qt-project.org/browse/QTBUG-1358 –

Смежные вопросы