哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2010/08/10/5800795.aspx
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
Qt 提供了一个 QWorkspace 类,利用 QWorkspace 可以很容易实现多文档的应用。 QWorkspace 类继承自 QWidget ,因此只需要在 QMainWindow 主窗口中把 QWorkspace 对象设置为中央窗体即。QWorkspace 类提供了许多对子窗口进行排序的函数接口,如cascade(),arrangeIcon(),tile()。
//window.h #ifndef WINDOW_H #define WINDOW_H #include <QWorkspace> #include <QTextEdit> #include <QMenu> #include <QMenuBar> #include <QAction> #include <QtGui> class MainWidget : public QMainWindow{ Q_OBJECT public: MainWidget(); ~MainWidget(); void createMenu(); private slots: void slotScroll(bool); private: QWorkspace * workspace; }; #endif
先把QWorkspace类设为MainWidget的中央窗体,用QMainWindow类创建3个子窗口window1,window2,window3,
通过addWindow()方法把子窗体插入QWorkspace。
实现对字窗口的arrangeIcons布局,它的布局方式是所有子窗口在主窗口底部按标题栏排列,可直接把triggered()信号
和arrangeIcons()函数相连。注意此排列方式仅对已最小的子窗口起作用。
实现对子窗口的tile布局,tile的意思是用子窗口把主窗口像铺瓦片或贴瓷砖一样贴满。
实现对子窗口的cascade布局,即子窗口的层叠显示
activateNextWindow(),使下一个子窗口获得焦点。
activatePreviousWindow(),使前一个子窗口获得焦点。
setScrollBarsEnabled(),它的参数是bool型的,如果为true,则滑动条可用,如果为false,滑动条不可用。
#include "window.h" MainWidget::MainWidget(){ workspace = new QWorkspace; setWindowTitle("Mutiple Document"); setCentralWidget(workspace); createMenu(); QMainWindow * window1 = new QMainWindow; window1->setWindowTitle("window1"); QTextEdit * e1 = new QTextEdit; e1->setText("window1"); window1->setCentralWidget(e1); QMainWindow * window2 = new QMainWindow; window2->setWindowTitle("window2"); QTextEdit * e2 = new QTextEdit; e2->setText("window2"); window2->setCentralWidget(e2); QMainWindow * window3 = new QMainWindow; window3->setWindowTitle("window3"); QTextEdit * e3 = new QTextEdit; e3->setText("window3"); window3->setCentralWidget(e3); workspace->addWindow(window1); workspace->addWindow(window2); workspace->addWindow(window3); } void MainWidget::createMenu(){ QMenu *layout = menuBar()->addMenu(tr("Layout")); QAction * arrange = new QAction(tr("Arange Icons"),this); connect(arrange,SIGNAL(triggered()),workspace,SLOT(arrangeIcons())); layout->addAction(arrange); QAction *tile = new QAction(tr("Tile"),this); connect(tile,SIGNAL(triggered()),workspace,SLOT(tile())); layout->addAction(tile); QAction *cascade = new QAction(tr("Cascade"),this); connect(cascade,SIGNAL(triggered()),workspace,SLOT(cascade())); layout->addAction(cascade); QMenu *other = menuBar()->addMenu(tr("Other")); QAction *scroll = new QAction(tr("Scroll"),this); scroll->setCheckable(true); connect(scroll,SIGNAL(toggled(bool)),this,SLOT(slotScroll(bool))); other->addAction(scroll); other->addSeparator(); QAction *next = new QAction(tr("nextWindow"),this); connect(next,SIGNAL(triggered()),workspace,SLOT(activateNextWindow())); other->addAction(next); QAction * previous = new QAction(tr("previousWindow"),this); connect(previous,SIGNAL(triggered()),workspace,SLOT(activatePreviousWindow())); other->addAction(previous); } MainWidget::~MainWidget(){ } void MainWidget::slotScroll(bool check){ if(check) workspace->setScrollBarsEnabled(true); else workspace->setScrollBarsEnabled(false); }
#include <QApplication> #include "window.h" int main(int argc, char *argv[]){ QApplication app(argc, argv); MainWidget w; w.show(); return app.exec(); }