QMenu中的非互动项目

时间:2014-03-25 13:21:04

标签: c++ qt qmenu

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

例如,它应该如下所示:

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

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

4 个答案:

答案 0 :(得分:10)

来自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);

- Source for this code

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

答案 1 :(得分:4)

对于Qt 5.1及更高版本,您应该使用addSection(const QString &)。它的设计精确适合您尝试做的事情。基于小部件的解决方案看起来很奇怪,除非你非常注意匹配字体和间距等。

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

对于Qt 5.0 - 嗯,你根本不应该再使用它了,它就像那样简单:)

答案 2 :(得分: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;
}

然后,您可以将小部件添加到工具栏中,以便在弹出菜单中显示:

myCustomWidgetAction * widgetAction   = new myCustomWidgetAction(this);

ui->toolButton->addAction(widgetAction);

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

您也可以将它添加到QMenu中,如:

QMenu* menu = new QMenu();

menu->addAction(widgetAction);

答案 3 :(得分: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