Qt Widgets——子区域和子窗口

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

qt creator 3.0的设计师有MdiArea可直接拖入使用。

界面如下,图中灰色框即是个MdiArea,另一图中创建了2个QMdiSubWindow :

代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSize>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->actionNew,SIGNAL(triggered()),this,SLOT(creatNewWin()));//actionNew是通过设计师创建的动作  

}  

void MainWindow::creatNewWin()
{
    mdiWin1=new QMdiSubWindow;
    mdiWin1->setWindowTitle("未定");
    ui->mdiArea->addSubWindow(mdiWin1);
    mdiWin1->resize(QSize(200,200));
    mdiWin1->show();
}
MainWindow::~MainWindow()
{
    delete ui;
}  

______________________________________________________________________________________________

QMdiArea

公有函数如下:

    QMdiArea(QWidget * parent = 0)
    ~QMdiArea()  

QMdiSubWindow * addSubWindow(QWidget * widget, Qt::WindowFlags windowFlags = 0)
void    removeSubWindow(QWidget * widget)
void    setActivationOrder(WindowOrder order)//设置激活顺序,默认以创建先后激活,槽函数中有调用,枚举值见1
void    setBackground(const QBrush & background)//设置背景,默认灰色
void    setDocumentMode(bool enabled)
void    setOption(AreaOption option, bool on = true)//现只有一个选项,即创建子窗口,窗口不充满这个区域,默认是充满的,枚举值见2
void    setViewMode(ViewMode mode)//设置视口模式,默认area中很多小窗口,也可以是有tabBar形式的,以下这些设置tab的函数,都需要先开启这个。枚举值见3
void    setTabPosition(QTabWidget::TabPosition position)//设置tabBar的方位,有东西南北四方位,遵循地理的上北下南左西右东枚举值见4
void    setTabShape(QTabWidget::TabShape shape)//设置tab的形状,默认长方形,也可以像谷歌浏览器那样,梯形,枚举值见5
void    setTabsClosable(bool closable)//默认否,设为true时,tab上方形成一个关闭小按钮
void    setTabsMovable(bool movable)//设置是否可移动,默认false,可移动时,可拖动tab在tabBar上移动,现在的浏览器大多有这样的功能  

QList<QMdiSubWindow *>    subWindowList(WindowOrder order = CreationOrder) const
QMdiSubWindow * currentSubWindow() const
WindowOrder activationOrder() const
QBrush  background() const
bool    documentMode() const
bool    testOption(AreaOption option) const
QMdiSubWindow * activeSubWindow() const
QTabWidget::TabPosition tabPosition() const
QTabWidget::TabShape    tabShape() const
bool    tabsClosable() const
bool    tabsMovable() const
ViewMode    viewMode() const  

Public Slots

void    activateNextSubWindow()
void    activatePreviousSubWindow()
void    cascadeSubWindows()
void    closeActiveSubWindow()
void    closeAllSubWindows()
void    setActiveSubWindow(QMdiSubWindow * window)
void    tileSubWindows()//将所有子窗口在area的可视部分排列整齐  

Signals

void    subWindowActivated(QMdiSubWindow * window)//切换激活的窗口时发出  

1,enum QMdiArea::WindowOrder

Constant Value Description
QMdiArea::CreationOrder 0 按创建时的先后顺序
QMdiArea::StackingOrder 1 堆叠顺序
QMdiArea::ActivationHistoryOrder 2 按激活历史前后顺序.

2,enum QMdiArea::AreaOption
flags QMdiArea::AreaOptions

Constant Value Description
QMdiArea::DontMaximizeSubWindowOnActivation 0x1 激活时不使它最大化,默认是最大化的

3,QMdiArea::ViewMode

Constant Value Description
QMdiArea::SubWindowView 0 以小窗口形式显示(default).
QMdiArea::TabbedView 1 不仅可小窗口,而且形成tabBar

4,enum QTabWidget::TabPosition

Constant Value Description
QTabWidget::North 0 上方显示
QTabWidget::South 1
QTabWidget::West 2
QTabWidget::East 3

5,enum QTabWidget::TabShape

Constant Value Description
QTabWidget::Rounded 0 字面是圆形,但win7上更像长方形,default
QTabWidget::Triangular 1 字面三角形,说它是梯形更好些

在以上代码中修改,图中是执行tileSubWindows()函数后的结果:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSize>
#include <QTabWidget>
#include <QBrush>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QBrush b=QBrush(QColor(30,30,30),Qt::FDiagPattern);
    ui->mdiArea->setBackground(b);
    ui->mdiArea->setViewMode(QMdiArea::TabbedView);
    ui->mdiArea->setTabPosition(QTabWidget::North);
    ui->mdiArea->setTabsClosable(true);
    ui->mdiArea->setTabsMovable(true);
    ui->mdiArea->setTabShape(QTabWidget::Triangular);
    ui->mdiArea->setOption(QMdiArea::DontMaximizeSubWindowOnActivation);  

    connect(ui->actionNew,SIGNAL(triggered()),this,SLOT(creatNewWin()));  

}  

void MainWindow::creatNewWin()
{
    mdiWin1=new QMdiSubWindow;
    mdiWin1->setWindowTitle("未定");
    ui->mdiArea->addSubWindow(mdiWin1);
    mdiWin1->resize(QSize(200,200));
    mdiWin1->show();
}
MainWindow::~MainWindow()
{
    delete ui;
}  

void MainWindow::on_pushButton_clicked()
{
    ui->mdiArea->tileSubWindows();
}  

______________________________________________________________________________________________

QMdiSubWindow

函数都比较简单,列出如下:

   QMdiSubWindow(QWidget * parent = 0, Qt::WindowFlags flags = 0)
    ~QMdiSubWindow()  

void    setKeyboardPageStep(int step)
void    setKeyboardSingleStep(int step)
void    setOption(SubWindowOption option, bool on = true)//未试效果,求补充,枚举值见1
void    setSystemMenu(QMenu * systemMenu).se.
void    setWidget(QWidget * widget)//主要通过个函数添加它的小部件  

int keyboardPageStep() const
int keyboardSingleStep() const
QMdiArea *  mdiArea() const
QMenu * systemMenu() const
QWidget *   widget() const
bool    testOption(SubWindowOption option) const
bool    isShaded() const  

Public Slots

void showShaded()
void showSystemMenu()

Signals

void aboutToActivate()
void windowStateChanged(Qt::WindowStates oldState, Qt::WindowStates newState)

1,enum QMdiSubWindow::SubWindowOption

Constant Value Description
QMdiSubWindow::RubberBandResize 0x4 If you enable this option, a rubber band control is used to represent the subwindow‘s outline, and the user resizes this instead of the subwindow itself. As a result, the subwindow maintains its original position and size until the resize operation has been completed, at which time it will receive a single QResizeEvent. By default, this option is disabled.
QMdiSubWindow::RubberBandMove 0x8 If you enable this option, a rubber band control is used to represent the subwindow‘s outline, and the user moves this instead of the subwindow itself. As a result, the subwindow remains in its original position until the move operation has completed, at which time aQMoveEvent is sent to the window. By default, this option is disabled.

时间: 2024-11-05 18:39:02

Qt Widgets——子区域和子窗口的相关文章

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

Main Window and Related Classes QAction 动作类,用于当做一个菜单项或工具项插入菜单或工具栏 QActionGroup 动作组,用于管理多个动作,设置它们之间的互斥性等 QWidgetAction 部件动作,继承自QAction,用于将小部件插入菜单或工具栏 QDockWidget 悬浮部件,程序运行后可鼠标拖动的部件 QMainWindow 主窗口,是其它部件的容器 QMdiArea 子区域,加到QMainWindow中,用于放置多个QMdiSubWind

Qt之主线程与子线程通信(linux下)

转载请注明出处:http://blog.csdn.net/feng1790291543  主线程与子线程通信主要是通过Qt上的G ui按钮,触发使得主线程上的信息发送到子线程中,并且时刻监测线程的运行情况 主线程,头文件: #ifndef MANAGEWIDGET_H #define MANAGEWIDGET_H #include <QtGui/QWidget> #include <QtCore> //#include "childwidget.h" //#in

angular 使用bootstratp模态框+响应式表单+响应式表单的验证+子窗关闭父窗口刷新

This is quite big project today 这次有以下几个功能: 1.ng-bootstrap模态框 2.响应式表单 3.响应式表单的验证 4.子窗关闭父窗口刷新 其实这几个哪一个都能写一个话题,事情太多了,时间紧任务重,一起写了吧: ng-bootstrap模态框所需要的条件(very very important),如果写错,查错非常的难哦,请慎重[反正我看不懂错误提示,出个错解决老办天]. 1.package.json加入dependencies: "@ng-boots

使用Python实现子区域数据分类统计

前言 将近两年前,我写过一篇同名文章(见使用Python实现子区域数据分类统计). 当时是为了统计县域内的植被覆盖量,折腾了一段时间,解决了这个问题.最近,又碰到了一个类似的需求,也需要统计某个小范围内的数据.简单来说,这个需求是将两个 shp 文件的任意两个对象做相交判断,最后形成一个新的空间对象集合,最后对此集合进行简单统计分析即可. 解决方案 明白了这一点之后,再看之前的代码,就发现当时用了很笨的方法.写了两个循环,先是取出大范围的 shp 中的每一个对象,再读取小范围 shp 的每一个对

QT中关闭应用程序和窗口的函数(quit(),exit()以及close()的区别)

使用QT编辑界面,其中带来很大方便的一点就是Qt中自带丰富的.种类齐全的类及其功能函数,程序员可以在编辑程序的过程中简单地直接调用.关于窗口关闭的操作,在这里指出常用的三个槽,即quit(),exit()以及close().    首先说明窗口退出时,系统提示对话框的代码编辑.对主程序的退出,可以调用成员函数exit(),同时也可以调用槽quit(),二者此时都能起到关闭应用程序的作用.只是应注意二者调用的方式不同.如下程序示例:        {         QApplication* a

公布Qt Widgets桌面应用程序的方法

公布Qt Widgets桌面应用程序的方法 Qt是一款优秀的跨平台开发框架,它能够在桌面.移动平台以及嵌入式平台上执行.眼下Qt 5介绍程序公布的文章帖子比較少.大家又很想要知道怎样公布Qt应用程序,于是我花了一点儿时间介绍一下怎样公布Qt桌面应用程序. 上海萌梦信息科技有限公司(微博:http://weibo.com/qtdream)原创文章,首发地址:http://qtdream.com/topic/113.欢迎同行前来探讨. 首先我们从最简单的项目Qt Widgets開始说起.Qt Wid

Qt 3D教程(一)使用Qt Widgets建立一个框架

Qt3D教程(一)使用Qt Widgets建立一个框架 Qt 3D是Qt 5.5发布时最重要的一个新模块,它很好地将3D的繁文缛节封装在底层,留给我们的是简洁的对象创建方法,它也不需要你掌握太多的着色器知识,只需要懂得一些三维和光照的基本知识就可以创建出比较美观的三维模型浏览程序了.目前虽然大家都能够使用Qt 5.5和Qt 3D了,但是我查看了一下,有关API文档和一个详尽的介绍还是空缺的,因此我认为有必要写一点教程,简要介绍一下Qt 3D的使用方法. 蒋彩阳原创文章,首发地址:http://b

Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示

Android 系统版本很多,较新的 4.4 ,较老的 2.3 ,都有人用. Qt on Android 开发的 Android 应用,默认在 Android 设备上是非全屏的.而有些应用的需求是全屏显示,比如游戏.那么怎么样才能做到这点呢? 请给我的决赛文章<Qt Quick 图像处理实例之美图秀秀(附源码下载)>投票,谢谢. 我们需要分 Android 系统版本来说. Android 2.x 对于 4.0 以前,比如 2.2 . 2.3 的系统,可以修改 AndroidManifest.x

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主要研究Handler的消息发送. 包含主线程往子线程发送消息,子线程之间互相发送消息. 一.主线程向子线程发送消息. 实现过程比較简单: 主线程发送消息到异步线程.异步线程接收到消息后在再发送一条消息给主线程. 1. 初始化主线程的Handler,用来接收子线程的消息. 2. 启动异步线程.在异步线