Arrow
Feb. 8, 2017, 12:33 a.m.

Изменение курсора мыши

Курсор мыши, окно без рамки.

Есть окно без рамки в котором включено отслеживание мыши:

setWindowFlags(Qt::FramelessWindowHint);

setMouseTracking(true);

Хочу дать возможность пользователю изменять его размер, но проблема в том, что не могу заставить курсор мыши изменить вид на курсор изменения размера:

SizeFDiagCursor
Делал так:
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    // Изменить вид курсора, когда он находится около
   // правого нижнего угла окна
    if ( (event->x() > width()-10) && (event->y() > height()-10) )
    {
         setCursor(Qt::SizeFDiagCursor);
    }
}
Не работает. Зато так все работает, но только если пользователь нажал левую кнопку мыши:
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        if ( (event->x() > width()-10) && (event->y() > height()-10) )
        {
            setCursor(Qt::SizeFDiagCursor);
            isResize = true;
        }
    }
}

Подскажите, как можно реализовать изменение вида курсора при наведении его на кромку окна?

2
The question is asked by the articleQt/C++ - Lesson 022. How to change cursor shape in Qt?

Do you like it? Share on social networks!

10
Evgenii Legotckoi
  • Feb. 8, 2017, 1:14 a.m.

Вот эта дополнительная волшебная строчка Вам поможет:

ui->centralWidget->setMouseTracking(true);

Сможете объяснить почему это сработает?

    Evgenii Legotckoi
    • Feb. 8, 2017, 1:16 a.m.
    • The answer was marked as a solution.

    Не забудьте конечно, что должна быть и первоначальная строчка:

     this->setMouseTracking(true);
    В общем они обе должны быть прописаны:
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        ui->centralWidget->setMouseTracking(true);
        setMouseTracking(true);
    }
      Arrow
      • Feb. 8, 2017, 1:32 a.m.

      Спасибо! Все ясно. Работает так как вся компоновка у меня на CentralWidget и по сути я ищу его край.

        Arrow
        • Feb. 8, 2017, 1:48 a.m.

        И последний вопрос по теме (мозги уже не варят) как курсор вернуть назад когда он покинул нужную позицию?

          Evgenii Legotckoi
          • Feb. 8, 2017, 1:09 p.m.

          Точно также отслеживать нахождение курсора за пределами той области в которой выставляете другой тип курсора.

          if ( (event->x() > width()-10) && (event->y() > height()-10) )
          {
              setCursor(Qt::SizeFDiagCursor);
          }
          else
          {
              setCursor(Qt::ArrowCursor);
          }

          Посмотрите вот эту статью про кастомизацию . Я там знатно заморочился на такую же тему.

          Работает так как вся компоновка у меня на CentralWidget и по сути я ищу его край.
          Практически, но чуток иначе. Край Вы ищите всё-таки в MainWindow, поскольку перегружаете его методы. Просто, если не установить трекинг мыши в центральном виджете, то он не передаёт передвижение мыши по стеку событий в MainWindow .
            Arrow
            • Feb. 8, 2017, 1:41 p.m.

            Я так сразу и написал:

            if ( (event->x() > width()-10) && (event->y() > height()-10) )
            {
                setCursor(Qt::SizeFDiagCursor);
            }
            else
            {
                setCursor(Qt::ArrowCursor);
            }

            только как оказалось не работает.

            Курсор поменялся на SizeFDiagCursor, а назад не хочет ни в какую. :)

              Evgenii Legotckoi
              • Feb. 8, 2017, 2:13 p.m.

              Я вот сейчас скажу самую заезженную фразу...

              Но у меня всё работает. - ОС Ubuntu 16.04, Qt 5.8

                Arrow
                • Feb. 8, 2017, 8:32 p.m.

                Везет :), а у меня на Debian Jessie и Windows 7 - нет :(

                  Evgenii Legotckoi
                  • Feb. 8, 2017, 9 p.m.

                  Там у Вас много ещё всякого страшного в коде написано? Или чистый голый код с одной только перегрузкой этого метода?

                  У себя проверял в чистом проекте.

                    Arrow
                    • Feb. 9, 2017, 4:02 a.m.

                    Страшного нет, только понятный код - код-ревью пройдет (думаю) :).

                    Оказалось забыл включить отслеживание мыши для еще одного виджета на форме. :)

                    Теперь все работает, спасибо!

                      Comments

                      Only authorized users can post comments.
                      Please, Log in or Sign up
                      • Last comments
                      • AK
                        April 1, 2025, 11:41 a.m.
                        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                      • Evgenii Legotckoi
                        March 9, 2025, 9:02 p.m.
                        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                      • VP
                        March 9, 2025, 4:14 p.m.
                        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                      • ИМ
                        Nov. 22, 2024, 9:51 p.m.
                        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                      • Evgenii Legotckoi
                        Oct. 31, 2024, 11:37 p.m.
                        Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup