2014-03-25 36 views
5

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

例如,它应该是这样的:

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

的问题是,部分标题总是反应的鼠标,但我想他们不是鼠标反应过来,让这将是漂亮。任何想法如何做到这一点?

回答

7

从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

+0

它的工作,谢谢! – abousquet

+0

欢迎来到Stack Overflow!现在你赢得了一些声誉,你也可以提出答案。我认为这里有几个很好的答案。 – ypnos

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

然后,您可以您的小工具添加到工具按钮在弹出菜单中进行diaplayed:

myCustomWidgetAction * widgetAction = new myCustomWidgetAction(this); 

ui->toolButton->addAction(widgetAction); 

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

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

QMenu* menu = new QMenu(); 

menu->addAction(widgetAction); 
3

对于Qt的5.1及以上,你应该使用addSection(const QString &)。它的设计正是为了你想要做的。基于窗口小部件的解决方案看起来很奇怪,除非你非常注意匹配字体和间距等。

对于Qt 4,如果你真的打算用Qt 4编译你的代码,那么你应该使用addAction(const QString &)作为后备。我认为合理的折衷。

QT间期5.0 - 好,你不应该使用它在所有了,就这么简单:)

+0

我试过了,但在Win7上这些部分显示为简单的分隔符。其他人有这个问题? –

+0

@Martin这是一个错误。如果没有问题,请随时举报。 –

+0

它看起来像[Windows风格不支持带文本的分隔符](http://www.qtcentre.org/threads/12161-QMenu-addSeparator%28%29-and-setText%28%29?p=64440# post64440)。使用Qt5.1融合样式(通过添加命令行选项'-style fusion'),分隔符文本是可见的。 –