Qt中停靠窗口的实现

来源:互联网 发布:刺马案 知乎 编辑:程序博客网 时间:2024/05/17 13:45

 

 

    停靠窗口作为主窗口的一部分,可以停靠、浮动、显示隐藏等。现在很多软件都具有可停靠窗口

    可停靠位置:

 

 

[cpp] view plaincopyprint?
  1. //mydockwidget.h  
  2. #ifndef MYDOCKWIDGETDEMO_H  
  3. #define MYDOCKWIDGETDEMO_H  
  4. #include <QMainWindow>  
  5. class QAction;  
  6. class QMenu;  
  7. class QToolBar;  
  8. class QStatusBar;  
  9. class QDockWidget;  
  10. class QTextEdit;  
  11. class MyDockWidgetDemo : public QMainWindow  
  12. {  
  13.     Q_OBJECT  
  14. public:  
  15.     explicit MyDockWidgetDemo(QWidget *parent = 0);  
  16. signals:  
  17. public slots:  
  18.       
  19. private slots:  
  20.     void newSlot();  
  21.     void saveSlot();  
  22.     void aboutSlot();  
  23.   
  24. private:  
  25.     void createActions();        //创建动作  
  26.     void createMenus();          //创建菜单  
  27.     void createToolBars();      //创建工具条  
  28.     void createStatusBars();    //创建状态栏  
  29.     void createDockWidget();    //创建可停靠窗口  
  30.   
  31.     QAction *newAct;  
  32.     QAction *saveAct;  
  33.     QAction *quitAct;  
  34.     QAction *aboutAct;  
  35.   
  36.     QMenu *fileMenu;  
  37.     QMenu *viewMenu;            //viewMenu主要控制QDockWidget控件的显示和隐藏  
  38.     QMenu *helpMenu;  
  39.   
  40.     QToolBar *fileToolBar;  
  41.     QToolBar *viewToolBar;      //viewToolBar主要控制QDockWidget控件的显示和隐藏  
  42.     QToolBar *helpToolBar;  
  43.   
  44.     QTextEdit *textEdit;  
  45. };  
  46. #endif // MYDOCKWIDGETDEMO_H  


 

