现在的位置: 首页 > 综合 > 正文

Qt中停靠窗口的实现

2013年10月14日 ⁄ 综合 ⁄ 共 4481字 ⁄ 字号 评论关闭

 

 

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

    可停靠位置:

 

 

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

 

抱歉!评论已关闭.