Qt QMdiArea和QMdiSubWindow的基本用法

大多数复杂的程序,都使用MDI框架,在Qt designer中可以直接将控件MDI Area拖入使用。

QMdiArea一般使用于主窗口中,用于容纳多个子窗口QMdiSubWindow

代码如下:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextEdit>
#include <QLabel>
#include <QMdiSubWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QMdiSubWindow *newwin;

private slots:
    void on_btnCloseAll_clicked();
    void on_btnClose_clicked();
    void on_btnNext_clicked();
    void on_btnPrevious_clicked();
    void on_btnNewWindow_clicked();
    void on_btnRemoveWindow_clicked();

};

#endif // MAINWINDOW_H

CSDN QT开发技术文推荐:Qt开发必备技术栈学习路线和资料

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //window1
    QTextEdit *window1 = new QTextEdit;
    window1->setHtml("C");
    ui->mdiArea->addSubWindow(window1);     //将window1放进mdiArea框架

    //window2
    QTextEdit *window2 = new QTextEdit;
    window2->setHtml("C++");
    ui->mdiArea->addSubWindow(window2);

    //window3
    QTextEdit *window3 = new QTextEdit;
    window3->setHtml("Java");
    ui->mdiArea->addSubWindow(window3);

    //window4
    QTextEdit *window4 = new QTextEdit;
    window4->setHtml("Hello World");
    ui->mdiArea->addSubWindow(window4);

    ui->mdiArea->cascadeSubWindows();   //SubWindows重叠排列

    connect(ui->pushButton_6,SIGNAL(clicked()),this,SLOT(on_btnPrevious_clicked()));
    connect(ui->pushButton_7,SIGNAL(clicked()),this,SLOT(on_btnNext_clicked()));
    connect(ui->pushButton_8,SIGNAL(clicked()),this,SLOT(on_btnClose_clicked()));
    connect(ui->pushButton_9,SIGNAL(clicked()),this,SLOT(on_btnCloseAll_clicked()));
    connect(ui->pushButton_10,SIGNAL(clicked()),this,SLOT(on_btnNewWindow_clicked()));
    connect(ui->pushButton_11,SIGNAL(clicked()),this,SLOT(on_btnRemoveWindow_clicked()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_btnCloseAll_clicked()
{
    ui->mdiArea->closeAllSubWindows();
}

void MainWindow::on_btnClose_clicked()
{
    ui->mdiArea->closeActiveSubWindow();
}

void MainWindow::on_btnNext_clicked()
{
    ui->mdiArea->activateNextSubWindow();
}

void MainWindow::on_btnPrevious_clicked()
{
    ui->mdiArea->activatePreviousSubWindow();
}

void MainWindow::on_btnNewWindow_clicked()
{
    newwin = new QMdiSubWindow;
    newwin->setWindowTitle("test");
    newwin->setWidget(&QLabel("hey"));
    newwin->setAttribute(Qt::WA_DeleteOnClose);
    newwin->resize(200,200);
    ui->mdiArea->addSubWindow(newwin);
    newwin->show();     //在非构造函数不加show(),不显示
    //setActiveSubWindow(QMdiSubWindow *window);     设置active窗口
}

void MainWindow::on_btnRemoveWindow_clicked()
{
    ui->mdiArea->removeSubWindow(ui->mdiArea->currentSubWindow());   //remove 当前窗口
}

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在右方

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓ 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt多文档窗口应用中,有时会出现这样一个应用场景:在这个全局应用中,只new了一次,其后操作就是隐藏和现实。 即:通过界面的工具栏或菜单,触发显示一个子窗口,当这个窗口存在时候,显示在最前面,点击窗口关闭的时候,只是隐藏这个窗口,而不是销毁。 父窗口中主要代码如下: pW1 = new myWidget(ui.mdiArea) ; //new一个子部件 QMdiSubWindow pMdiSubwin1 = ui.mdiArea->addSubWindow(pW1) ;//将子部件 装入QMdiSubWindow,同时获取该QMdiSubWindow指针 pMdiSubwin1->hide(); //设置子窗口隐藏 pW1->installEventFilter(this); //在父窗口中注册子部件消息过滤事件 在子部件发生QCloseEvent事件时候,直接忽略该事件: void myWidget::closeEvent(QCloseEvent *e) { e->ignore(); } 尽管在子窗口中忽略了该窗口的关闭动作,实际并未关闭,但是该消息通过注册在父窗口的消息过滤器传到父窗口中,在父窗口中的过滤事件处理时,通过QMdiSubWindow隐藏操作,实现隐藏子窗口: if( (target == pW1 ) && (event->type() == QEvent::Close) ) pMdiSubwin1->hide() ; 小结: 本例程在VS2010+QT。8.5下实现,方法及思路 在该应用中只能通过获取子窗口的指针进行隐藏/小时操作,而不是使用被装入子窗口的部件窗口指针进行操作。 另:直接通过子部件隐藏操作,会出现子部件中的部件消失,只剩下僵尸窗口的现象,不能实现隐藏子窗口。 例程源码链接:https://download.csdn.net/download/weixin_46079613/12517109

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值