7

我正在尝试构建一个菜单,其中包含一些在 QT 中不可交互的项目。我在 MyCustomMenuClass 中继承 QMenu。我正在尝试将部分标题添加到我的菜单中,以便用户更清楚。

例如,它应该如下所示:

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

问题是部分标题总是对鼠标做出反应,但我希望他们不要对鼠标做出反应,这样它会更漂亮。关于如何做的任何想法?

4

4 回答 4

12

从 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);

--这段代码的来源

有关更复杂的示例代码,请参阅此相关问题:Is there a way to add a Widget to a QMenu in QtCreator

于 2014-03-25T13:29:04.007 回答
5

对于 Qt 5.1 及更高版本,您应该使用addSection(const QString &). 它专为您想要做的事情而设计。除非您非常注意匹配字体和间距等,否则基于小部件的解决方案会看起来很奇怪。

对于 Qt 4,如果你真的打算用 Qt 4 编译你的代码,你应该使用addAction(const QString &)它作为后备。我认为这是一个合理的权衡。

对于 Qt 5.0 - 好吧,你根本不应该再使用它了,就这么简单 :)

于 2014-03-25T22:01:07.103 回答
1

对于弹出菜单,您可以创建自定义 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;
}

然后,您可以将小部件添加到要在弹出菜单中显示的 toolButton:

myCustomWidgetAction * widgetAction   = new myCustomWidgetAction(this);

ui->toolButton->addAction(widgetAction);

您的自定义小部件可以是包含不同元素的列表,也可以是任何其他小部件。您还可以将 myCustomWidgetAction 的多个实例添加到 toolButton。

您还可以将其添加到 QMenu 中,例如:

QMenu* menu = new QMenu();

menu->addAction(widgetAction);
于 2014-03-25T14:22:15.637 回答
0

我刚刚用这个相当简单的策略解决了同样的问题,这对我来说已经足够好了:

QMenu* menu = new QMenu();
act = menu->addAction("My section 1 title:");
act->setEnabled(false);
// add Action 1
// add Action 2
// add Action 3

act = menu->addAction("My second section title:");
act->setEnabled(false);
// add Action 4
// add Action 5

于 2021-01-19T19:45:54.640 回答