Неинтерактивные элементы в QMenu

Я пытаюсь создать меню с некоторыми пунктами, которые не являются интерактивными в QT. Я подкласс QMenu в моем MyCustomMenuClass. Я пытаюсь добавить заголовки разделов в свое меню, чтобы оно было понятнее для пользователя.

Например, это должно выглядеть так:

My section 1 title
Action 1
Action 2
Action 3
My second section title
Action 4
Action 5

Проблема в том, что заголовки разделов всегда реагируют на мышь, но я бы хотел, чтобы они не реагировали на мышь, чтобы она была красивее. Есть идеи, как это сделать?

6

Решение

Из документации QMenu:

Существует четыре вида элементов действий: разделители, действия, которые показывают подменю, виджеты и действия, которые выполняют действие. Разделители вставляются с помощью addSeparator (), подменю с addMenu (), а все остальные элементы считаются элементами действий.

Это звонит в колокол: виджеты! Вы можете добавить виджет в меню? Это означает, что вы устроились, вы можете делать все, что хотите.

То, что вам нужно, это QWidgetAction объект. Позволяет вставить пользовательский виджет в качестве действия. Ваши заголовки будут пользовательскими виджетами. Если вам нужен только заголовок, QLabel должно хватить:

QMenu* myMenu = new QMenu(...);
QLabel* label = new QLabel(tr("<b>Title</b>"), this);
label->setAlignment(Qt::AlignCenter);

QWidgetAction* a = new QWidgetAction(myMenu);
a->setDefaultWidget(label);

Исходный код для этого кода

Посмотрите этот связанный вопрос для более сложного примера кода: Есть ли способ добавить виджет в QMenu в QtCreator

8

Другие решения

Для Qt 5.1 и выше вы должны использовать addSection(const QString &), Он предназначен именно для того, что вы пытаетесь сделать. Решения на основе виджетов будут выглядеть странно, если вы не позаботитесь о подборе шрифтов, интервалов и т. Д.

Для Qt 4 вы должны использовать addAction(const QString &) как запасной вариант, если вы действительно намерены компилировать свой код с Qt 4. Я думаю, это разумный компромисс.

Для Qt 5.0 — ну, вы больше не должны его использовать, это так просто 🙂

3

Для всплывающего меню вы можете создать свой собственный QWidgetAction для добавления во всплывающее меню.

Это пример QWidgetAction:

#include <QWidgetAction>

class  myCustomWidgetAction: public QWidgetAction
{
Q_OBJECT
public:
explicit myCustomWidgetAction(QWidget * parent);

protected:
QWidget * createWidget(QWidget *parent);

};myCustomWidgetAction::myCustomWidgetAction(QWidget * parent):QWidgetAction(parent) {
}
QWidget * myCustomWidgetAction::createWidget(QWidget *parent){
myCustomWidget * widget=new myCustomWidget(parent);
return widget;
}

Затем вы можете добавить свой виджет в панель инструментов для отображения во всплывающем меню:

myCustomWidgetAction * widgetAction   = new myCustomWidgetAction(this);

ui->toolButton->addAction(widgetAction);

Ваш виджет может быть списком, содержащим различные элементы, или любым другим виджетом. Вы также можете добавить несколько экземпляров myCustomWidgetAction в toolButton.

Вы также можете добавить его в QMenu, например:

QMenu* menu = new QMenu();

menu->addAction(widgetAction);
1
По вопросам рекламы [email protected]