Main Window and Related Classes
| 動作類,用於當做一個菜單項或工具項插入菜單或工具欄 |
|
| 動作組,用於管理多個動作,設置它們之間的互斥性等 |
|
| 部件動作,繼承自QAction,用於將小部件插入菜單或工具欄 |
|
| 懸浮部件,程序運行后可鼠標拖動的部件 |
|
| 主窗口,是其它部件的容器 |
|
| 子區域,加到QMainWindow中,用於放置多個QMdiSubWindow子窗口 |
|
| 子窗口 |
|
| 菜單 |
|
| 菜單欄,存放多個菜單 |
|
| 管理頂層窗口尺寸,一般位於軟件的右下角,狀態欄最右邊,鼠標可拖動它改變窗口大小 |
|
| 狀態欄 |
|
| 工具欄 |
以QMainWindow為中心,構成了傳統界面的各部分,現將它們拖在一起記錄。
以rar壓縮軟件界面為例,各部分組成如下:
最上一行,叫菜單欄,由“文件”、“命令”等菜單組成,“選項”菜單已點擊,彈出很多菜單項,Qt中用動作類QAction來表示菜單項。即QAction構成了菜單,菜單構成了菜單條,QAction可加入文字,圖片等構成漂亮的菜單項。QDockWidget 懸浮部件較特殊,它在程序運行時,拖動可改變其位置。
——————————————————————————————————————————————————————————————————
建立步驟:
為了構建傳統界面,需要在建立工程某步時選擇繼承類,如下圖。

建成后,ui文件如下,“在這里輸入”即是要求我們創建菜單,菜單欄下面一層即是默認的工具欄,沒有添加動作,所以很細小(最左方有一個小點)

雙擊“在這里輸入后”,可以寫入文字,如下圖,輸入了創建了常用的“文件”。在下方五個按鈕處的第一個新建一個動作,可以指定動作的名稱,快捷鍵等,建完后,將它拖動到菜單或工具欄。

以下是效果圖:

這時,只要將這個“動作”的“觸發”信號連接到某個槽函數后,點擊該菜單項或工具欄上的“新建”,就會執行槽函數。
以上就是建立一個傳統界面的粗糙步驟
——————————————————————————————————————————————————————————————
QMainWindow
一個 主窗口各部分分布如圖:

對比(圖中中間白色大框為一個QTableWidget表格小部件):

