Михаиллл
Мамыр 1, 2020, 12:36 Т.Ж.

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

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

  1. QScrollArea *scroll = new QScrollArea;
  2. scroll->setWidget(menu);
  1. submenu->setStyleSheet("QMenu { menu-scrollable: 1; }");
3

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

11
o
  • Мамыр 1, 2020, 5:23 Т.Қ.
  • (өңделген)
  • Жауап шешім ретінде белгіленді.

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

    Михаиллл
    • Мамыр 1, 2020, 5:34 Т.Қ.

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

      o
      • Мамыр 1, 2020, 5:35 Т.Қ.

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

        Михаиллл
        • Мамыр 1, 2020, 5:37 Т.Қ.

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

          o
          • Мамыр 1, 2020, 5:42 Т.Қ.

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

            Михаиллл
            • Мамыр 1, 2020, 5:52 Т.Қ.

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

              o
              • Мамыр 1, 2020, 6 Т.Қ.
              • (өңделген)

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

                o
                • Мамыр 1, 2020, 6:02 Т.Қ.

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

                  Михаиллл
                  • Мамыр 1, 2020, 6:29 Т.Қ.

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

                    o
                    • Мамыр 1, 2020, 7:01 Т.Қ.

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

                      Михаиллл
                      • Мамыр 1, 2020, 7:19 Т.Қ.

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

                      1. #pragma once
                      2.  
                      3. #include <QtWidgets>
                      4.  
                      5. class TransMenu : public QMenu {
                      6. Q_OBJECT
                      7.  
                      8. public:
                      9. TransMenu(QWidget* parent = nullptr) : QMenu(parent) {
                      10. setFixedSize(300, 600);
                      11. //setStyleSheet("QMenu { menu-scrollable: 1; }");
                      12. }
                      13.  
                      14. QAction* addBack(const QString& text) {
                      15. QAction *action = new QAction(text, this);
                      16.  
                      17. addAction(action);
                      18. back_actions_.push_back(action);
                      19. return action;
                      20. }
                      21.  
                      22. QAction* insertBack(QAction* before, const QString& text) {
                      23. QAction *action = new QAction(text, this);
                      24. insertAction(before, action);
                      25. back_actions_.push_back(action);
                      26. return action;
                      27. }
                      28.  
                      29.  
                      30. protected:
                      31.  
                      32. void showEvent(QShowEvent *event) override {
                      33.  
                      34. qDebug() << "Show Menu:" << this;
                      35.  
                      36. prev_menu_ = nullptr;
                      37. if (menuAction()) {
                      38. //Find previous menu of exists;
                      39. for (QWidget* w : menuAction()->associatedWidgets()) {
                      40. if (TransMenu* menu = qobject_cast<TransMenu*>(w)) {
                      41. if (menu->activeAction() == menuAction()) {
                      42. prev_menu_ = menu;
                      43. move(menu->pos());
                      44. menu->hide();
                      45.  
                      46. qDebug() << "Detected Previous Menu: " << prev_menu_;
                      47. break;
                      48. }
                      49. }
                      50. }
                      51. }
                      52.  
                      53. QMouseEvent move_event(QEvent::MouseMove, this->mapFromGlobal(QCursor::pos()), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
                      54. QApplication::sendEvent(this, &move_event);
                      55.  
                      56. // if (QAction* at = this->actionAt(this->mapFromGlobal(QCursor::pos()))) {
                      57. // qDebug() << "Set Active Action " << this;
                      58.  
                      59. // QMouseEvent new_e(QEvent::MouseMove, this->mapFromGlobal(QCursor::pos()), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
                      60. // QApplication::sendEvent(this, &new_e);
                      61.  
                      62. // bool a = this->isVisible();
                      63. // //this->setActiveAction(at);
                      64.  
                      65. ///* at->hovered();
                      66. // auto r = this->actionGeometry(at);
                      67. // this->update(this->actionGeometry(at));*/
                      68. // }
                      69. // else {
                      70. // qDebug() << "Active Action Not Set " << QCursor::pos();
                      71. // }
                      72.  
                      73. QMenu::showEvent(event);
                      74. }
                      75.  
                      76. void mousePressEvent(QMouseEvent *event) {
                      77. // qDebug() << "QtListWidget::mousePressEvent";
                      78. if (event->button() == Qt::LeftButton)
                      79. mouse_pressed_ = true;
                      80. QMenu::mousePressEvent(event);
                      81. }
                      82.  
                      83. void mouseMoveEvent(QMouseEvent *event) {
                      84. if (!mouse_pressed_) // disable click+drag
                      85. QMenu::mouseMoveEvent(event);
                      86. }
                      87.  
                      88. void mouseReleaseEvent(QMouseEvent *event) override {
                      89. if (mouse_pressed_)
                      90. QMenu::mouseReleaseEvent(event);
                      91.  
                      92. if (event->button() == Qt::LeftButton)
                      93. mouse_pressed_ = false;
                      94. }
                      95.  
                      96. void hideEvent(QHideEvent *event) override {
                      97. qDebug() << "Hide Menu:" << this;
                      98.  
                      99. //Showed child menu and hiding current. Prevent this;
                      100. auto a = activeAction();
                      101. qDebug() << "Hide Action " << a << " " << back_actions_;
                      102. if (!activeAction() || !activeAction()->menu()) {
                      103. qDebug() << "Close menu" << this;
                      104.  
                      105. bool back_action = back_actions_.contains(activeAction());
                      106. QMenu::hideEvent(event);
                      107. if (prev_menu_) {
                      108. if (back_action) {
                      109. qDebug() << "Popup Previous Menu: " << prev_menu_;
                      110. //Clear action to prevent reshow this menu;
                      111. prev_menu_->setActiveAction(0);
                      112. //Prevent sending releaseMouseEvent;
                      113. QMetaObject::invokeMethod(prev_menu_, "show", Qt::QueuedConnection);
                      114.  
                      115. }
                      116. else {
                      117. //Finish hiding;
                      118. prev_menu_->dispatchHideEvent();
                      119. }
                      120. }
                      121. }
                      122. else {
                      123. emit this->aboutToHide();
                      124. }
                      125. }
                      126.  
                      127. void actionEvent(QActionEvent *e) override {
                      128. QMenu::actionEvent(e);
                      129.  
                      130. if (e->type() == QEvent::ActionRemoved) {
                      131. back_actions_.removeAll(e->action());
                      132. }
                      133. }
                      134.  
                      135. void dispatchHideEvent() {
                      136.  
                      137. qDebug() << "Finish Menu: " << this;
                      138. QMenu::hideEvent(&QHideEvent());
                      139.  
                      140. if (prev_menu_)
                      141. prev_menu_->dispatchHideEvent();
                      142. }
                      143.  
                      144. private:
                      145. TransMenu* prev_menu_ = nullptr;
                      146. QList<QAction*> back_actions_;
                      147. bool mouse_pressed_;
                      148. };
                      149.  
                      150.  

                        Пікірлер

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