MihailllApril 30, 2020, 1:36 p.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, 6:23 a.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
SP

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

  • Result:93points,
  • Rating points8
VS

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:30points,
  • Rating points-10
J

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

  • Result:93points,
  • Rating points8
Last comments

Qt/C++ - Tutorial 074. Generating pseudo-random numbers, using STD library random

А использование функции global() не решает ли эти проблемы? value = QRandomGenerator::global()->bounded(15, 43); Получаемая последовательность каждый раз новая.

Qt/C++ - Tutorial 074. Generating pseudo-random numbers, using STD library random

А использование функции global() не решает ли эти проблемы? value = QRandomGenerator::global()->bounded(15, 43); Получаемая последовательность каждый раз новая.
S

QML - Lesson 026. Intents with Qt for Android, part 1

Есть ли возможность приведения java типа у QAndroidJniObject? Интересует конкретно class to
VK

Qt/C++ - Lesson 015. QTableWidget – How to create a table with checkboxes?

Кто-нибудь знает, как сделать так, чтобы в QTableWidget состоящей из чекбоксов в строке таблицы можно было выбрать только один checkbox ?

Qt/C++ - Lesson 006. QSqlQueryModel – Tables in Qt with SQL-query

QSqlTableModel выполняет ряд стандартных операций для одной таблицы из базы данных. Поэтому там и реализован функционал по удалению и редактированию. QSqlQueryModel позволяет выполнить запр…
Now discuss on the forum
VB

QSqlTableModel не удаётся редактировать и удалять данные

А удаление всё же не работает. Понял это когда по аналогии с этим проектом создал проект с картинками. При удалении элементов размер базы данных не меняется. То есть в представлении элемент пока…
VB

Лишние строки при выборке из базы данных SQLite

Я практик, правил не знаю, если код работает, то хорошо. Данный проект работает без видимых ошибок. Проблему лишних строк решил заменой, о которой в данном посте написал. Я просто хочу понять по…

Не проверять форму если нажали кнопку

можно указать все поля, как required=False, а в методе clean сделать: def clean(self): cleaned_data = super().clean() if 'add' in self.data: ... дополнительные проверки(что по…
D

LibreOffice QT Widget

Я бы хотел интегрировать приложения из LibreOffice в свою программу. В идеале использовать их как виджеты Наткнулся на пакет libreoffice-qt5, который вроде как позволяет это делать htt…

Создание черновика как на авито и тд

А черновик в свою очередь нужен пока только для получения id, который нужен для мультизагружки изображений и привязки их к посту. как то так... я бы вообще решал это так: class P…
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB