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
class MyMenuItem:public QWidget
{
Q_OBJECT
public:
MyMenuItem(QWidget *parent)
{
new QLabel("test",this);
}
};
MyMenuItem *item1 = new MyMenuItem(this);
item1->setFixedSize(100,100); //这里可以设置大小
QWidgetAction *action1 = new QWidgetAction(popupMenu);
action1->setDefaultWidget(item1);
MyMenuItem *item2 = new MyMenuItem(this);
QWidgetAction *action2 = new QWidgetAction(popupMenu);
action2->setDefaultWidget(item2);
MyMenuItem *item3 = new MyMenuItem(this);
QWidgetAction *action3 = new QWidgetAction(popupMenu);
action3->setDefaultWidget(item3);