我正在尝试构建一个菜单,其中包含一些在 QT 中不可交互的项目。我在 MyCustomMenuClass 中继承 QMenu。我正在尝试将部分标题添加到我的菜单中,以便用户更清楚。
例如,它应该如下所示:
My section 1 title
Action 1
Action 2
Action 3
My second section title
Action 4
Action 5
问题是部分标题总是对鼠标做出反应,但我希望他们不要对鼠标做出反应,这样它会更漂亮。关于如何做的任何想法?
从 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
对于 Qt 5.1 及更高版本,您应该使用addSection(const QString &)
. 它专为您想要做的事情而设计。除非您非常注意匹配字体和间距等,否则基于小部件的解决方案会看起来很奇怪。
对于 Qt 4,如果你真的打算用 Qt 4 编译你的代码,你应该使用addAction(const QString &)
它作为后备。我认为这是一个合理的权衡。
对于 Qt 5.0 - 好吧,你根本不应该再使用它了,就这么简单 :)
对于弹出菜单,您可以创建自定义 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);
我刚刚用这个相当简单的策略解决了同样的问题,这对我来说已经足够好了:
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