1. 程式人生 > 其它 >如何讓MenuBar的選單欄靠右對齊?

如何讓MenuBar的選單欄靠右對齊?

技術標籤:Qt

目錄}

前言

這個需求耗費了我至少一個下午的時間,明明就是很簡單的功能,但就是四筆實現不了,最終終是實現了,這裡做一個記錄。

正言

首先,先上效果圖:
在這裡插入圖片描述
就是我上面畫橫線的地方,就是我最終要移過去的Action。
如果你們懶得看我的誤區,就直接看正解即可,但我覺得誤區這裡還是值得看一下的。

誤區

首先,最上面這個是QMenuBar。我這四個都是QAction。都是直接使用QMenuBar->addAction()就可以實現弄上去了。但問題來了,我現在要讓其中的三個靠右啊?
首先,之前想的一直是將這幾個Action加入佈局之中,然後中間放一個彈簧就可以了,但這種方式最終是失敗了。好像只要把這個Action放入佈局之中, 我的最右邊的那幾個Action就會失效看不到了。這種方法這樣就失敗了。

正解

接下來列下幾種解決的辦法,但最前面的幾種肯定是有它的侷限性,所以我最後沒有采用,不然,前面幾種還是挺容易的。

  1. 首先,我弄了一個QWidget和一個QHBoxLayout,我把那最右邊的三個QAction都加入這個QHBoxLayout之中,然後加入這個QWidget之中,這樣,這三個QAction就被我圈在一起了,然後,我就使用QMenuBar->setConnerWidget(),將這個widget加入到這個QMenuBar之中了。這樣,我們可以實現基本的效果,沒啥問題。
  2. 但接下來,我又發現,不行啊,這樣加的話,你的這個QMenuBar是沒辦法進行拖動,就類似你要拖動這個視窗,但點選這個QMenuBar是會拖動失敗的,很難受,原因在這:就是當你將QMainWindow的最上層的title去掉之中,這個QMainWindow會失去它原來的屬性,就是沒辦法進行拖動,放大縮小,這部分內容,我會在另一篇文章講,但即使你實現了其他部分的放大縮小,這個地方也沒有辦法解決,因為這個地方它就是無法聚集到焦點。所以,我的解決辦法如下:
    我最終還是選擇使用QToolBar來作為這個介面的最上層,不然,實在搞不了啊。
    首先,我們使用了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();