当前位置:   article > 正文

QT界面开发1:使用QtitanRibbon5开发软件界面

qtitanribbon

本文介绍使用QtitanRibbon UI控件开发QT软件界面,与QMainWindow的整体布局类似。本文均以开发gis软件的整体布局进行介绍。

一、界面框架介绍

1.QtitanRibbon介绍

QtitanRibbon是一款收费软件,QtitanRibbon实现了Microsoft Ribbon for Qt的概念,风格与Microsoft  Office 相似。在QtitanRibbon5.8.1版本中,实现了Office  2016的风格。

在项目中添加QtitanRibbon的引用参考这篇文章:

QGIS二次开发1: vs工程环境配置_guoqiong07的博客-CSDN博客

2.整体布局介绍

首先看一下本文所实现的软件界面:

其中布局1指软件的title;布局2对应QtitanRibbon 中的ribbonBar,用来放置QAction、QMenu等;布局3为中间控件,在中间控件中放置画布QgsMapCanvas;布局4为QgsDockWidget,用来展示如图层树形控件、要素属性列表等。

二、各布局实现

 先看在构造函数中整体需要实现的函数:

  1. sInstance = this;
  2. //设置软件title
  3. setWindowTitle(QStringLiteral("QtGis"));
  4. //创建地图画布
  5. createMapCanvas();
  6. //创建QAction
  7. createActions();
  8. //创建菜单
  9. createMenuFile();
  10. //创建快速访问按钮
  11. createQuickAccessBar();
  12. //创建RibbonPage并添加QAction
  13. createRibbonBar();
  14. //创建DockWidget
  15. createDockWidget();

1. 创建地图画布

以下是对函数createMapCanvas()的实现:

  1. //创建一个QTabWidget
  2. mCenterTabWidget = new QTabWidget(this);
  3. //创建一个画布
  4. mMapCanvas = new QgsMapCanvas();
  5. mMapCanvas->setObjectName("mapCanvas");
  6. //设置画布背景色、选中色、缓存、更新间隔等属性
  7. mMapCanvas->setPreviewJobsEnabled(true);
  8. mMapCanvas->setCanvasColor(QColor(255, 255, 255));
  9. mMapCanvas->setSelectionColor(QColor(0, 255, 255));
  10. mMapCanvas->setProject(QgsProject::instance());
  11. mMapCanvas->setParallelRenderingEnabled(true);
  12. mMapCanvas->setCachingEnabled(true);
  13. mMapCanvas->setMapUpdateInterval(250);
  14. // set project linked to main canvas
  15. mMapCanvas->setProject(QgsProject::instance());
  16. //将画布添加在创建的QTabWidget控件mCenterTabWidget中
  17. mCenterTabWidget->addTab(mMapCanvas, "Map View");
  18. mCenterTabWidget->tabBar()->setTabButton(mCenterTabWidget->indexOf(mMapCanvas), QTabBar::RightSide, nullptr) ;
  19. //设置该QTabWidget控件mCenterTabWidget展示在窗体的中间
  20. setCentralWidget(mCenterTabWidget);
  21. mMapCanvas->setFocus();

2.创建QAction

将软件中所需要用到的QAction在此函数中初始化,比如创建添加矢量、栅格的按钮,并绑定相应的槽函数,以下是对createActions()函数的实现:

  1. mFileNew = new QAction(DemoRibbonWindow::createIcon(Image_New),tr("New"));
  2. mFileNew->setToolTip(QStringLiteral("New File"));
  3. connect(mFileSaveAs, SIGNAL(triggered()), this, SLOT(slot_fileNew()));
  4. mFileOpen = new QAction(DemoRibbonWindow::createIcon(Image_Open),tr("Open"));
  5. mFileOpen->setToolTip(QStringLiteral("Open File"));
  6. connect(mFileSaveAs, SIGNAL(triggered()), this, SLOT(slot_fileOpen()));
  7. mFileSave = new QAction(DemoRibbonWindow::createIcon(Image_Save),tr("Save"));
  8. mFileSave->setToolTip(QStringLiteral("Save File"));
  9. connect(mFileSaveAs, SIGNAL(triggered()), this, SLOT(slot_fileSave()));
  10. mFileSaveAs = new QAction(DemoRibbonWindow::createIcon(Image_SaveAs), tr("Save As"));
  11. mFileSaveAs->setToolTip(QStringLiteral("Save File As"));
  12. connect(mFileSaveAs, SIGNAL(triggered()), this, SLOT(slot_fileSaveAs()));
  13. mFileClose = new QAction(DemoRibbonWindow::createIcon(Image_Close), tr("Close"));
  14. mFileClose->setToolTip(QStringLiteral("Close File"));
  15. connect(mFileSaveAs, SIGNAL(triggered()), this, SLOT(slot_fileClose()));
  16. mFileExit = new QAction(DemoRibbonWindow::createIcon(Image_Exit), tr("Exit"));
  17. connect(mFileSaveAs, SIGNAL(triggered()), this, SLOT(slot_fileExit()));
  18. mAddRasterLayer = new QAction(DemoRibbonWindow::createIcon(Add_RasterLayer), tr("Add Raster Layer"));
  19. connect(mAddRasterLayer, SIGNAL(triggered()), this, SLOT(slot_addRaterLayer()));
  20. mAddVectorLayer = new QAction(DemoRibbonWindow::createIcon(Add_VectorLayer), tr("Add Vector Layer"));
  21. connect(mAddVectorLayer, SIGNAL(triggered()), this, SLOT(slot_addVectorLayer()));

3.创建菜单

在本软件中,菜单只包含截图中的部分,主要是实现工程的新建、打开保存、关闭、退出、最近打开的工程列表等功能。

以下是对createMenuFile()函数的实现:

  1. QIcon iconLogo;
  2. iconLogo.addPixmap(QPixmap(QStringLiteral(":/QtGis/images/qtitanlogo32x32.png")));
  3. //添加Project菜单
  4. QAction* actionFile = ribbonBar()->addSystemButton(iconLogo, tr("&Project"));
  5. ribbonBar()->systemButton()->setToolButtonStyle(Qt::ToolButtonTextOnly);
  6. actionFile->setToolTip(tr("Click here to see everything you can do with your document"));
  7. RibbonSystemMenu* systemMenu = qobject_cast<RibbonSystemMenu*>(actionFile->menu());
  8. //在菜单下添加相应的按钮
  9. systemMenu->addAction(mFileNew);
  10. systemMenu->addAction(mFileOpen);
  11. systemMenu->addAction(mFileSave);
  12. systemMenu->addAction(mFileSaveAs);
  13. systemMenu->addAction(mFileClose);
  14. systemMenu->addAction(mFileExit);
  15. //在菜单下最近打开的工程列表控件
  16. RibbonPageSystemRecentFileList* pageRecentFile = systemMenu->addPageRecentFile(QStringLiteral("Recent Maps"));
  17. //设置最多展示已打开的9个工程
  18. pageRecentFile->setSize(9);
  19. //绑定槽函数
  20. connect(pageRecentFile, SIGNAL(openRecentFile(const QString&)), this, SLOT(openRecentFile(const QString&)));
  21. connect(this, SIGNAL(updateRecentFileActions(const QStringList&)), pageRecentFile, SLOT(updateRecentFileActions(const QStringList&)));

4.创建快速访问按钮

如果需要添加快速访问按钮,可以使用以下代码段实现。本软件实现了将打开工程、保存工程按钮添加为快速访问按钮,如截图部分所示:

 

 

 以下是对createQuickAccessBar()函数的实现:

  1. RibbonQuickAccessBar* quickAccessBar = ribbonBar()->quickAccessBar();
  2. QAction* action = quickAccessBar->actionCustomizeButton();
  3. action->setToolTip(tr("Customize Quick Access Bar"));
  4. QAction* smallButton = quickAccessBar->addAction(DemoRibbonWindow::createIcon(Image_Open), QStringLiteral("Open Project"));
  5. smallButton->setToolTip(QStringLiteral("Open Project"));
  6. connect(smallButton, SIGNAL(triggered()), this, SLOT(slot_fileOpen()));
  7. smallButton = quickAccessBar->addAction(DemoRibbonWindow::createIcon(Image_Save), QStringLiteral("Save Project"));
  8. smallButton->setToolTip(QStringLiteral("Save Project"));
  9. connect(smallButton, SIGNAL(triggered()), this, SLOT(slot_fileSave()));
  10. quickAccessBar->setVisible(true);

5.创建RibbonPage并添加QAction

如截图所示,Tab部分的Layer对应为RibbonPage,在该page下可以添加如AddRasterLayer、AddVectorLayer的按钮,并且将这两个按钮都分组到下方Layer分组中。

 以下是对createRibbonBar()函数的实现:

  1. //创建page Layer
  2. RibbonPage* pageFile = ribbonBar()->addPage(tr("&Layer"));
  3. //创建分组 Layer
  4. RibbonGroup* layerGroup = pageFile->addGroup(QStringLiteral("Layer"));
  5. //在分组 Layer下添加按钮
  6. layerGroup->addAction(mAddRasterLayer, Qt::ToolButtonTextUnderIcon);
  7. layerGroup->addAction(mAddVectorLayer, Qt::ToolButtonTextUnderIcon);
  8. ribbonBar()->setFrameThemeEnabled();

6.添加侧边栏

在本软件中,侧边栏都是使用QgsDockWidget控件实现,可以任意拖拽。以下是对createDockWidget()函数的实现。

  1. //新建图层QgsDockWidget
  2. mLayerMapDock = new QgsDockWidget(this);
  3. mLayerMapDock->setWindowTitle(tr("Layer Maps"));
  4. mLayerMapDock->setObjectName(QStringLiteral("LayerMaps"));
  5. //将图层QgsDockWidget 添加在左侧展示
  6. addDockWidget(Qt::LeftDockWidgetArea, mLayerMapDock);
  7. mAttributeDock = new QgsDockWidget(this);
  8. mAttributeDock->setWindowTitle(tr("Object Attribute"));
  9. mAttributeDock->setObjectName(QStringLiteral("ObjectAttribute"));
  10. addDockWidget(Qt::RightDockWidgetArea, mAttributeDock);

以上函数都实现后,就完成了以下的大体框架,接下来就可以在框架中实现具体的功能。

 三、其他事项

一般新建的QT widgets Application项目窗体都继承自 QMainWindow类,而使用QtitanRibbon开发界面,需继承自QtitanRibbon提供的类。

如果软件中需要展示SVG格式的图标,则需要将QT plugins目录下的imageformats文件夹拷贝至软件exe生成的目录下。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/137473
推荐阅读
相关标签
  

闽ICP备14008679号