Qt QMdiArea和QMdiSubWindow的基本用法


大多數復雜的程序,都使用MDI框架,在Qt designer中可以直接將控件MDI Area拖入使用。

QMdiArea一般使用於主窗口中,用於容納多個子窗口QMdiSubWindow

 

代碼如下:

mainwindow.h

 1 #ifndef MAINWINDOW_H  2 #define MAINWINDOW_H
 3 
 4 #include <QMainWindow>
 5 #include <QTextEdit>
 6 #include <QLabel>
 7 #include <QMdiSubWindow>
 8 
 9 namespace Ui { 10 class MainWindow; 11 } 12 
13 class MainWindow : public QMainWindow 14 { 15  Q_OBJECT 16 
17 public: 18     explicit MainWindow(QWidget *parent = 0); 19     ~MainWindow(); 20 
21 private: 22     Ui::MainWindow *ui; 23     QMdiSubWindow *newwin; 24 
25 private slots: 26     void on_btnCloseAll_clicked(); 27     void on_btnClose_clicked(); 28     void on_btnNext_clicked(); 29     void on_btnPrevious_clicked(); 30     void on_btnNewWindow_clicked(); 31     void on_btnRemoveWindow_clicked(); 32 
33 }; 34 
35 #endif // MAINWINDOW_H

mainwindow.cpp

 1 #include "mainwindow.h"
 2 #include "ui_mainwindow.h"
 3 
 4 MainWindow::MainWindow(QWidget *parent) :  5  QMainWindow(parent),  6     ui(new Ui::MainWindow)  7 {  8     ui->setupUi(this);  9 
10     //window1
11     QTextEdit *window1 = new QTextEdit; 12     window1->setHtml("C"); 13     ui->mdiArea->addSubWindow(window1);     //將window1放進mdiArea框架 14 
15     //window2
16     QTextEdit *window2 = new QTextEdit; 17     window2->setHtml("C++"); 18     ui->mdiArea->addSubWindow(window2); 19 
20     //window3
21     QTextEdit *window3 = new QTextEdit; 22     window3->setHtml("Java"); 23     ui->mdiArea->addSubWindow(window3); 24 
25     //window4
26     QTextEdit *window4 = new QTextEdit; 27     window4->setHtml("Hello World"); 28     ui->mdiArea->addSubWindow(window4); 29 
30     ui->mdiArea->cascadeSubWindows();   //SubWindows重疊排列
31 
32     connect(ui->pushButton_6,SIGNAL(clicked()),this,SLOT(on_btnPrevious_clicked())); 33     connect(ui->pushButton_7,SIGNAL(clicked()),this,SLOT(on_btnNext_clicked())); 34     connect(ui->pushButton_8,SIGNAL(clicked()),this,SLOT(on_btnClose_clicked())); 35     connect(ui->pushButton_9,SIGNAL(clicked()),this,SLOT(on_btnCloseAll_clicked())); 36     connect(ui->pushButton_10,SIGNAL(clicked()),this,SLOT(on_btnNewWindow_clicked())); 37     connect(ui->pushButton_11,SIGNAL(clicked()),this,SLOT(on_btnRemoveWindow_clicked())); 38 } 39 
40 MainWindow::~MainWindow() 41 { 42     delete ui; 43 } 44 
45 void MainWindow::on_btnCloseAll_clicked() 46 { 47     ui->mdiArea->closeAllSubWindows(); 48 } 49 
50 void MainWindow::on_btnClose_clicked() 51 { 52     ui->mdiArea->closeActiveSubWindow(); 53 } 54 
55 void MainWindow::on_btnNext_clicked() 56 { 57     ui->mdiArea->activateNextSubWindow(); 58 } 59 
60 void MainWindow::on_btnPrevious_clicked() 61 { 62     ui->mdiArea->activatePreviousSubWindow(); 63 } 64 
65 void MainWindow::on_btnNewWindow_clicked() 66 { 67     newwin = new QMdiSubWindow; 68     newwin->setWindowTitle("test"); 69     newwin->setWidget(&QLabel("hey")); 70     newwin->setAttribute(Qt::WA_DeleteOnClose); 71     newwin->resize(200,200); 72     ui->mdiArea->addSubWindow(newwin); 73     newwin->show();     //在非構造函數不加show(),不顯示 74     //setActiveSubWindow(QMdiSubWindow *window); 設置active窗口
75 } 76 
77 void MainWindow::on_btnRemoveWindow_clicked() 78 { 79     ui->mdiArea->removeSubWindow(ui->mdiArea->currentSubWindow());   //remove 當前窗口
80 }

Demo:

上圖中的子窗口就是QMdiSubWindow窗口

 

QMdiArea類的函數解析: QMdiSubWindow *addSubWindow(QWidget *widget, Qt::WindowFlags flags = Qt::WindowFlags());     //在MDI區域中添加SubWindow子窗口。

void removeSubWindow(QWidget *widget);                                        //刪除MDI區域中SubWindow子窗口

void setBackground(const QBrush &background);                                 //設置MDI區域的背景,默認為灰色

void setActivationOrder(WindowOrder order);                                   //設置激活順序,默認以創建先后激活,槽函數中有調用

void setOption(AreaOption option, bool on = true);                            //現只有一個選項,即創建子窗口,窗口不充滿這個區域,默認是充滿的 

void setViewMode(ViewMode mode);                                              //設置視口模式,默認area中很多小窗口,也可以是有tabBar形式的,設置tab的函數,都需要先開啟這個 

void setDocumentMode(bool enabled);                                           //設置文檔模式

void setTabsClosable(bool closable);                                          //默認為否。設置為true時,tab上會出現一個關閉的小按鈕

void setTabsMovable(bool movable);                                            //設置是否可移動,默認為false,可以移動時,可拖動tab在tabBar上移動

void setTabShape(QTabWidget::TabShape shape);                                 //設置tab的形狀,默認長方形,也可以是梯形

void setTabPosition(QTabWidget::TabPosition position);                        //設置tabBar的方位,有東南西北四方位

void activateNextSubWindow();                                                 //act下一個子窗口

void activatePreviousSubWindow();                                             //act上一個子窗口

void closeActiveSubWindow();                                                   //關閉active的子窗口

void closeAllSubWindows();                                                     //關閉所有子窗口

void cascadeSubWindows();                                                      //MDI區域內的所有子窗口重疊排列

void tileSubWindows();                                                         //將所有子窗口在MDI區域內排列整齊

void setActiveSubWindow(QMdiSubWindow *window);                     //設置active窗口為window

void subWindowActivated(QMdiSubWindow *window);                     //signals信號,為切換激活的子窗口時發出的信號

 
enum QMdiArea::WindowOrder : QMdiArea::CreationOrder 0 按創建時的先后順序 QMdiArea::StackingOrder 1 堆疊順序 QMdiArea::ActivationHistoryOrder 2 按激活歷史前后順序 enum QMdiArea::ViewMode : QMdiArea::SubWindowView 0 以小窗口形式顯示(默認) QMdiArea::TabbedView 1 不僅可小窗口,而且形成tabBar enum QTabWidget::TabShape : QTabWidget::Rounded 0 tab形狀為方形,默認 QTabWidget::Triangular 1 tab形狀為梯形 enum QTabWidget::TabPosition : QTabWidget::North 0 tab在上方顯示 QTabWidget::South 1 tab在下方 QTabWidget::West 2 tab在左方 QTabWidget::East 3   tab在右方

 


免責聲明!

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



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