停靠窗口作为主窗口的一部分,可以停靠、浮动、显示隐藏等。现在很多软件都具有可停靠窗口
可停靠位置:
//mydockwidget.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
//mydockwidget.h #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[]) { QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); QApplication app(argc, argv); MyDockWidgetDemo dock; dock.show(); return app.exec(); }