Михаиллл
Михаиллл30. April 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

11
o
  • 1. Mai 2020 07:23
  • (bearbeitet)
  • Die Antwort wurde als Lösung markiert.

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

    Михаиллл
    • 1. Mai 2020 07:34

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

      o
      • 1. Mai 2020 07:35

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

        Михаиллл
        • 1. Mai 2020 07:37

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

          o
          • 1. Mai 2020 07:42

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

            Михаиллл
            • 1. Mai 2020 07:52

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

              o
              • 1. Mai 2020 08:00
              • (bearbeitet)

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

                o
                • 1. Mai 2020 08:02

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

                  Михаиллл
                  • 1. Mai 2020 08:29

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

                    o
                    • 1. Mai 2020 09:01

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

                      Михаиллл
                      • 1. Mai 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_;
                      };
                      
                      
                      

                        Kommentare

                        Nur autorisierte Benutzer können Kommentare posten.
                        Bitte Anmelden oder Registrieren
                        Letzte Kommentare
                        A
                        ALO1ZE19. Oktober 2024 08:19
                        Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                        ИМ
                        Игорь Максимов5. Oktober 2024 07:51
                        Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                        d
                        dblas55. Juli 2024 11:02
                        QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                        k
                        kmssr8. Februar 2024 18:43
                        Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                        Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                        Jetzt im Forum diskutieren
                        J
                        JacobFib17. Oktober 2024 03:27
                        добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                        JW
                        Jhon Wick1. Oktober 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. September 2024 09:09
                        Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                        F
                        Fynjy22. Juli 2024 04:15
                        при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                        Folgen Sie uns in sozialen Netzwerken