QGraphicsView и пользовательские курсоры

Я пытаюсь использовать сочетание пользовательских курсоров и предустановленных курсоров для моего QGraphicsView. В моей реализации мы создали понятие "режимы" для просмотра. Это означает, что в зависимости от того, в каком "режиме" находится пользователь, разные вещи будут происходить при щелчке левой кнопкой мыши или перетаскивании левой кнопкой мыши. В любом случае, проблема не в этом, а в контексте.

проблема возникает когда я пытаюсь изменить курсор для каждого режима. Например, для режима 1 мы хотим показать обычную стрелку курсор, а для режима 2, мы хотим использовать собственный рисунок. Казалось бы, просто мы называем graphicsview->viewport()->setCursor(Qt::QArrowCursor) при переключении в режим 1 и graphicsview->viewport()->setCursor(our custom cursor) режим 2. Только это совсем не работает.

во-первых, курсор не изменяется на пользовательский курсор. Это первая проблема. Однако, если с помощью другой операции режим перетаскивания графического представления получает значение ScrollHandDrag, курсор переключится на пользовательский курсор после завершения операции перетаскивания. Странный. Но сюжет сгущается... Как только мы переключаемся на пользовательский курсор, он никогда не может быть изменен обратно на ArrorCursor независимо от того, сколько раз мы вызываем setCursor(Qt::QArrowCursor). также не имеет значения, вызываю ли я setCursor в окне просмотра или в самом графическом представлении.

так, просто для удовольствия, я добавил вызов graphicsview->unsetCursor() как раз перед тем, как мы хотим изменить курсор, и это, по крайней мере, исправляет вторую проблему. Курсор просто штраф так долго, как мы делаем немного HandDragging между ними. Лучше, но, конечно, не оптимально. Однако следует отметить, что выполнение unsetCursor в окне просмотра не работает. это абсолютно необходимо сделать на graphicsview-независимо от того, что мы устанавливаем курсор на видовом экране.

чтобы полностью исправить проблему, я добавил Эти две строки после установки курсора:

graphicsview->setDragMode(QGraphicsView::ScrollHandDrag);
graphicsview->setDragMode(QGraphicsView::NoDrag);

, который работает, но вы в gads!! Так что что-то волшебное происходит внутри этих двух методов, что устраняет проблему, но взглянув на код я не вижу. Что-то связано с тем, что режим перетаскивания меняет курсор, который я себе представляю.

просто для полноты, я должен также упомянуть, что вещь, которая вызывает изменение режима, является QPushButton, которая была добавлена в сцену с помощью QGraphicsScene->addWidget(). Не знаю, имеет ли это какое-то отношение к делу, но никогда не знаешь.

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

изменить: Вот фактический пример кода с исправлениями курсора, как описано выше. Вы можете посмотреть и/или скачать их по ссылке ниже. Это было немного долго, чтобы вставить сюда. Я включил рамки, вокруг которых меняются курсоры, потому что у меня странное чувство, что это важно.

https://gist.github.com/712654

код, где проблема заключается в MyGraphicsView.cpp начиная с линии 104. Здесь в графическом представлении установлен курсор. Все в точности так, как описано выше.

имейте в виду, с очень некрасивые пятна на месте курсоры работают - более или менее. Без этих строк вы увидите очень четко проблемы, перечисленные в сообщении выше.

также включен в ссылку, это весь код для mainWindow, который использует представление и т. д... единственное, чего не хватает, - это изображения, которые я использую. Но сами изображения не имеют значения, любые 16x16 pngs будут делать.

2 ответов


Я добавил museReleaseEvent для решения аналогичной проблемы...

void mouseReleaseEvent(QMouseEvent *event) {
     QGraphicsView::mouseReleaseEvent(event);
     viewport()->setCursor(Qt::CrossCursor);
}

это сбросит курсор после завершения события перетаскивания, во время перетаскивания рука будет видна, что имеет смысл.


мое решение:

view->setDragMode( QGraphicsView::ScrollHandDrag );
QApplication::setOverrideCursor( Qt::ArrowCursor );