如何讓MenuBar的選單欄靠右對齊?
阿新 • • 發佈:2021-02-03
技術標籤:Qt
目錄}
前言
這個需求耗費了我至少一個下午的時間,明明就是很簡單的功能,但就是四筆實現不了,最終終是實現了,這裡做一個記錄。
正言
首先,先上效果圖:
就是我上面畫橫線的地方,就是我最終要移過去的Action。
如果你們懶得看我的誤區,就直接看正解即可,但我覺得誤區這裡還是值得看一下的。
誤區
首先,最上面這個是QMenuBar。我這四個都是QAction。都是直接使用QMenuBar->addAction()
就可以實現弄上去了。但問題來了,我現在要讓其中的三個靠右啊?
首先,之前想的一直是將這幾個Action加入佈局之中,然後中間放一個彈簧就可以了,但這種方式最終是失敗了。好像只要把這個Action放入佈局之中, 我的最右邊的那幾個Action就會失效看不到了。這種方法這樣就失敗了。
正解
接下來列下幾種解決的辦法,但最前面的幾種肯定是有它的侷限性,所以我最後沒有采用,不然,前面幾種還是挺容易的。
- 首先,我弄了一個QWidget和一個QHBoxLayout,我把那最右邊的三個QAction都加入這個QHBoxLayout之中,然後加入這個QWidget之中,這樣,這三個QAction就被我圈在一起了,然後,我就使用QMenuBar->setConnerWidget(),將這個widget加入到這個QMenuBar之中了。這樣,我們可以實現基本的效果,沒啥問題。
- 但接下來,我又發現,不行啊,這樣加的話,你的這個QMenuBar是沒辦法進行拖動,就類似你要拖動這個視窗,但點選這個QMenuBar是會拖動失敗的,很難受,原因在這:就是當你將QMainWindow的最上層的title去掉之中,這個QMainWindow會失去它原來的屬性,就是沒辦法進行拖動,放大縮小,這部分內容,我會在另一篇文章講,但即使你實現了其他部分的放大縮小,這個地方也沒有辦法解決,因為這個地方它就是無法聚集到焦點。所以,我的解決辦法如下:
首先,我們使用了QToolBar來弄,那最前面的那個QMenu怎麼辦,我也找不到比較好的方法在QToolBar中來實現,最後,我使用的方法是:
自己new一個QMenuBar,然後將這個QMenu加入,然後,將這個QMenuBar加入到QToolBar的佈局之中,放在最前面。
將一個可無限延伸的QWidget加入在中間進行撐開:`QWidget *spacer = new QWidget(this);
spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);然後剩下就將最右邊的那幾個按鈕逐一加入到QToolBar之中即可,這方法可行。然後,你的QMenuBar還要調整一下長度,不然,你的QMenuBar如果太長也是拖動不了。這個長度的設定方式為:
QMenuBar *menuBar = new QMenuBar();menuBar->setFixedWidth(70);
這樣,最終就可以實現想要的效果了。 關於這個QToolBar的下面放QMenuBar的程式碼如下:
QToolBar *menuToolBar = this->addToolBar("MenuToolBar");
menuToolBar->setProperty("class","menuToolBarQss");
menuToolBar->setStyleSheet("border:none");
menuToolBar->setMovable(false);
QMenuBar *menuBar = new QMenuBar();
menuBar->setFixedWidth(70);
menuBar->setProperty("class","m_pMenuBarQss");
m_pFileMenu = new QMenu("File");
QAction *m_pActionSaveParameter = m_pFileMenu->addAction("Save Parameter");
m_pActionSaveParameter->setProperty("class","m_pActionSaveParameterQss");
menuBar->addMenu(m_pFileMenu);
menuToolBar->addWidget(menuBar);
QWidget *spacer = new QWidget(this);
spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
menuToolBar->addWidget(spacer);
QAction *m_pActionMinWidget = new QAction(this);
m_pActionMinWidget->setToolTip("Min Widget");
m_pActionMinWidget->setIcon(QIcon("./icon/white_minWidget.png")); //設定圖示,冒號表示該檔案處於資原始檔指定的地方
menuToolBar->addAction(m_pActionMinWidget);
m_pActionMaxWidget = new QAction(this);
m_pActionMaxWidget->setToolTip("Max Widget"); //資訊提示,當滑鼠靠近這個項,便會提示資訊
m_pActionMaxWidget->setIcon(QIcon("./icon/white_maxWidget.png")); //設定圖示,冒號表示該檔案處於資原始檔指定的地方
menuToolBar->addAction(m_pActionMaxWidget);
QAction *m_pActionCloseWidget = new QAction(this);
m_pActionCloseWidget->setToolTip("Close Widget"); //資訊提示,當滑鼠靠近這個項,便會提示資訊
m_pActionCloseWidget->setIcon(QIcon("./icon/white_closeWidget.png"));
menuToolBar->addAction(m_pActionCloseWidget);
this->addToolBarBreak();