停靠窗口
停靠窗口(dockwindow)是指一些可以停靠在QMainWindow中或是浮动为独立窗口的窗口。QMainWindow提供了4个停靠窗口区域;分别在中央窗口部件的上部、下部、左侧和右侧。诸如像Microsoft Visual Studio和Qt Linguist这样的应用程序都广泛使用了停靠窗口,以提供一种非常灵活的用户接口方式。在Qt中,各个停靠窗口都是QDockWidget的实例。
每一个停靠窗口都有自己的标题栏,即使它处于停靠时也是如此。通过拖拽这一标题栏,用户可以把停靠窗口从一个停靠区域移动到另外一个停靠区域。通过把这个停靠窗口拖动到其他停靠区域的外面,就可以把停靠窗口从一个停靠区域中分离出来,让它成为一个独立的窗口。自由浮动的停靠窗口总是显示在它们的主窗口的上面。通过点击窗口部件标题栏上的"关闭"按钮,就可以关闭QDockWidget。通过调用QDockWidget::setFeatures() ,就可以禁用所有这些特性以及它们的任意组合。
用虚线显示的四个角可以属于两个相邻停靠区域中的任何一个。例如,假定我们需要让左上角属于左侧的停靠区域,则只需调用QMainWindow::setCorner(Qt: : TopLeftCorner, Qt::LeftDockWidgetArea)即可。
MyDockWidgetDemo.h
#ifndef MYDOCKWIDGETDEMO_H
#define MYDOCKWIDGETDEMO_H
#include <QMainWindow>
class QAction;
class QMenu;
class QToolBar;
class QStatusBar;
class QDockWidget;
class QTextEdit;
class MyDockWidgetDemo : public QMainWindow
{
Q_OBJECT
public:
explicit MyDockWidgetDemo(QWidget *parent = 0);
signals:
public slots:
private slots:
void newSlot();
void saveSlot();
void aboutSlot();
private:
void createActions(); //创建动作
void createMenus(); //创建菜单
void createToolBars(); //创建工具条
void createStatusBars(); //创建状态栏
void createDockWidget(); //创建可停靠窗口
QAction *newAct;
QAction *saveAct;
QAction *quitAct;
QAction *aboutAct;
QMenu *fileMenu;
QMenu *viewMenu; //viewMenu主要控制QDockWidget控件的显示和隐藏
QMenu *helpMenu;
QToolBar *fileToolBar;
QToolBar *viewToolBar; //viewToolBar主要控制QDockWidget控件的显示和隐藏
QToolBar *helpToolBar;
QTextEdit *textEdit;
};
#endif // MYDOCKWIDGETDEMO_H
MyDockWidgetDemo.cpp
#include "mydockwidgetdemo.h"
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#include <QToolBar>
#include <QStatusBar>
#include <QDockWidget>
#include <QTextEdit>
#include <QMessageBox>
#include <QCalendarWidget>
MyDockWidgetDemo::MyDockWidgetDemo(QWidget *parent) :
QMainWindow(parent)
{
//创建一个QTextEdit控件,作为主窗口
textEdit = new QTextEdit;
this->setCentralWidget(textEdit);
createActions();
createMenus();
createToolBars();
createStatusBars();
createDockWidget();
this->setWindowTitle(tr("停靠窗口"));
}
void MyDockWidgetDemo::newSlot()
{
//清空QTextEdit控件中的内容
textEdit->clear();
}
void MyDockWidgetDemo::saveSlot()
{
QMessageBox::warning(this, tr("事件"), tr("你触发了保存文件事件"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
}
void MyDockWidgetDemo::aboutSlot()
{
QMessageBox::warning(this, tr("关于"), tr("欢迎交流。"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
}
void MyDockWidgetDemo::createActions()
{
newAct = new QAction(tr("新建"), this);
newAct->setShortcut(tr("Ctrl + N"));
connect(newAct, SIGNAL(triggered()), this, SLOT(newSlot()));
saveAct = new QAction(tr("保存"), this);
saveAct->setShortcut(tr("Ctrl + S"));
connect(saveAct, SIGNAL(triggered()), this, SLOT(saveSlot()));
quitAct = new QAction(tr("退出"), this);
quitAct->setShortcut(tr("Ctrl + Q"));
connect(quitAct, SIGNAL(triggered()), this, SLOT(close()));
aboutAct = new QAction(tr("关于"), this);
aboutAct->setShortcut(tr("Ctrl + A"));
connect(aboutAct, SIGNAL(triggered()), this, SLOT(aboutSlot()));
}
void MyDockWidgetDemo::createMenus()
{
fileMenu = this->menuBar()->addMenu(tr("文件"));
fileMenu->addAction(newAct);
fileMenu->addAction(saveAct);
fileMenu->addAction(quitAct);
viewMenu = this->menuBar()->addMenu(tr("视图"));
helpMenu = this->menuBar()->addMenu(tr("帮助"));
helpMenu->addAction(aboutAct);
}
void MyDockWidgetDemo::createToolBars()
{
//给应用程序添加工具条
fileToolBar = this->addToolBar(tr("文件"));
fileToolBar->addAction(newAct);
fileToolBar->addAction(saveAct);
fileToolBar->addAction(quitAct);
viewToolBar = this->addToolBar(tr("视图"));
helpToolBar = this->addToolBar(tr("帮助"));
helpToolBar->addAction(aboutAct);
}
void MyDockWidgetDemo::createStatusBars()
{
//设置应用程序的状态栏
statusBar()->showMessage(tr("准备"));
}
void MyDockWidgetDemo::createDockWidget()
{
//设置主窗体的第一个QDockWidget
QDockWidget *firstDockWidget = new QDockWidget(this);
//设置第一个QDockWidget的窗口名称
firstDockWidget->setWindowTitle(tr("日期"));
//设置第一个QDockWidget的可停靠区域,全部可停靠
firstDockWidget->setAllowedAreas(Qt::AllDockWidgetAreas);
//设置第一个QDockWidget内的控件并设置该控件的属性
QCalendarWidget *calendar = new QCalendarWidget;
calendar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
calendar->setGridVisible(true);
//将QCalendarWidget控件设置成QDockWidget的主控件 使其能随窗口大小改变而改变
firstDockWidget->setWidget(calendar);
//向主窗体中添加第一个QDockWidget控件 第一个参数表示初始显示的位置 第二个参数是要添加的QDockWidget控件
this->addDockWidget(Qt::RightDockWidgetArea, firstDockWidget);
//向菜单和工具栏中添加第一个QDockWidget的显示和隐藏动作
viewMenu->addAction(firstDockWidget->toggleViewAction());
viewToolBar->addAction(firstDockWidget->toggleViewAction());
//设置第二个QDockWidget
QDockWidget *secondDockWidget = new QDockWidget(this);
secondDockWidget->setWindowTitle(tr("About Me"));
secondDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::BottomDockWidgetArea);
QTextEdit *myInfo = new QTextEdit(tr("<br>欢迎交流</br><br>博客地址:hhtp://blog.csdn.net/qiurisuixiang</br>"));
secondDockWidget->setWidget(myInfo);
this->addDockWidget(Qt::BottomDockWidgetArea, secondDockWidget);
//向菜单和工具栏中添加第一个QDockWidget的显示和隐藏动作
viewMenu->addAction(secondDockWidget->toggleViewAction());
viewToolBar->addAction(secondDockWidget->toggleViewAction());
}
main.cpp
#include <QApplication>
#include <QTextCodec>
#include "mydockwidgetdemo.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
//QTextCodec::setCodecForTr(QTextCodec::codecForName("eucKR"));
MyDockWidgetDemo dock;
dock.show();
return app.exec();
}
setAllowedAreas()调用说明对停靠区域加以限定即可以接受停靠窗口。在此给出的代码中,只允许把停靠窗口拖拽到左侧和右侧的停靠区域,这两个地方都有显示它的足够垂直空间,因而可以合理地把它显示出来。如果没有明确地设置所允许的区域,那么用户就可能把该停靠窗口拖动到这四个可停靠区域中的任何一个地方。
每个QObject都可以给定一一个"对象名"。在进行程序调试时,这个名字会非常有用,并且一些测试工具也会用到它。通常,我们不必费劲地给定窗口部件的名字,但是在创建一些停靠窗口和工具栏时,如果希望使用QMainWindow::saveState( )和QMainWindow::restoreState()来保存、恢复停靠窗口和工具栏的几何形状及状态的话,给定窗口部件的名字就很有必要了。