主窗口如下
顶部栏 为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);