Установить согласованный курсор мыши для QWidget - PullRequest
2 голосов
/ 08 октября 2011

У меня есть подкласс QWidget для рисования на нем с помощью мыши. Я использую setCursor, чтобы изменить его курсор в форме креста. Он работает нормально, но как только я нажимаю на него кнопку мыши (например, чтобы нарисовать линию от руки), курсор снова возвращается к курсору приложения. Обратите внимание, что я не хочу использовать setOverrideCursor для события mouseenter, например, потому что я хочу изменить курсор только для этого виджета, а не для всего приложения, и в любом случае у меня есть лучший обходной путь (как показано ниже).

Мое текущее решение заключается в использовании SetCursor (курсор ()); в моих переопределенных mousePressEvent (событие QMouseEvent *) и mouseDoubleClickEvent (событие QMouseEvent *) Последнее потому, что по какой-то причине двойной щелчок также на мгновение меняет курсор на курсор приложения! Обходной путь работает :), но я хотел бы посмотреть, есть ли лучшее решение, которое просит QT вообще не менять курсор.

Я должен добавить, что перетаскивание не активировано.

Вот некоторый фрагмент исходного кода по запросу:

class MyWidget : public QWidget
{
    void paintEvent( QPaintEvent * /*event*/ );
    void resizeEvent( QResizeEvent * event );
    void mouseDoubleClickEvent ( QMouseEvent * event );
    void mousePressEvent( QMouseEvent* event );
    void mouseReleaseEvent( QMouseEvent* event );
    void mouseMoveEvent( QMouseEvent* event );
    void wheelEvent( QWheelEvent* event );
}

Затем я переопределяю следующее (для обхода проблемы)

void MyWidget::mouseDoubleClickEvent(QMouseEvent * event)
{
    // ... do some other stuff ...
    // This is a workaround to prevent the cursor from changing
    setCursor(cursor());
    event->accept();
}
void MyWidget::mousePressEvent(QMouseEvent * event)
{
    // ... do some other stuff ...
    // This is a workaround to prevent the cursor from changing
    setCursor(cursor());
    event->accept();
}

Чтобы изменить курсор, предполагая, что экземпляр класса mywidget создан в моем классе, я делаю это: mywidget->setCursor(Qt::CrossCursor) Опять же, он меняет курсор, как и ожидалось, когда я наводю курсор мыши на свой элемент управления, но он снова переключается на курсор приложения, когда я нажимаю кнопку мыши (таким образом, требуется обходной путь выше)

1 Ответ

0 голосов
/ 18 февраля 2012

Хорошо, я до сих пор не нашел ответа на этот вопрос, поэтому вот обходной путь:

void MyWidget::mouseDoubleClickEvent(QMouseEvent * event)
{
    // ... do some other stuff ...
    // This is a workaround to prevent the cursor from changing
    setCursor(cursor());
    event->accept();
}
void MyWidget::mousePressEvent(QMouseEvent * event)
{
    // ... do some other stuff ...
    // This is a workaround to prevent the cursor from changing
    setCursor(cursor());
    event->accept();
}
...