Qt软件开发文档4---主窗口的实现

主窗口如下

这里写图片描述

顶部栏 为menuBar()

添加:

menuBar()->setFixedHeight(28);//menuBar() mainWindow 方法
    QMenu *fileMenu = menuBar()->addMenu(QString::fromLocal8Bit("文件"));
    QMenu *viewMenu = menuBar()->addMenu(QString::fromLocal8Bit("视图"));
    QAction *openFlie = new QAction(QIcon(""),QString::fromLocal8Bit("打开文件"),this);
    QAction *saveFlie = new QAction(QIcon(""),QString::fromLocal8Bit("保存文件"), this);
    fileMenu->addAction(openFlie);
    fileMenu->addAction(saveFlie);
    QMenu *dockWindow = new QMenu(QString::fromLocal8Bit("dock窗口"));
    dockViewAction[0] = new QAction(QIcon(":/image/choice.png"), QString::fromLocal8Bit("dock1"), this);
    dockViewAction[1] = new QAction(QIcon(":/image/choice.png"), QString::fromLocal8Bit("dock2"), this);
    dockViewAction[2] = new QAction(QIcon(":/image/choice.png"), QString::fromLocal8Bit("dock3"), this);
    dockWindow->addAction(dockViewAction[0]);
    dockWindow->addAction(dockViewAction[1]);
    dockWindow->addAction(dockViewAction[2]);
    viewMenu->addMenu(dockWindow);
    connect(dockWindow,SIGNAL(triggered(QAction *)),this,SLOT(dockTriggered(QAction *)));

    QAction *sideBar = new QAction(QString::fromLocal8Bit("侧边栏"), this);
    viewMenu->addAction(sideBar);

一般用XML等读取方式读取出文档中menu内容(便于增删改查)

左侧三个窗口为dock窗口

利用QDockWidget 实现
dock窗口中的内容为各部分dll封装好的对应内容,以tree为例

    dock[0] = new QDockWidget(tr("DockWindow1"),this);
    dock[0]->setFeatures(QDockWidget::AllDockWidgetFeatures);//所有属性
    dock[0]->setAllowedAreas(Qt::LeftDockWidgetArea);//设置允许停靠的窗口位置
    dllName = "treeDll.dll";
    funcName = "showTree";
    QWidget *tree = new QWidget(dock[0]);
    tree = setWidget(dllName,funcName);
    dock[0]->setWidget(tree);
    addDockWidget(Qt::LeftDockWidgetArea,dock[0]);

setWidget函数,调用dllmanager中的runfunc函数

QWidget* MainWindow::setWidget(QString dllName,QString funcName)
{
    func open = (func)QLibrary::resolve("dllManager.dll","runFunc");
    if(open){
        ValTrans valT;
        //传this指针是通过manager的runfunction函数将parent传给tree   widget
        //好处:在主窗口关闭时正常调用treeWidget的析构函数(见下章)
        bool ok = open(dllName,funcName, this, &valT, 0);
        if(ok){
            QWidget *form = (QWidget *)valT.ptr;
            return form;
        }
    }
    else
    {
        QMessageBox::information(0, "open case", "can not open");
    }
    return 0;
}

右侧四栏为Splitter框

调用QSplitterWidget实现
写好splitter函数

SplitterWidget::SplitterWidget(QWidget *parent) : QWidget(parent)
{
    //main
    mainSplitter = new QSplitter(Qt::Vertical,this);
    //top horizaontal
    QSplitter *topSplitter = new QSplitter(Qt::Horizontal,mainSplitter);
    topSplitter->setOpaqueResize(false);
    //
    QTextEdit *topLeftEdit  = new QTextEdit(QObject::tr("topLeft Widget"),topSplitter);
    topLeftEdit->setAlignment(Qt::AlignCenter);

    QTextEdit *topRightEdit = new QTextEdit(QObject::tr("topRight Widget"),topSplitter);
    topRightEdit->setAlignment(Qt::AlignCenter);

    //right
    QSplitter *bottomSplitter = new QSplitter(Qt::Horizontal,mainSplitter);
    bottomSplitter->setOpaqueResize(false);

    QTextEdit *bottomLeftEdit = new QTextEdit(QObject::tr("bottomLeft Widget"),bottomSplitter);
    bottomLeftEdit->setAlignment(Qt::AlignCenter);
    QTextEdit *bottomRightEdit = new QTextEdit(QObject::tr("bottomRight Widget"),bottomSplitter);
    bottomRightEdit->setAlignment(Qt::AlignCenter);
    mainSplitter->setWindowTitle(QObject::tr("Splitter the Widget"));

    mainSplitter->show();

}

void SplitterWidget::resizeEvent(QResizeEvent *)
{
    mainSplitter->resize(this->size());
}

将splitter widget窗口封装好,在主窗口(mainWindow)中调用

    dllName = "splitterDll.dll";
    funcName = "showSplitter";
    QWidget *main = setWidget(dllName,funcName);
    setCentralWidget(main);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值