一、下载编译Qt Ribbon组件SARibbon
SARibbon 下载地址:github - https://github.com/czyt1988/SARibbon
下载后Qt Creator加载SARibbon.pro,编译Debug、Release。
拷贝Debug、Release输出和SARibbon头文件到一个另外一个目录(3rd\include\SARibbon,
3rd\libs\SARibbon)备用:
头文件目录:
库目录:
dll文件也拷贝过来,是为了后续方便Qt Creator 中运行程序时找到这些dll。
二、下载编译Qt Docking 组件Qt-Advanced-Docking-System
Qt-Advanced-Docking-System下载地址:GitHub - githubuser0xFFFF/Qt-Advanced-Docking-System: Advanced Docking System for Qt
下载后Qt Creator 加载ads.pro项目文件,编译Debug。Release。
拷贝Debug、Release输出和Qt-Advanced-Docking-System头文件到一个另外一个目录(3rd\include\AdvancedDocking,3rd\libs\AdvancedDocking)备用。
头文件目录:
库目录:
三、下载Opencascade
到opencascade 官网,下载最新的opencascade-7.6.0-vc14-64.exe。下载安装后,拷贝opencascade的头文件、库文件、dll文件到另外一个目录备用
头文件目录:
库文件目录:
四、建立一个Widget项目
主窗口类选择继承QMainWindow:
五、与SARibbon结合
5.1 添加SARibbon库
添加后,项目.pro文件会追加如下内容:
5.2 使用SARibbon
5.2.1 MainWindow类改为继承SARibbonMainWindow
5.2.2 删除UI中的工具栏
切记:删除MainWindow.ui的工具栏。
5.3创建Ribbon元素
一切OK,运行后的结果如下:
六、与Qt-Advanced-Docking-System结合
6.1 添加Qt-Advanced-Docking-System库
添加方法与添加SARibbon库类似,参考执行就OK。
6.2 使用Qt-Advanced-Docking-System
MainWindow类中建立ads::CDockManager(Dock管理器):
创建一个Widget类SinnDockView继承ads::DockWidget。
创建一个Widget类SinnProjectTree继承ads::DockWidget。
添加Dock Widget:
运行的结果:
七、结合Opencascade
7.1 添加Opencascade库
过程与添加SARibbon库类似,区别在于安装的opencascade没有debug库文件,添加时需要注意:
添加后,.pro项目文件后添加下面内容:
7.2 建立一个opencascade 可视化的类SinnView
头文件:
class SinnView : public Standard_Transient
{
DEFINE_STANDARD_RTTIEXT(SinnView, Standard_Transient)
public:
SinnView(HWND hwnd);
void Redraw();
void MustBeResized();
private:
Handle(V3d_Viewer) myViewer;
Handle(V3d_View) myView;
Handle(AIS_InteractiveContext) myContext;
}
cpp文件:
using namespace SinnRBT;
IMPLEMENT_STANDARD_RTTIEXT(SinnView, Standard_Transient)
static Handle(Graphic3d_GraphicDriver)& GetGraphicDriver()
{
static Handle(Graphic3d_GraphicDriver) aGraphicDriver;
return aGraphicDriver;
}
SinnView::SinnView(HWND hwnd)
{
//检索OpenGl驱动
Handle(Aspect_DisplayConnection) aDisplayConnection = new Aspect_DisplayConnection();
if (GetGraphicDriver().IsNull())
{
GetGraphicDriver() = new OpenGl_GraphicDriver(aDisplayConnection);
}
//创建适配窗口
Handle(WNT_Window) wind = new WNT_Window((Aspect_Handle) hwnd);
//创建V3dViewer and V3d_View
myViewer = new V3d_Viewer(GetGraphicDriver());
myView = myViewer->CreateView();
myView->SetWindow(wind);
if (!wind->IsMapped()) wind->Map();
//创建交互上下文
myContext = new AIS_InteractiveContext(myViewer);
//打开灯光
myViewer->SetDefaultLights();
myViewer->SetLightOn();
//激活2维网格
this->ActivateGrid();
//设置视图背景
myView->SetBgGradientColors(Quantity_NOC_LIGHTSKYBLUE, Quantity_NOC_LIGHTSKYBLUE4, Aspect_GFM_VER);
//设置投影方式:透视投影
this->SetProjectionType(Graphic3d_Camera::Projection_Perspective);
//显示坐标
myView->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_GOLD, 0.08, V3d_ZBUFFER);
//设置显示模式:
this->SetDisplayMode(AIS_Shaded,Standard_True);
}
void SinnView::Redraw()
{
if(myView.IsNull())return;
myView->Redraw();
}
void SinnView::MustBeResized()
{
if(myView.IsNull())return;
myView->MustBeResized();
}
7.3 SinnDockView类创建SinnView实例
头文件:
using namespace ads;
class SinnDockView : public CDockWidget
{
public:
SinnDockView();
protected:
virtual QPaintEngine* paintEngine() const;
// Paint events.
virtual void paintEvent(QPaintEvent* theEvent);
virtual void resizeEvent(QResizeEvent* theEvent);
private:
void init();
private:
Handle(SinnRBT::SinnView) myView;
}
Cpp文件:
SinnDockView::SinnDockView()
:CDockWidget("sinnDockView")
{
// No Background
setBackgroundRole( QPalette::NoRole );
// set focus policy to threat QContextMenuEvent from keyboard
setFocusPolicy(Qt::StrongFocus);
setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_NoSystemBackground);
// Enable the mouse tracking, by default the mouse tracking is disabled.
setMouseTracking( true );
//
init();
}
void SinnDockView::init()
{
// Get window handle.
HWND window_handle = (HWND) winId();
myView = new SinnRBT::SinnView(window_handle);
}
/*!
Get paint engine for the OpenGL viewer. [ virtual public ]
*/
QPaintEngine* SinnDockView::paintEngine() const
{
return 0;
}
void SinnDockView::paintEvent( QPaintEvent* /*theEvent*/ )
{
if(!myView.IsNull())
{
myView->Redraw();
}
}
void SinnDockView::resizeEvent( QResizeEvent* /*theEvent*/ )
{
if( !myView.IsNull() )
{
myView->MustBeResized();
}
}
运行结果: