MihailllMay 1, 2020, 12:36 a.m.

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

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

    QScrollArea *scroll = new QScrollArea;
    scroll->setWidget(menu);
submenu->setStyleSheet("QMenu { menu-scrollable: 1; }");
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
11
o
  • May 1, 2020, 5:23 p.m.
  • (edited)
  • The answer was marked as a solution.

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

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

o

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

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

o

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

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

o

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

o

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

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

o

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

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

#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_;
};


Comments

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

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
VD

C++ - Test 001. The first program and data types

  • Result:73points,
  • Rating points1
Ds

C++ - Тест 003. Условия и циклы

  • Result:64points,
  • Rating points-1
o

C++ - Test 001. The first program and data types

  • Result:86points,
  • Rating points6
Last comments
D:

QML - Lesson 016. SQLite database and the working with it in QML Qt

Добрый день, пытаюсь разобраться и подргнать пример под себя. Есть бд с огромным количеством полей. В приложении на виджетах при использовании QTableView все работает и путем простого sql запрос…

Django - Tutorial 039. Adding private messages and chats on the site - Part 2 (Dialogue and chat counter with unread messages)

Добавляйте поле файла в модель сообщения. И в форме сообщения указывайте, что поле с файлом.
s

Django - Tutorial 023. Like Dislike system using GenericForeignKey

все, я со всем разобрался!) Извините!)
s

Django - Tutorial 023. Like Dislike system using GenericForeignKey

Доброго времени суток!) Я случайно набрел на вашу статью, и она помогла мне решить некоторые мои трудности, я прошел за вами по шагам, в попытках адаптировать это под себя, и возник вопрос. У ва…
Now discuss on the forum
M

QML: изменение стиля при наведении и при нажатии на кнопку

enabled = false перестанет быть активной и не будет ни на что реагировать) Хм.. по-моему пробовал такое. Проверю ещё раз после работы. Ура, спасибо большо…
U

Динамическое наполнение StackView QML

Во затупил))) Спасибо за все))) StackView.push("ModuleTip1.qml") ну или в сложной иерархии StackView.push("qrc:/folder/ModuleTip1.qml") и всего делов... Не пойму, почему сра…

QEventLoop тормозит при удалении экземпляра

Думаю, что нет. Лучше вообще без исключений, но не всегда возможно.
s

Ключевое слово class

Разобрался,на стаковерфлоу нашел топик и понял почему так происходило .

Поведение пустой очереди std::queue

Спасибо, так и сделал.
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB