HOOPS/QT集成指南

更多参见:HOOPS学习笔记

引言

以下部分,说明如何使用QtGUI工具包和HOOPS 3D应用程序框架构建应用程序。首先回顾编译/链接,然后讨论各个组件对象的关系,然后概述正确创建和初始化对象以及启动Qt事件循环所需的编程步骤。

开发人员应该首先编译、链接和运行基本的qt_simple应用程序,作为其应用程序的起点。

qt_simple的可读源代码位于HOOPS/3dAF安装路径/demo/qt/qt_simple目录中,qt v4变体位于/demo/qt/qt_simpl目录中。
qt_simple假设你对Qt工具包、HOOPS/3dGS和HOOPS/MVO有一定的了解。

编译链接

Qt工具包的Signals and Slots机制需要一个预编译步骤来构建特殊的源文件。Qt元对象编译器(MOC)作为Qt工具包的一部分提供,必须在编译步骤之前使用。有关更多信息,请参阅Qt文档。

编译器定义

在一起编译HOOPS/Qt和HOOPS/MVO源代码时,必须有以下定义:

一般定义

IS_QT // All HOOPS/Qt applications

特定于windows系统

IS_WIN // Applications built with HOOPS/Qt for MS Windows IS_X11 // Applications built with HOOPS/Qt for UNIX 

在UNIX上使用OpenGL

USE_GLX_VISUAL // Applications built with HOOPS/Qt for UNIX that will use OpenGL; i.e., also IS_X11 

链接

HOOPS/Qt Widget提供清晰的源代码直接添加到应用程序的源代码库中。因此,没有特殊的HOOPS/Qt库可与项目链接

组件对象关系

这一部分讨论不同版本QT对象与HOOPS/3dAF组件之间的关系。使用这两个工具包构建应用程序时,最少需要使用每个组件中的以下对象。

QT

只有一个QApplication&至少QMainWindow(或派生类)

HOOPS/QT

至少一个HQWidget(您通常会创建一个从HQWidget派生的自定义Widget)

HOOPS/MVO

HBaseModel、HBaseView,一个从HBaseOperator派生的运算符类。想要实现几何体选择的应用程序还需要一个HSelectionSet对象。这些对象都由私有数据成员连接,私有数据成员采用以下方式存储指向其他对象的指针:
在这里插入图片描述

使用QT和HOOPS构建应用程序的步骤

使用面向对象的GUI框架(如Qt)编程包括创建一组对象,定义它们的连接方式、发送和接收消息的方式,然后启动框架的事件循环。使用Qt和HOOPS/3dAF构建应用程序特别需要以下步骤:

  • 创建和初始化:
    • Qt对象
    • HOOPS/Qt对象
    • HOOPS/MVO对象
  • 启动Qt事件处理循环

创建和初始化qt对象

QApplication

对于任何使用Qt的GUI应用程序,无论应用程序有多少个窗口,都只有一个QApplication对象。它可以通过QApplication.h中声明全局变量a来访问、 其必须在创建任何其他Qt对象之前被初始化。qt_simple示例在函数main()中执行此操作:

 int main( int argc, char **argv ) 
 { 
     ...
  // Create the one QApplication object
   QApplication * a = new QApplication(argc,argv); 
     ...
  } 

Color Allocation and GUI Style

QApplication对象属性必须配置颜色分配和GUI样式。对于Qt/HOOPS应用程序,颜色分配必须设置为“ManyColor”。GUI样式用于创建Qt GUI的视觉外观和默认行为,通常选择Motif或Windows样式。

创建和初始化HOOPS/QT对象

HQApplication

应该创建一个HQApplication,使用接受指向Qt QApplication对象指针的构造函数。qt_simple示例在函数main()中执行此操作:

int main( int argc, char **argv )
 {
     ...
    if(argc == 2) 
     HQApplication * ha = new HQApplication(a, argv[1]);
    else
     HQApplication * ha = new HQApplication(a);
     ... 
 }

HQApplication对象应创建任何Qt GUI对象,以便在初始化期间将其作为父对象。qt_simple示例在HQApplication对象通过调用其私有方法HQApplication::load()初始化时执行此操作.

HQWidget

可以根据需要创建尽可能多的HQWidget对象来实现GUI的设计。这些很可能是由顶级Qt Widget(如QMainWindow或QDialog)的构造函数创建的。qt_simple示例在HQApplication对象通过调用其私有方法HQApplication::load()初始化时执行此操作:

void HQApplication::load(const char * filename) 
{
 ... 
 SimpleHQWidget * my_widget = new SimpleHQWidget(qframe, "SimpleHQWidget", filename); 
 ...
  }

HQDeleter

必须在应用程序代码块中声明和初始化一个全局指针。qt_simple示例在文件main.cpp中执行全局声明,并在函数main()的主体中执行初始化:

 // Create a global pointer to HOOPS/Qt class HQDeleter
  HQDeleter * deleter=0;
  int main( int argc, char **argv )
   { 
   ... 
   // Create an HQDeleter object and initialize the global pointer
    deleter = new HQDeleter(); 
   ... 
   } 

创建和初始化HOOPS/MVO对象

HDB

在应用程序main()函数中声明并初始化一个指向HOOPS/MVO HDB对象的全局指针。qt_simple示例示例:

 int main( int argc, char **argv )
  { 
     m_pHDB = new HDB(); 
     m_pHDB->Init(); 
     ...
   } 

HBaseModel

可以根据需要创建多个HBaseModel对象。qt_simple示例为每个SimpleHQWidget对象创建一个(即,存在HBaseModel到SimpleHQWidget对象的一对一映射),并在SimpleHQDWidget构造函数中这样做。

SimpleHQWidget::SimpleHQWidget(QWidget* parent, const char* name, const char * filename) : HQWidget( parent, name )
{ 
 m_pHBaseModel = new HBaseModel(); 
 m_pHBaseModel->Init(); 
 ... 
}

HBaseView

可以根据需要创建多个HBaseView对象,通常为每个HQWidget创建一个HBaseView对象。HBaseView需要在创建对象时向其构造函数传递有效的窗口id和颜色映射;用于将HOOPS/3dGS输出驱动程序实例连接到Qt QWidget。这要求在创建HBaseView对象之前,HBaseView将连接到的QtWidget必须已经存在。

HBaseView对象应该在重载的HQWidget::Init()方法中创建和初始化。基类HQWidget在其HQWidget::paintEvent方法中第一次调用HQWidget::Init()方法,这首先确保该Widget是活动的,因而Window ID是有效的,并且可以创建HBaseView对象。下面是qt_simple示例:

void SimpleHQWidget::Init() 
{ 
  m_pHView = new HBaseView(m_pHBaseModel, NULL, NULL, NULL, GetWindowId(), GetColorMap(), GetClipOverride());
  m_pHView->Init(); 
  ... 
} 

HBaseOperator

HBaseView类有一个成员HBaseView::m_pOperator,它是指向HBaseOperator对象的指针。应在View初始化期间创建默认运算符。qt_simple示例在重载的HQWidget::Init()初始化m_pOperator:

void SimpleHQWidget::Init() 
{ 
    ...
    m_pHView->SetCurrentOperator(new HOpCameraOrbit(m_pHView)); 
    ...
}

HSelectionSet

可以根据需要创建多个HSelectionSet对象,但通常有HSelectionSet到HBaseView对象映射为一对一映射。
qt_simple示例不创建HSelectionSet对象,因为不提供任何选择支持。

启动QT事件循环

这是通过调用QApplication的方法QApplication::exec()来执行的。请参阅qt_simple示例的main()函数。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haimianjie2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值