經常會看到一些菜單的部分項是由幾個按鈕組成的,如酷狗、QQ、360都有類似菜單,對於常規的菜單項,圖標 + 文字 實現一個事件,很容易完成,那么怎么自定義菜單項呢?
Qt提供了支持,就是利用QWidget + QWidgetAction來完成。QWidgetAction繼承自QAction,無法通過繼承來實現一個界面,但它提供了setDefaultWidget來綁定一個界面,使用起來就更加方便了。
下面實現一個沒有Action的菜單,並通過按鈕顯示出來:
void UserMenu::CreateMenu()
{
//播放項
QWidgetAction *pWdtAction = new QWidgetAction(this);
//播放項界面,繼承自QWidget的類
PlayWidget *playWdt = new PlayWidget(this);
pWdtAction->setDefaultWidget(playWdt);
//創建一個包含聲音調整控件的界面項
QWidgetAction *pVoice = new QWidgetAction(this);
QWidget *pVoiceWdt = new QWidget(this);
QSlider *pSlider = new QSlider(Qt::Horizontal);
QHBoxLayout *layout = new QHBoxLayout(pVoiceWdt);
layout->addWidget(pSlider);
pVoiceWdt->setLayout(layout);
pVoice->setDefaultWidget(pVoiceWdt);
//生成菜單欄
QMenu *pMenu = new QMenu(this);
pMenu->addAction(pWdtAction);
pMenu->addSeparator();
pMenu->addAction(pVoice);
pMenu->addAction(QStringLiteral("顯示歌詞"));
pMenu->addAction(QStringLiteral("鎖定歌詞"));
pMenu->addSeparator();
pMenu->addAction(QStringLiteral("選項設置"));
pMenu->addSeparator();
pMenu->addAction(QStringLiteral("登陸"));
pMenu->addAction(QStringLiteral("退出"));
ui.pushButton->setMenu(pMenu);
}
初略效果圖如下: