QWidgetAction通过接口方式继承自QAction,用于将自定义的widget插入基于action的容器,例如工具栏。
    出现在应用程序中的绝大多数的actions都是代表了一个菜单项或工具栏中的一个按钮。然而有时候我们也许要复杂一点的widgets。例如,字处理程序工具栏中使用QComboBox实现zoom action,实现不同程度的缩放。QToolBar提供了QToolBar::insertWidget()函数可以十分方便的将单个widget插入到合适的位置。然而,如果你想在多个容器中实现自定义widget的action,那么你就必须实现QWidgetAction的子类。

    如果QWidgetAction添加到QToolBar,那么就会调用QWidgetAction::createWidget()。我们可以重新实现这个函数创建自定义的widget。

    如果将一个action从容器widget上删除,那么就会调用QWidgetAction::deleteWidget(),调用该函数的参数就是上面创建的自定义widget。该函数的默认实现是将widget隐藏,然后使用QObject::deleteLater()删除它。

    如果你只有一个自定义的widget,那么你就可以使用setDefaultWidget()函数将它设置为默认的widget。那么以后当action被添加到QToolBar上时,就会自动将该自定义的widget添加到QToolBar上。如果将仅有一个默认widget的QWidgetAction同时添加到两个工具栏上,那么仅有第一个添加才会显示出来。QWidgetAction接管了默认的widget。

    注意:这取决于widget激活action,例如重新实现鼠标事件处理者,然后调用QAction::trigger()。 Mac OS X:在Mac OS X上,如果你将一个widget添加到应用程序菜单栏的某个菜单上,那么该widget可以显示出来,并且可以实现功能,只是有一些限制:

    • 该widget的父对象不再是QMenu而是原生的菜单视图。如果你在其他地方显示菜单(例如作为一个弹出菜单),那么该菜单不会显示在你期望的地方
    • 针对该widget的Focus/Keyboard处理不再可用
    • 由于Apple的设计,该widget的鼠标轨迹暂时不可用
    • triggered()信号链接到打开模态对话框的槽函数上会导致应用程序崩溃(在Mac OS X10.4,这被告知是Apple的一个BUG),一个规避的方法是使用QueuedConnection代替DirecConnection
    1. class MyMenuItem:public QWidget
    2. {
    3. Q_OBJECT
    4. public:
    5. MyMenuItem(QWidget *parent)
    6. {
    7. new QLabel("test",this);
    8. }
    9. };
    10. MyMenuItem *item1 = new MyMenuItem(this);
    11. item1->setFixedSize(100,100); //这里可以设置大小
    12. QWidgetAction *action1 = new QWidgetAction(popupMenu);
    13. action1->setDefaultWidget(item1);
    14. MyMenuItem *item2 = new MyMenuItem(this);
    15. QWidgetAction *action2 = new QWidgetAction(popupMenu);
    16. action2->setDefaultWidget(item2);
    17. MyMenuItem *item3 = new MyMenuItem(this);
    18. QWidgetAction *action3 = new QWidgetAction(popupMenu);
    19. action3->setDefaultWidget(item3);