Михаиллл
Михаиллл30 квітня 2020 р. 14:36

Как в Qt в qmenu добавить scrollarea

Добрый день.
Как в Qt в qmenu добавить scrollarea?
Эти 2 варианта не работают

    QScrollArea *scroll = new QScrollArea;
    scroll->setWidget(menu);
submenu->setStyleSheet("QMenu { menu-scrollable: 1; }");
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

11
o
  • 01 травня 2020 р. 07:23
  • (відредаговано)
  • Відповідь була позначена як рішення.

Добрый день, не понятно чего вы хотите. Какое меню конкретно: контестное или выпадающее?

    Михаиллл
    • 01 травня 2020 р. 07:34

    Мне нужно QMenu, при нажатии на кнопку выпадает это меню

      o
      • 01 травня 2020 р. 07:35

      На какую кнопку? QPushButton или обработка QKeyEvent?

        Михаиллл
        • 01 травня 2020 р. 07:37

        К QPushButton привязано меню командой setMenu

          o
          • 01 травня 2020 р. 07:42

          читайте про слот Public Slots void showMenu()

            Михаиллл
            • 01 травня 2020 р. 07:52

            Прочитал тут , но при чем тут скрол?

              o
              • 01 травня 2020 р. 08:00
              • (відредаговано)

              Тогда смотрите в сторону QContextMenuEvent

                o
                • 01 травня 2020 р. 08:02

                лучше кончено, полный код выкладывать, что бы было понятно, кого и откуда вызываете.

                  Михаиллл
                  • 01 травня 2020 р. 08:29

                  В коде бардак, он явно не поможет. Само событие тоже не поможет.
                  Тут нужно или в наследуемом от меню классе что-нибудь сделать, или еще что то не понятное.

                    o
                    • 01 травня 2020 р. 09:01

                    Если в коде бардак, наведите там порядок и выкладывайте.

                      Михаиллл
                      • 01 травня 2020 р. 09:19

                      Вот это наследованный класс меню. Но посути это обычное меню.

                      #pragma once
                      
                      #include <QtWidgets>
                      
                      class TransMenu : public QMenu {
                          Q_OBJECT
                      
                      public:
                          TransMenu(QWidget* parent = nullptr) : QMenu(parent) {
                              setFixedSize(300, 600);
                              //setStyleSheet("QMenu { menu-scrollable: 1; }");
                          }
                      
                          QAction*    addBack(const QString& text) {
                              QAction *action = new QAction(text, this);
                      
                              addAction(action);
                              back_actions_.push_back(action);
                              return action;
                          }
                      
                          QAction*    insertBack(QAction* before, const QString& text) {
                              QAction *action = new QAction(text, this);
                              insertAction(before, action);
                              back_actions_.push_back(action);
                              return action;
                          }
                      
                      
                      protected:
                      
                          void showEvent(QShowEvent *event) override {
                      
                              qDebug() << "Show Menu:" << this;
                      
                              prev_menu_ = nullptr;
                              if (menuAction()) {
                                  //Find previous menu of exists;
                                  for (QWidget* w : menuAction()->associatedWidgets()) {
                                      if (TransMenu* menu = qobject_cast<TransMenu*>(w)) {
                                          if (menu->activeAction() == menuAction()) {
                                              prev_menu_ = menu;
                                              move(menu->pos());
                                              menu->hide();
                      
                                              qDebug() << "Detected Previous Menu: " << prev_menu_;
                                              break;
                                          }
                                      }
                                  }
                              }
                      
                              QMouseEvent move_event(QEvent::MouseMove, this->mapFromGlobal(QCursor::pos()), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
                              QApplication::sendEvent(this, &move_event);
                      
                             // if (QAction* at = this->actionAt(this->mapFromGlobal(QCursor::pos()))) {
                             //     qDebug() << "Set Active Action " << this;
                      
                             //     QMouseEvent new_e(QEvent::MouseMove, this->mapFromGlobal(QCursor::pos()), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
                             //     QApplication::sendEvent(this, &new_e);
                      
                             //     bool a = this->isVisible();
                             //     //this->setActiveAction(at);
                      
                             ///*     at->hovered();
                             //     auto r = this->actionGeometry(at);
                             //     this->update(this->actionGeometry(at));*/
                             // }
                             // else {
                             //     qDebug() << "Active Action Not Set " << QCursor::pos();
                             // }
                      
                              QMenu::showEvent(event);
                          }
                      
                          void mousePressEvent(QMouseEvent *event) {
                              //    qDebug() << "QtListWidget::mousePressEvent";
                              if (event->button() == Qt::LeftButton)
                                  mouse_pressed_ = true;
                              QMenu::mousePressEvent(event);
                          }
                      
                          void mouseMoveEvent(QMouseEvent *event) {
                              if (!mouse_pressed_)   // disable click+drag
                                  QMenu::mouseMoveEvent(event);
                          }
                      
                          void mouseReleaseEvent(QMouseEvent *event) override {
                              if (mouse_pressed_)
                                  QMenu::mouseReleaseEvent(event);
                      
                              if (event->button() == Qt::LeftButton)
                                  mouse_pressed_ = false;
                          }
                      
                          void hideEvent(QHideEvent *event) override {
                              qDebug() << "Hide Menu:" << this;
                      
                              //Showed child menu and hiding current. Prevent this;
                              auto a = activeAction();
                              qDebug() << "Hide Action " << a << " " << back_actions_;
                              if (!activeAction() || !activeAction()->menu()) {
                                  qDebug() << "Close menu" << this;
                      
                                  bool back_action = back_actions_.contains(activeAction());
                                  QMenu::hideEvent(event);
                                  if (prev_menu_) {
                                      if (back_action) {
                                          qDebug() << "Popup Previous Menu: " << prev_menu_;
                                          //Clear action to prevent reshow this menu;
                                          prev_menu_->setActiveAction(0);
                                          //Prevent sending releaseMouseEvent;
                                          QMetaObject::invokeMethod(prev_menu_, "show", Qt::QueuedConnection);
                      
                                      }
                                      else {
                                          //Finish hiding;
                                          prev_menu_->dispatchHideEvent();
                                      }
                                  }
                              }
                              else {
                                  emit this->aboutToHide();
                              }
                          }
                      
                          void    actionEvent(QActionEvent *e) override {
                              QMenu::actionEvent(e);
                      
                              if (e->type() == QEvent::ActionRemoved) {
                                  back_actions_.removeAll(e->action());
                              }
                          }
                      
                          void    dispatchHideEvent() {
                      
                              qDebug() << "Finish Menu: " << this;
                              QMenu::hideEvent(&QHideEvent());
                      
                              if (prev_menu_)
                                  prev_menu_->dispatchHideEvent();
                          }
                      
                      private:
                          TransMenu*              prev_menu_ = nullptr;
                          QList<QAction*>         back_actions_;
                          bool                    mouse_pressed_;
                      };
                      
                      
                      

                        Коментарі

                        Only authorized users can post comments.
                        Please, Log in or Sign up
                        sf

                        C++ - Тест 004. Указатели, Массивы и Циклы

                        • Результат:90бали,
                        • Рейтинг балів8
                        МВ

                        Qt - Тест 001. Сигналы и слоты

                        • Результат:68бали,
                        • Рейтинг балів-1
                        ЛС

                        C++ - Тест 001. Первая программа и типы данных

                        • Результат:53бали,
                        • Рейтинг балів-4
                        Останні коментарі
                        A
                        ALO1ZE19 жовтня 2024 р. 08:19
                        Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                        ИМ
                        Игорь Максимов05 жовтня 2024 р. 07:51
                        Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                        d
                        dblas505 липня 2024 р. 11:02
                        QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                        k
                        kmssr08 лютого 2024 р. 18:43
                        Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                        АК
                        Анатолий Кононенко05 лютого 2024 р. 01:50
                        Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                        Тепер обговоріть на форумі
                        J
                        JacobFib17 жовтня 2024 р. 03:27
                        добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                        ИМ
                        Игорь Максимов03 жовтня 2024 р. 04:05
                        Реализация навигации по разделам Спасибо Евгений!
                        JW
                        Jhon Wick01 жовтня 2024 р. 15:52
                        Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                        КГ
                        Кирилл Гусарев27 вересня 2024 р. 09:09
                        Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                        F
                        Fynjy22 липня 2024 р. 04:15
                        при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                        Слідкуйте за нами в соціальних мережах