Qt__主窗口、菜單和工具條(QMainWindow,QMenu,QToolBar)


轉自豆子空間

主窗口##

Qt的GUI程序有一個常用的頂層窗口,叫做MainWindow。MainWindow繼承自QMainWindow。QMainWindow窗口分成幾個主要的區域:

最上面是Window Title,用於顯示標題和控制按鈕,比如最大化、最小化和關閉等;下面一些是Menu Bar,用於顯示菜單;再下面一點事Toolbar areas,用於顯示工具條,注意,Qt的主窗口支持多個工具條顯示,因此這里是ares,你可以把幾個工具條並排顯示在這里,就像Word2003一樣;工具條下面是Dock window areas,這是停靠窗口的顯示區域,所謂停靠窗口就是像Photoshop的工具箱一樣,可以在主窗口的四周顯示;再向下是Status Bar,就是狀態欄;中間最大的Central widget就是主要的工作區了。

菜單和工具條##

QMainWindow的基礎之上添加菜單和工具條。

Qt里面有一個類,叫做QAction。顧名思義,QAction類保存有關於這個動作,也就是action的信息,比如它的文本描述、圖標、快捷鍵、回調函數(也就是信號槽),等等。神奇的是,QAction能夠根據添加的位置來改變自己的樣子——如果添加到菜單中,就會顯示成一個菜單項;如果添加到工具條,就會顯示成一個按鈕。

添加一個打開命令。那么,就在頭文件里面添加一個私有的QAction變量:

class QAction;
//...
private:
        QAction *openAction;
//...

注意,不要忘記QAction類的前向聲明哦!要不就會報錯的!

然后我們要在cpp文件中添加QAction的定義。為了簡單起見,我們直接把它定義在構造函數里面:

       openAction = new QAction(tr("&Open"), this);
       openAction->setShortcut(QKeySequence::Open);
       openAction->setStatusTip(tr("Open a file."));

第一行代碼創建一個QAction對象。QAction有幾個重載的構造函數,我們使用的是

QAction(const QString &text, QObject* parent);

這一個。它有兩個參數,第一個text是這個動作的文本描述,用來顯示文本信息,比如在菜單中的文本;第二個是parent,一般而言,我們通常傳入this指針就可以了。我們不需要去關心這個parent參數具體是什么,它的作用是指明這個QAction的父組件,當這個父組件被銷毀時,比如delete或者由系統自動銷毀,與其相關聯的這個QAction也會自動被銷毀。

第二句,我們使用了setShortcut函數。shortcut是這個動作的快捷鍵。Qt的QKeySequence已經為我們定義了很多內置的快捷鍵,比如我們使用的Open。你可以通過查閱API文檔獲得所有的快捷鍵列表,或者是在QtCreator中輸入::后會有系統的自動補全功能顯示出來。這個與我們自己定義的有什么區別呢?簡單來說,我們完全可以自己定義一個tr("Ctrl+O")來實現快捷鍵。原因在於,這是Qt跨平台性的體現。比如PC鍵盤和Mac鍵盤是不一樣的,一些鍵在PC鍵盤上有,而Max鍵盤上可能並不存在,或者反之,所以,推薦使用QKeySequence類來添加快捷鍵,這樣,它會根據平台的不同來定義不同的快捷鍵。

第三句是setStatusTip函數。這是添加狀態欄的提示語句。狀態欄就是主窗口最下面的一條。現在我們的程序還沒有添加狀態欄,因此你是看不到有什么作用的。

下面要做的是把這個QAction添加到菜單和工具條:

        QMenu *file = menuBar()->addMenu(tr("&File"));
        file->addAction(openAction);

        QToolBar *toolBar = addToolBar(tr("&File"));
        toolBar->addAction(openAction);

QMainWindow有一個menuBar()函數,會返回菜單欄,也就是最上面的那一條。如果不存在會自動創建,如果已經存在就返回那個菜單欄的指針。直接使用返回值添加一個菜單,也就是addMenu,參數是一個QString,也就是顯示的菜單名字。然后使用這個QMenu指針添加這個QAction。類似的,使用addToolBar函數的返回值添加了一個工具條,並且把這個QAction添加到了上面。

好了,主要的代碼已經寫完了。不過,如果你只修改這些的話,是編譯不過的哦!因為像menuBar()函數返回一個QMenuBar指針,但是你並沒有include它的頭文件哦!雖然沒有明着寫出QMenuBar這個類,但是實際上你已經用到了它的addMenu函數了,所以還是要注意的!

添加圖標##

回到mainwindow.cpp,在構造函數中填入代碼:

openAction->setIcon(QIcon("../resource/open-file.png"));

使用setIcon添加圖標。

效果##


linux_mint

代碼##

//main.cpp
#include <qapplication.h>
#include "mainwindow.h"

int main( int argc, char **argv )
{
    QApplication a( argc, argv );

    MainWindow w;
    w.show();

    return a.exec();
}
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    QAction *openAction;
};

#endif // MAINWINDOW_H
//mainwindow.cpp
#include <QtGui/QAction>
#include <QtGui/QMenu>
#include <QtGui/QMenuBar>
#include <QtGui/QKeySequence>
#include <QtGui/QToolBar>
#include <QMessageBox>
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
{
        openAction = new QAction(tr("&Open"), this);
        openAction->setShortcut(QKeySequence::Open);
        openAction->setStatusTip(tr("Open a file."));
        openAction->setIcon(QIcon("../resource/open-file.png"));
        connect(openAction, SIGNAL(triggered()), this, SLOT(open()));

        QMenu *file = menuBar()->addMenu(tr("&File"));
        file->addAction(openAction);

        QToolBar *toolBar = addToolBar(tr("&File"));
        toolBar->addAction(openAction);
}

void MainWindow::open()
{
        QMessageBox::information(NULL, tr("Open"), tr("Open a file"));
}

MainWindow::~MainWindow()
{

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM