Qt模块化笔记之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.

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值