AC
Маусым 6, 2020, 12:54 Т.Қ.

Qt/C++ Определение положения курсора над действие(кнопкой) в QToolBar

QToolBar, Qt

Доброго дня.
Возник вопрос - как можно определить что курсор находится над определенным действием(кнопкой) в qtoolbar ?

mainwindow.cpp

  1. MainWindow::MainWindow(QWidget *parent)
  2. : QMainWindow(parent)
  3. , ui(new Ui::MainWindow)
  4. {
  5. ui->setupUi(this);
  6.  
  7. // ...
  8. if (globals::settings_UseNoteApp){
  9.  
  10. // для кнопок которые расположенны на форме
  11. //ui->btnAddDoctor->setMouseTracking(true);
  12. //ui->btnAddDoctor->installEventFilter(this);
  13.  
  14. // для mainToolBar
  15. ui->mainToolBar->setMouseTracking(true);
  16. ui->mainToolBar->installEventFilter(this);
  17. }
  18. }
  19.  
  20. bool MainWindow::eventFilter(QObject *obj, QEvent *event)
  21. {
  22. // if (obj == ui->btnAddDoctor){
  23. // if (ev->type() == QEvent::Enter){ // над кнопкой
  24. // // ...
  25. // } else if (ev->type() == QEvent::Leave) // вне проекции кнопки
  26. // // ...
  27. // }
  28. // }
  29.  
  30. if (obj == ui->mainToolBar){
  31. // QAction *listUser = static_cast<QAction*>(ui->actionViewListUsers);
  32. // QAction *listUser = static_cast<QAction*>(ui->actionViewListDoctors);
  33. // int px = ui->mainToolBar->actionGeometry(listUser).x();
  34. // int py = ui->mainToolBar->actionGeometry(listUser).y();
  35. // ... но это не то что надо ...
  36. }
  37. return false;
  38. }
2

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

5
Evgenii Legotckoi
  • Маусым 7, 2020, 11:23 Т.Қ.

Добрый день.
Проверяйте event на тип события.ю например на движение курсора.
Также есть ещё несколько типов событий мыши. Смотрите документацию

  1. if (event->type() == QEvent::MouseMove)
  2. {
  3.  
  4. }
    AC
    • Маусым 10, 2020, 12:20 Т.Ж.
    • (өңделген)

    Спасибо за наводку, но никак не могу разобраться.
    Пытаюсь отследить движение курсора...

    1. if (obj == ui->mainToolBar)
    2. {
    3. if (event->type() == QEvent::MouseMove)
    4. {
    5. QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
    6. QPoint pos = mouseEvent->pos();
    7. statusBar()->showMessage(QString("Mouse move (%1,%2)").arg(pos.x()).arg(pos.y()));
    8. }
    9. }

    ... получаю данные о курсоре при движении в проекции mainToolBar , но возникает проблема - как только курсор находится над действием(кнопкой) QToolBar данные(x,y) не считываются.
    Ну и возникает вопрос как определить что курсор находится над действием(кнопкой) QToolBar ?
    Свойство setMouseTracking нельзя установить QAction ( "ui->actionViewListUsers" ). Как быть в данной ситуации ?

    Необходимо реализовать(пример):
    - при наведение курсора на "ui->actionViewListUsers" выводить уведомление или подсказку в стиле popUp
    - при наведение курсора на "ui->actionViewListDoctors" выводить информ.сообщение через QMessageBox

      Evgenii Legotckoi
      • Маусым 10, 2020, 11:30 Т.Ж.
      • (өңделген)
      • Жауап шешім ретінде белгіленді.

      Наследуйтесь от QToolBar и переопределите методы mouse событий.
      Проще будет заменить QToolBar на свой, чем впихивать сторонний фильтер из окна.

        AC
        • Маусым 10, 2020, 11:51 Т.Қ.

        Спасибо за наводку и за совет.
        В итоге:

        1. QToolBar mainToolBar = new QToolBar("Main Toolbar");
        2. QToolButton *btn = new QToolButton(this);
        3. btn->setText("Button test");
        4. btn->setIcon(QIcon(":rec/img/doctor_x32.png"));
        5. btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
        6. btn->setCursor(Qt::ArrowCursor);
        7. btn->setMouseTracking(true); // то что нужно !!!
        8. btn->installEventFilter(this); // то что нужно !!!
        9. mainToolBar->addWidget(btn);
        10.  
        11. addToolBar(mainToolBar);
          Evgenii Legotckoi
          • Маусым 11, 2020, 1:30 Т.Қ.

          Пожалуйста... хотя это не наследование от класса, но да ладно, нашли решение и хорошо.

            Пікірлер

            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
            Кіріңіз немесе Тіркеліңіз