前言
有時候需要菜單項顯示的不僅是簡單的文字,需要顯示一個控件或界面,這時候QWidgetAction該上場了。
代碼和效果
QWidgetAction繼承的QAction,有QAction一切功能,在此基礎上增加了將自定義的widget插入基於action的容器。我看了QWidgetAction的幫助文檔,就幾個方法:
public:
QWidget *defaultWidget() const
void releaseWidget(QWidget *widget)
QWidget *requestWidget(QWidget *parent)
void setDefaultWidget(QWidget *widget)
protected:
virtual QWidget *createWidget(QWidget *parent)
QList<QWidget *> createdWidgets() const
virtual void deleteWidget(QWidget *widget)
若是隻是在菜單項上顯示定製的Widget,那麼常用的方法更少:用setDefaultWidget將定製的widget插入到action中,若需要則用defaultWidget獲取該widget的指針。
若是將QWidgetAction添加到QToolBar,那麼就會調用createWidget()。我們可以重新實現這個函數創建自定義的widget。createdWidgets獲取所有的由createWidget創建的widget的容器。
我這裏只用實現了最常用的QWidgetAction作爲菜單項:按鈕點擊,顯示菜單。MenuWidget 爲我自定義的widget。
connect(m_pIconLabel,&QPushButton::clicked,this,&TitleBar::showCustomMenu);
m_pMyMenu=new QMenu(this);
m_pShowWidgetAction=new QWidgetAction(this);
MenuWidget *widget=new MenuWidget(this);
widget->setFixedSize(400,350);
m_pShowWidgetAction->setDefaultWidget(widget);
m_pMyMenu->addAction(m_pShowWidgetAction);
顯示菜單和常規的一樣的,位置由自己決定
void TitleBar::showCustomMenu()
{
//Q_UNUSED(pos);
QWidget *pWindow = this->window();
int x=pWindow->geometry().x()+this->geometry().x();
int y=pWindow->geometry().y()+this->height()+3;
QPoint pos(x,y);
m_pMyMenu->exec(pos);
}
效果圖:
結束語
好了,就這麼菜單項的定製就這麼簡單。