我正在尝试构建一个菜单,其中包含一些在QT中不具有交互性的项目。我在MyCustomMenuClass中继承了QMenu。我正在尝试将部分标题添加到我的菜单中,以便用户更清楚。
例如,它应该如下所示:
My section 1 title
Action 1
Action 2
Action 3
My second section title
Action 4
Action 5
问题是部分标题总是对鼠标做出反应,但我希望它们不会对鼠标作出反应,以使其更漂亮。关于如何做的任何想法?
答案 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);
有关更复杂的示例代码,请参阅此相关问题: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