[cpp] view plaincopyprint?
  1. //mydockwidget.h  
  2. #include "mydockwidgetdemo.h"  
  3.   
  4. #include <QAction>  
  5. #include <QMenu>  
  6. #include <QMenuBar>  
  7. #include <QToolBar>  
  8. #include <QStatusBar>  
  9. #include <QDockWidget>  
  10. #include <QTextEdit>  
  11. #include <QMessageBox>  
  12. #include <QCalendarWidget>  
  13.   
  14. MyDockWidgetDemo::MyDockWidgetDemo(QWidget *parent) :  
  15.     QMainWindow(parent)  
  16. {  
  17.     //创建一个QTextEdit控件,作为主窗口  
  18.     textEdit = new QTextEdit;  
  19.     this->setCentralWidget(textEdit);  
  20.   
  21.     createActions();  
  22.     createMenus();  
  23.     createToolBars();  
  24.     createStatusBars();  
  25.     createDockWidget();  
  26.       
  27.     this->setWindowTitle(tr("停靠窗口"));  
  28. }  
  29.   
  30. void MyDockWidgetDemo::newSlot()  
  31. {  
  32.     //清空QTextEdit控件中的内容  
  33.     textEdit->clear();  
  34. }  
  35.   
  36. void MyDockWidgetDemo::saveSlot()  
  37. {  
  38.     QMessageBox::warning(this, tr("事件"), tr("你触发了保存文件事件"),  
  39.                          QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);  
  40. }  
  41.   
  42. void MyDockWidgetDemo::aboutSlot()  
  43. {  
  44.     QMessageBox::warning(this, tr("关于"), tr("欢迎交流。"),  
  45.                          QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);  
  46. }  
  47.   
  48. void MyDockWidgetDemo::createActions()  
  49. {  
  50.     newAct = new QAction(tr("新建"), this);  
  51.     newAct->setShortcut(tr("Ctrl + N"));  
  52.     connect(newAct, SIGNAL(triggered()), this, SLOT(newSlot()));  
  53.   
  54.     saveAct = new QAction(tr("保存"), this);  
  55.     saveAct->setShortcut(tr("Ctrl + S"));  
  56.     connect(saveAct, SIGNAL(triggered()), this, SLOT(saveSlot()));  
  57.   
  58.     quitAct = new QAction(tr("退出"), this);  
  59.     quitAct->setShortcut(tr("Ctrl + Q"));  
  60.     connect(quitAct, SIGNAL(triggered()), this, SLOT(close()));  
  61.   
  62.     aboutAct = new QAction(tr("关于"), this);  
  63.     aboutAct->setShortcut(tr("Ctrl + A"));  
  64.     connect(aboutAct, SIGNAL(triggered()), this, SLOT(aboutSlot()));  
  65. }  
  66.   
  67. void MyDockWidgetDemo::createMenus()  
  68. {  
  69.     fileMenu = this->menuBar()->addMenu(tr("文件"));  
  70.     fileMenu->addAction(newAct);  
  71.     fileMenu->addAction(saveAct);  
  72.     fileMenu->addAction(quitAct);  
  73.   
  74.     viewMenu = this->menuBar()->addMenu(tr("视图"));  
  75.   
  76.     helpMenu = this->menuBar()->addMenu(tr("帮助"));  
  77.     helpMenu->addAction(aboutAct);  
  78. }  
  79.   
  80. void MyDockWidgetDemo::createToolBars()  
  81. {  
  82.     //给应用程序添加工具条  
  83.     fileToolBar = this->addToolBar(tr("文件"));  
  84.     fileToolBar->addAction(newAct);  
  85.     fileToolBar->addAction(saveAct);  
  86.     fileToolBar->addAction(quitAct);  
  87.   
  88.     viewToolBar = this->addToolBar(tr("视图"));  
  89.   
  90.     helpToolBar = this->addToolBar(tr("帮助"));  
  91.     helpToolBar->addAction(aboutAct);  
  92. }  
  93.   
  94. void MyDockWidgetDemo::createStatusBars()  
  95. {  
  96.     //设置应用程序的状态栏  
  97.     statusBar()->showMessage(tr("准备"));  
  98. }  
  99.   
  100. void MyDockWidgetDemo::createDockWidget()  
  101. {  
  102.     //设置主窗体的第一个QDockWidget  
  103.     QDockWidget *firstDockWidget = new QDockWidget(this);  
  104.     //设置第一个QDockWidget的窗口名称  
  105.     firstDockWidget->setWindowTitle(tr("日期"));  
  106.     //设置第一个QDockWidget的可停靠区域,全部可停靠  
  107.     firstDockWidget->setAllowedAreas(Qt::AllDockWidgetAreas);  
  108.     //设置第一个QDockWidget内的控件并设置该控件的属性  
  109.     QCalendarWidget *calendar = new QCalendarWidget;  
  110.     calendar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);  
  111.     calendar->setGridVisible(true);  
  112.     //将QCalendarWidget控件设置成QDockWidget的主控件 使其能随窗口大小改变而改变  
  113.     firstDockWidget->setWidget(calendar);  
  114.     //向主窗体中添加第一个QDockWidget控件 第一个参数表示初始显示的位置 第二个参数是要添加的QDockWidget控件  
  115.     this->addDockWidget(Qt::RightDockWidgetArea, firstDockWidget);  
  116.     //向菜单和工具栏中添加第一个QDockWidget的显示和隐藏动作  
  117.     viewMenu->addAction(firstDockWidget->toggleViewAction());  
  118.     viewToolBar->addAction(firstDockWidget->toggleViewAction());  
  119.   
  120.     //设置第二个QDockWidget  
  121.     QDockWidget *secondDockWidget = new QDockWidget(this);  
  122.     secondDockWidget->setWindowTitle(tr("About Me"));  
  123.     secondDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::BottomDockWidgetArea);  
  124.     QTextEdit *myInfo = new QTextEdit(tr("<br>欢迎交流</br><br>博客地址:hhtp://blog.csdn.net/qiurisuixiang</br>"));  
  125.     secondDockWidget->setWidget(myInfo);  
  126.     this->addDockWidget(Qt::BottomDockWidgetArea, secondDockWidget);  
  127.     //向菜单和工具栏中添加第一个QDockWidget的显示和隐藏动作  
  128.     viewMenu->addAction(secondDockWidget->toggleViewAction());  
  129.     viewToolBar->addAction(secondDockWidget->toggleViewAction());  
  130. }  


 

[cpp] view plaincopyprint?
  1. //main.cpp  
  2. #include <QApplication>  
  3. #include <QTextCodec>  
  4. #include "mydockwidgetdemo.h"  
  5.   
  6. int main(int argc, char *argv[])  
  7. {  
  8.     QTextCodec::setCodecForTr(QTextCodec::codecForLocale());  
  9.     QApplication app(argc, argv);  
  10.     MyDockWidgetDemo dock;  
  11.     dock.show();  
  12.     return app.exec();  
  13. }  
0 0