Я пытаюсь использовать сочетание пользовательских курсоров и предустановленных курсоров для моего QGraphicsView.
В моей реализации мы создали понятие «режимы» для представления. Это означает, что в зависимости от того, в каком «режиме» находится пользователь, разные вещи будут происходить при щелчке левой или левой кнопкой мыши. В любом случае, проблема не в этом, а в контексте.
Проблема возникает, когда я пытаюсь изменить курсор для каждого режима. Например, для режима 1 мы хотим показать обычный курсор со стрелкой, но для режима 2 мы хотим использовать пользовательское растровое изображение. Кажется простым, мы вызываем graphicsview->viewport()->setCursor(Qt::QArrowCursor)
, когда переключаемся в режим 1, и graphicsview->viewport()->setCursor(our custom cursor)
для режима 2. За исключением того, что он вообще не работает.
Во-первых, курсор не меняется на пользовательский курсор. Это первая проблема. Однако, если с помощью другой операции режим перетаскивания графического представления устанавливается на ScrollHandDrag, курсор будет переключаться на пользовательский курсор после завершения операции перетаскивания. Weird. Но график утолщается ... Как только мы переключаемся на пользовательский курсор, он никогда не может быть изменен обратно на ArrorCursor, независимо от того, сколько раз мы вызываем setCursor(Qt::QArrowCursor)
. также не имеет значения, вызываю ли я setCursor в окне просмотра или само графическое представление.
Итак, ради интереса, я добавил вызов graphicsview->unsetCursor()
как раз перед тем, как мы хотим изменить курсор, и это, по крайней мере, исправляет вторую проблему. Курсор меняется очень хорошо, пока мы делаем небольшую ручную вставку между ними. Лучше, но, конечно, не оптимально. Однако следует отметить, что выполнение unsetCursor в области просмотра не работает. это обязательно должно быть сделано в графическом представлении - независимо от того, что мы устанавливаем курсор в окне просмотра.
Чтобы полностью исправить проблему, я добавил две строки после установки курсора:
graphicsview->setDragMode(QGraphicsView::ScrollHandDrag);
graphicsview->setDragMode(QGraphicsView::NoDrag);
Что работает, но вы, боги! Так что внутри этих двух методов происходит нечто волшебное, что решает проблему, но, глядя на код, я не вижу, что. Что-то связанное с тем, что режим перетаскивания меняет курсор, я представляю.
Просто для полноты, я должен также упомянуть, что вещь, которая вызывает изменение режима, это QPushButton, который был добавлен в сцену с использованием QGraphicsScene->addWidget()
. Я не знаю, имеет ли это какое-либо отношение к этому, но вы никогда не знаете.
Я надеюсь, что кто-нибудь мог бы уточнить, почему мне нужно делать эти, казалось бы, случайные звонки. Я не думаю, что я делаю что-то не так в любом месте. Заранее спасибо за любую помощь.
EDIT:
Вот пример кода с патчами курсора, как описано выше. Вы можете посмотреть и / или скачать их по ссылке ниже. Это было немного долго, чтобы вставить здесь. Я включил структуру, вокруг которой меняются курсоры, потому что у меня странное ощущение, что это как-то важно.
https://gist.github.com/712654
Код, в котором заключается проблема, находится в MyGraphicsView.cpp, начиная со строки 104. Здесь курсор устанавливается в графическом представлении. Это в точности как описано выше.
Имейте в виду, что с очень уродливыми заплатами на месте курсоры работают - более или менее. Без этих строк вы очень четко увидите проблемы, перечисленные в посте выше.
В ссылку также включен весь код главного окна, использующего представление и т. Д., Единственное, чего не хватает, - это изображений, которые я использую. Но сами изображения не имеют значения, подойдут любые 16x16 png.