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

时间: 2024-10-23 10:51:22

Qt--QMdiArea和QMdiSubWindow的基本用法的相关文章

QMdiArea及QMdiSubWindow实现父子窗口及布局方法

版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QMdiArea及QMdiSubWindow实现父子窗口及布局方法     本文地址:http://techieliang.com/2017/12/756/ 文章目录 1. 介绍  1.1. QMdiArea接口  1.2. QMdiSubWindow接口 2. 范例 1. 介绍 QMdiArea类提供了一个子窗口区域,而QMdiSubWindow则是子窗口类,均继承自QWidget. 相关

Qt探秘——谈ui文件的用法

转载自:点击打开链接http://blog.csdn.net/luo_isaiah/article/details/5794973 相信用过Qt Designer的朋友,对Qt Project中的.ui文件并不陌生.这个文件在Qt Designer中并不能直接修改其源代码,而只能通过Qt Designer的图形工具对其进行操作.对于这一点,我不得不要赞一下设计Qt Designer的人,因为这大大可以避免.ui文件中出现语法错误的概率,同时使得程序员能省下大量的程序界面设计时间进而缩短整个程序项

Qt Quick里的AnimatedSprite的用法

之前用 AnimatedImage 时一直对 AnimatedSprite 很奇怪,想试一下怎么用,一下子没试出来,放下了,后来一直没时间. OK ,今天想起来,又搞了一下. AnimatedSprite 说明 AnimatedSprite 元素用来播放精灵动画. 一些常见的属性解释: source 属性是 url 类型的,接受一个包含多帧的图片. frameWidth 和 frameHeight 指定帧大小. frameX 和 frameY 指定第一帧的左上角. frameCount 指定这个

QT开发(六)——QT容器组件

QT开发(六)--QT容器组件 QT中有九种容器组件,分别是组合框QGroupBox.滚动区QScrollArea.工具箱QToolBox.选项卡QTabWidget.控件栈QWidgetStack.框架QFrame.组件QWidget.MDI窗口显示区QMdiArea.停靠窗口QDockWidget. 一.QGroupBox分组框 1.QGroupBox组件简介 QGroupBox为构建分组框提供了支持.分组框通常带有一个边框和一个标题栏,作为容器部件来使用,在其中可以布置各种窗口部件.分组框

Qt多文档界面应用设计

使用Qt编写多文档界面(MDI)应用相当方便,主要会使用到QMdiArea和QMdiSubWindow两个类.可以查看Qt Asistant中这两个类的说明文档,里面介绍的相当详细.另外,可以搜索例程"Mdi Example",这是提供的一个示例程序,这是一个多文档编辑器,代码很详细,只是缺少注释,不过很简单,应该容易看懂.接下来,我在这里介绍最简单.最精华的部分. 1 QMdiArea 这个类相当于一个MDI窗口管理器,用来管理添加到这个区域中的多个子窗口.我们在应用中新建的所有子窗

Qt Quick 之 QML 与 C++ 混合编程详解

Qt Quick 技术的引入,使得你能够快速构建 UI ,具有动画.各种绚丽效果的 UI 都不在话下.但它不是万能的,也有很多局限性,原来 Qt 的一些技术,比如低阶的网络编程如 QTcpSocket ,多线程,又如 XML 文档处理类库 QXmlStreamReader / QXmlStreamWriter 等等,在 QML 中要么不可用,要么用起来不方便,所以呢,很多时候我们是会基于这样的原则来混合使用 QML 和 C++: QML 构建界面, C++ 实现非界面的业务逻辑和复杂运算. 请给

Qt Quick核心编程从入门到精通

本文是个推荐文章,推荐foruok博主的Qt quick 核心编程的系列经典编程! foruok 博主 的Qt Quick系列文章: Qt Quick 简介 QML 语言基础 Qt Quick 之 Hello World 图文详解 Qt Quick 简单教程 Qt Quick 事件处理之信号与槽 Qt Quick事件处理之鼠标.键盘.定时器 Qt Quick 事件处理之捏拉缩放与旋转 Qt Quick 组件与对象动态创建详解 Qt Quick 布局介绍 Qt Quick 之 QML 与 C++

Qt Quick里的图形效果——渐变(Gradient)

Qt Quick提供了三种渐变图形效果: ConicalGradient,锥形渐变 LinearGradient,线性渐变 RadialGradient,径向渐变 效果 下图是我设计的示例效果: 图 1 渐变图形效果 如图所示,第一行为线性渐变,第二行为锥形渐变,第三行为径向渐变. 渐变元素与其他图形效果元素不同之处在于:渐变元素既可以用来改变一个已有的元素(如Image),也有可以独立使用.如你在示例效果图中看到的那样,每一行前两个是独立使用渐变元素的效果,后两个是讲渐变效果应用到其它元素上的

Qt Quick实现的疯狂算数游戏

使用 Qt Quick 写了个小游戏:疯狂算数.支持 Windows 和 Android 两个平台. 就差您这一票了亲:博客之星评选,点击投我一票,谢谢.投过了也可以点哦,每天都可以投投一票. 游戏简单,但牵涉到下面你的 Qt Quick 主题: 自己实现一个按钮 自适应分辨率 国际化 QML与C++混合编程 APK图标设置 APK名称汉化 动画 其实所有这些内容,在我的书<Qt Quick核心编程>里都讲到了,感兴趣的朋友可以看我的书. 大概来看一下吧,先看效果. Android 手机运行效