Qt Widgets——主窗口及其主要組成部分


Main Window and Related Classes

QAction

動作類,用於當做一個菜單項或工具項插入菜單或工具欄

QActionGroup

動作組,用於管理多個動作,設置它們之間的互斥性等

QWidgetAction

部件動作,繼承自QAction,用於將小部件插入菜單或工具欄

QDockWidget

懸浮部件,程序運行后可鼠標拖動的部件

QMainWindow

主窗口,是其它部件的容器

QMdiArea

子區域,加到QMainWindow中,用於放置多個QMdiSubWindow子窗口

QMdiSubWindow

子窗口

QMenu

菜單

QMenuBar

菜單欄,存放多個菜單

QSizeGrip

管理頂層窗口尺寸,一般位於軟件的右下角,狀態欄最右邊,鼠標可拖動它改變窗口大小

QStatusBar

狀態欄

QToolBar

工具欄

以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;
}

  


免責聲明!

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



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