Qt中停靠窗口的实现

时间:2022-09-07 13:19:11

Qt中停靠窗口的实现

 

Qt中停靠窗口的实现

 

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

    可停靠位置:

Qt中停靠窗口的实现

 

Qt中停靠窗口的实现

 

//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();
}