QMainWindow(QWidget * parent = 0, Qt::WindowFlags flags = 0) ~QMainWindow() //設置菜單部分 void setMenuBar(QMenuBar * menuBar)//帶ui文件默認是有一個菜單條的,如果設置了這個之后,則默認的被覆蓋,一個MainWindow只能有一個主菜單處於最上方 void setMenuWidget(QWidget * menuBar)//覆蓋默認菜單,用一個自定義的部件代替菜單,甚至可以用一個按鈕……,比較靈活,看不慣默認菜單的,可試試這個。 //工具欄部分 void addToolBar(Qt::ToolBarArea area, QToolBar * toolbar)//添加一個工具條,用枚舉值Qt::ToolBarArea(見1)設定停靠區域,由圖可見,停靠區分為上下左右四區域。 void addToolBar(QToolBar * toolbar)//添加一個工具條(默認緊跟上一個工具條) QToolBar * addToolBar(const QString & title) void addToolBarBreak(Qt::ToolBarArea area = Qt::TopToolBarArea)//添加一個Break(破裂; 間斷; 或譯為區域),這時,新添加的工具條將不再緊跟前一個工具條,而是另起一行。 void insertToolBar(QToolBar * before, QToolBar * toolbar)//在before工具條后加一個 void insertToolBarBreak(QToolBar * before)//添加分隔線 void removeToolBar(QToolBar * toolbar) void removeToolBarBreak(QToolBar * before) void setToolButtonStyle(Qt::ToolButtonStyle toolButtonStyle)//設置工具條上顯示模式,默認只有文件,可設置成圖片或文字形式(見2) void setIconSize(const QSize & iconSize)//設置工具條上圖標大小,在上一個函數設置圖標模式后有效 //可停靠窗口部件 void addDockWidget(Qt::DockWidgetArea area, QDockWidget * dockwidget)//area枚舉值見3 void addDockWidget(Qt::DockWidgetArea area, QDockWidget * dockwidget, Qt::Orientation orientation) void removeDockWidget(QDockWidget * dockwidget) void setCorner(Qt::Corner corner, Qt::DockWidgetArea area)//讓四個角落(corner)中一個區域"歸屬於"某個區域(area),具體看最下方例子 void setDockOptions(DockOptions options)//設置停靠選項,比如允許動畫或是否允許拖放重合成一個tab選項卡類型的部件,枚舉值見4 void setTabPosition(Qt::DockWidgetAreas areas, QTabWidget::TabPosition tabPosition)//設置形成的tab位置 void setTabShape(QTabWidget::TabShape tabShape) void setDocumentMode(bool enabled) void splitDockWidget(QDockWidget * first, QDockWidget * second, Qt::Orientation orientation)//部件拖動至處於同一區域時,默認重合形成tab,利用這個,可將它們分開 //設置中間部件 void setCentralWidget(QWidget * widget) QWidget * centralWidget() const //添加狀態欄 void setStatusBar(QStatusBar * statusbar) //保存窗口形狀信息 bool restoreState(const QByteArray & state, int version = 0) <p>QByteArray saveState(int version = 0) const bool restoreDockWidget(QDockWidget * dockwidget) </p>//其它 Qt::DockWidgetArea corner(Qt::Corner corner) const virtual QMenu * createPopupMenu() DockOptions dockOptions() const Qt::DockWidgetArea dockWidgetArea(QDockWidget * dockwidget) const bool documentMode() const QSize iconSize() const bool isAnimated() const bool isDockNestingEnabled() const QMenuBar * menuBar() const QWidget * menuWidget() const QStatusBar * statusBar() const QTabWidget::TabPosition tabPosition(Qt::DockWidgetArea area) const QTabWidget::TabShape tabShape() const QList<QDockWidget *> tabifiedDockWidgets(QDockWidget * dockwidget) const void tabifyDockWidget(QDockWidget * first, QDockWidget * second) QWidget * takeCentralWidget() Qt::ToolBarArea toolBarArea(QToolBar * toolbar) const bool toolBarBreak(QToolBar * toolbar) const Qt::ToolButtonStyle toolButtonStyle() const
1,enum Qt::ToolBarArea
| Constant | Value |
|---|---|
| Qt::LeftToolBarArea | 0x1 |
| Qt::RightToolBarArea | 0x2 |
| Qt::TopToolBarArea | 0x4 |
| Qt::BottomToolBarArea | 0x8 |
| Qt::AllToolBarAreas | ToolBarArea_Mask |
| Qt::NoToolBarArea | 0 |
2,enum Qt::ToolButtonStyle
| Constant | Value | Description |
|---|---|---|
| Qt::ToolButtonIconOnly | 0 | 只顯示圖標 |
| Qt::ToolButtonTextOnly | 1 | Only display the text. |
| Qt::ToolButtonTextBesideIcon | 2 | The text appears beside the icon. |
| Qt::ToolButtonTextUnderIcon | 3 | 文本顯示在圖標下方 |
| Qt::ToolButtonFollowStyle | 4 | Follow the style. |
3,enum Qt::DockWidgetArea
flags Qt::DockWidgetAreas
| Constant | Value |
|---|---|
| Qt::LeftDockWidgetArea | 0x1 |
| Qt::RightDockWidgetArea | 0x2 |
| Qt::TopDockWidgetArea | 0x4 |
| Qt::BottomDockWidgetArea | 0x8 |
| Qt::AllDockWidgetAreas | DockWidgetArea_Mask |
| Qt::NoDockWidgetArea | 0 |
4,enum QMainWindow::DockOption
flags QMainWindow::DockOptions
| Constant | Value | Description |
|---|---|---|
| QMainWindow::AnimatedDocks | 0x01 | 與animated相同 |
| QMainWindow::AllowNestedDocks | 0x02 | 與dockNestingEnabled相同 |
| QMainWindow::AllowTabbedDocks | 0x04 | 允許形成下方有tapBar的重合部件 |
| QMainWindow::ForceTabbedDocks | 0x08 | Each dock area contains a single stack of tabbed dock widgets. In other words, dock widgets cannot be placed next to each other in a dock area. If this option is set, AllowNestedDocks has no effect. |
| QMainWindow::VerticalTabs | 0x10 | 設置tabBar在豎直左方位置(默認在下方) |
以rar壓縮軟件為例,用代碼寫出界面主要部分:


以下代碼只是用於理解,是很不合理的。主要測試各部分小部件的位置,外觀等,以及mainwidow的形狀配置保存
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QAction>
#include <QMenu>
#include <QIcon>
#include <QSize>
#include <QLabel>
#include <QDockWidget>
#include <QTableWidget>
#include <QSettings>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//菜單欄部分
QMenu *menu1=ui->menuBar->addMenu("文件(&F)");
QAction *me1_act1=menu1->addAction("打開壓縮文件(O)");
me1_act1->setShortcut(QKeySequence(tr("Ctrl+O")));
//connect(me1_act1,SIGNAL(triggered()),……
QAction *me1_act2=menu1->addAction("保存壓縮文件副本為(V)");
me1_act2->setIcon(QIcon("://img/sava.ico"));
menu1->addSeparator();
QAction *me1_act3=menu1->addAction("退出(X)");
connect(me1_act3,SIGNAL(triggered()),this,SLOT(close()));
ui->menuBar->addMenu("命令(&C)");
//"文件"菜單部分
QAction *tb1_act1=ui->mainToolBar->addAction(QIcon("://img/tool1.ico"),"添加");
ui->mainToolBar->addSeparator();
QAction *tb1_act2=ui->mainToolBar->addAction(QIcon("://img/tool2.ico"),"解壓到");
setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
setIconSize(QSize(50,50));
addToolBarBreak();
toolBar=new QToolBar;
toolBar->setObjectName("tb2");//設置對象名,用於保存配置
toolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
toolBar->setIconSize(QSize(20,20));
addToolBar(toolBar);
QAction *tb2_act1=toolBar->addAction(QIcon("://img/sharp.ico"),"");
//添加中間主部件
QTableWidget *tb1=new QTableWidget;
setCentralWidget(tb1);
//添加懸浮部件
QDockWidget *dock1= new QDockWidget("上側部件");
addDockWidget(Qt::TopDockWidgetArea,dock1);
QDockWidget *dock2_1= new QDockWidget("左側部件1");
addDockWidget(Qt::LeftDockWidgetArea,dock2_1);
QDockWidget *dock2_2= new QDockWidget("左側部件2");
addDockWidget(Qt::LeftDockWidgetArea,dock2_2);
splitDockWidget(dock2_1,dock2_2,Qt::Horizontal);
QDockWidget *dock3= new QDockWidget("右側部件");
dock3->setFeatures(QDockWidget::DockWidgetVerticalTitleBar|QDockWidget::DockWidgetMovable);
addDockWidget(Qt::RightDockWidgetArea,dock3);
QDockWidget *dock4= new QDockWidget("下側部件");
addDockWidget(Qt::BottomDockWidgetArea,dock4);
//setCorner(Qt::BottomLeftCorner,Qt::LeftDockWidgetArea);//讓左下角區域歸於左邊停靠區域
dock1->setObjectName("dock1");
dock2_1->setObjectName("dock2_1");
dock2_2->setObjectName("dock2_2");
dock3->setObjectName("dock3");
dock4->setObjectName("dock4");
//狀態欄部分
QLabel *lbl1=new QLabel("無狀態");
ui->statusBar->addWidget(lbl1);
//讀取窗口及部件形狀與狀態
readSettings();
}
void MainWindow::closeEvent(QCloseEvent *event)
{
QSettings settings("大中華有限公司", "測試軟件名");
settings.setValue("geometry", saveGeometry());
settings.setValue("windowState", saveState());
settings.sync();
}
void MainWindow::readSettings()
{
QSettings settings("大中華有限公司", "測試軟件名");
restoreGeometry(settings.value("geometry").toByteArray());
restoreState(settings.value("windowState").toByteArray());
}
MainWindow::~MainWindow()
{
delete ui;
}
