【问题标题】:Non interactive items in QMenuQMenu 中的非交互项
【发布时间】:2014-03-25 13:21:03
【问题描述】:

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

例如,它应该是这样的:

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

问题是部分标题总是对鼠标做出反应,但我希望它们不要对鼠标做出反应,这样它会更漂亮。有什么想法吗?

【问题讨论】:

    标签: c++ qt qmenu


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我试过了,但这些部分在 Win7 上显示为纯分隔符。其他人有这个问题吗?
      • @Martin 这是一个错误。如果还没有错误,请随时报告。
      • 看起来像Windows style doesn't support separators with text。使用 Qt5.1 融合风格(通过添加命令行选项-style fusion),分隔符文本可见。
      • @Martin 这仍然是一个错误 :) 那里没有太多特定于 Windows 的内容,只是样式代码缺少一个功能,Qt 在这方面并不依赖于 Windows 本身。如果没有错误报告,我建议您提交一份,至少它可以识别缺失的功能。
      • 参见 Qt5.1.1、qwindowsvistastyle.cpp、l.1278:分隔符没有用文本装饰(将绘制为 l.1354ff),这似乎是设计使然。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        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
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-17
          • 2010-11-26
          • 1970-01-01
          • 2016-02-17
          • 2012-10-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多