QWidget/QToolBar::addAction的设计真是绝妙
今天在考虑一个Ribbon Page的设计, 想通过一个类直接生成按钮或者菜单, 想到QToolBar
不就可以这样吗? 于是去看一下它怎么做的.
本来是个简单的new QToolButton, 然后添加到 QLayout中, 一看之下, 觉得自己头脑太简单.
原来QToolBar::addAction调用了QWidget::addAction(protected) 方法, 高潮的地方在这里…
QWidget::addAction()并没有直接去创建按钮, 而是发出了一个自定义事件 QActionEvent, 然后让QApplication将这个事件发送给自己!:
void QWidget::insertAction(QAction *before, QAction *action)
{
// 这里略去了一段代码, 我们只看关键的
QActionEvent e(QEvent::ActionAdded, action, before);
QApplication::sendEvent(this, &e);
}
而QWidget里边处理事件的时候, 简单调用了自身的一个虚函数 QWidget::actionEvent
virtual void actionEvent(QActionEvent *event);
意思QWidget只负责处理, 解析事件和派发事件, 而QToolBar实现事件的处理, 去QToolBar::actionEvent()
中去看看, 果然如此(把控件加入到QToolBar的layout中):
void QToolBar::actionEvent(QActionEvent *event)
{
Q_D