用于三维图形绘制的装置和方法与流程

文档序号:22756986发布日期:2020-10-31 09:54阅读:187来源:国知局
用于三维图形绘制的装置和方法与流程
本发明涉及大型三维图形绘制的装置和方法,特别是涉及为软件界面的三维图形控件提供界面布局的装置和方法。
背景技术
:绘制三维图在工程设计和绘图过程中,三维图形应用越来越广泛。在工程领域,虚拟制造技术、工艺过程数值模拟和仿真技术等,都是以三维图形为基础的。在操作系统中,原生(“native”)控件,是指占用操作系统窗口句柄的一类控件,这类控件拥有独立的内存绘制区,与其它控件的绘制无关。qt的界面设计使用了布局(layout)功能。所谓布局,就是界面上组件的排列方式,使用布局可以使组件有规则地分布,并且随着窗体大小变化自动地调整大小和相对位置。而qt中为了性能优化,设计了一类不占操作系统窗口句柄的非原生(“alien”)控件,这类控件不单独占用操作系统窗口句柄,而是与同类的其它控件共同使用一个内存绘制区,所有控件同步绘制到屏幕上。这是qt中默认的控件实现方式,同时也是一种现代化的界面控件实现方式。然而,对于三维图形控件来说,由于要满足其复杂的三维图形绘制需求(有别于一般的按钮、工具面板等简单控件的二维绘制),它通常是一种native控件。qt提供了类qlayout进行布局管理,能解决当修改某个控件的位置时,其他控件也需要进行调整的这一情况。常用的布局管理有qvboxlayout、qhboxlayout、qformlayout、qgridlayout。另外qt还提供了分隔器(qsplitter)控件布局管理方式,以支持交互式的自由调节布局中各部分控件的大小。然而,上述这些布局管理方式都无法对同时存在native和alien两类控件的情况进行正确的管理,造成控件位置错乱。目前,对于上述问题,qt提供的解决方案是把界面中所有的alien控件都转换成native控件,这种做法的缺点是造成大大小小的每个控件都占用操作系统窗口句柄,增加了系统资源占用和绘制代价。还有另一种方法是不给三维图形控件申请独立绘制区,而是通过离屏渲染的方式,将gpu中的三维图形绘制结果传回内存再与alien控件一起绘制,这种方式的缺点则是多了一道将绘制结果在显存和内存之间来回传递的工序,降低了三维图形的绘制性能。因此需要让qt界面布局管理机制在native控件和alien控件同时出现的情况下能正常工作的装置和方法,使得三维图形控件的绘制性能不受影响的同时,又能表现得如普通控件一样,受到正常的界面布局管理。技术实现要素:本发明提供了一种三维图形绘制的装置和方法,特别涉及为软件界面的三维图形控件提供界面布局的装置和方法。本发明提供一种三维图形绘制的方法,包括如下步骤:利用qt平台的原生控件进行三维图形绘制;对每个原生控件创建一个非原生控件分身;设定所述非原生控件分身,使所述原生控件的非原生控件分身在尺寸大小和位置上分别与原生控件同步;所述原生控件的非原生分身配合其他非原生控件,接受qt布局管理,完成三维图形绘制。本发明的一个方面,其中设定所述非原生控件分身,使所述原生控件的非原生分身在大小上与原生控件同步的步骤中,在非原生控件分身的尺寸大小发生变化时,将原生控件的尺寸大小也设置为所述分身的大小。本发明的另一个方面,其中设定所述非原生控件分身,使所述原生控件的非原生控件分身在位置上与原生控件同步的步骤中,在所述非原生控件分身(105)相对于原生控件控件(101)的父结点的位置发生变化时,将所述原生控件(101)设置为与所述非原生控件分身(105)同样的位置本发明的再一个方面,其中:设定所述非原生控件分身,使所述原生控件的非原生分身在位置上与原生控件同步的步骤中还包括:设置qt事件过滤器(205),用于监测所述非原生控件分身(105)及其所有非原生控件祖先结点,并分别对不同的事件做出不同的处理:针对位置变化事件(qevent::move):同步设置所述原生控件(101)的位置;针对父结点即将改变事件(qevent::parentabouttochange):解除所有非原生控件祖先结点对该事件过滤器(205)的关联;针对父结点已改变事件(qevent::parentchange):对所有新的非原生控件祖先结点关联该事件过滤器(205)。本发明还提供一种三维图形绘制的装置,包括下列装置:绘制模块,利用qt平台的原生控件进行三维图形绘制;分身创建模块,对每个原生控件创建一个非原生控件分身;同步模块,设定所述非原生控件分身,使所述原生控件的非原生控件分身在尺寸大小和位置上分别与原生控件同步;配合模块,所述原生控件的非原生分身配合其他非原生控件,接受qt布局管理,完成三维图形绘制。本发明的再一个方面提供了一种qt界面布局的方法,包括如下步骤:对每个原生控件创建一个非原生控件分身;设定所述非原生控件分身,使所述原生控件的非原生控件分身在尺寸大小和位置上分别与原生控件同步;所述原生控件的非原生分身配合其他非原生控件,完成qt界面管理。利用了本发明的装置和方法,在绘制三维图形的过程中能够进行正常的qt界面布局管理,应用了本技术后,用于复杂三维图形绘制的native控件也能像一般的alien控件一样,正常受到qt界面布局管理,并且绘制性能不受影响,二者得以兼顾。附图说明为了更清楚地说明本发明实施例中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍。显而易见地,下面描述中的附图仅仅是本发明的一些实例,对于本领域普通技术人员来讲,在不付出创新性劳动的前提下,还可以根据这些附图获得其他的附图。图1为本发明的三维绘制装置中native控件及其alien分身的父控件示意图;图2为本发明的三维绘制方法中实现位置同步的步骤示意图;图3为本发明的三维绘制方法的流程图;图4示意性地示出了用于执行根据本发明的方法的服务器的框图;图5示意性地示出了用于保持或者携带实现根据本发明的方法的程序代码的存储单元;图6为本发明的三维绘制方法示例的界面布局示意图。具体实施方式以下阐述的是当前被认为是所要求保护的发明的优选实施例或最佳表示性示例的内容。仔细考虑了对实施例和优选实施例的将来和现在的表示或修改,在功能、目的、结构或结果方面作出实质性改变的任何变更或修改,都旨在被本专利的权利要求所涵盖。现在将参考附图仅以举例的方式描述本发明的优选实施例。在说明本发明的实施例之前,先解释几个出现在文中的名词:qt:是一个跨平台应用程序和ui开发框架。使用qt只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。qt界面布局管理:对界面的布局管理主要涉及界面中部件的整齐排列或使界面适应窗口的大小变化,其中一种解决方案为布局管理器qlayout,布局管理器能根据界面组件进行布局管理:(1)能够自动排列窗口中的界面组件;(2)窗口变化后能自动更新界面的大小。还有一种方案为分割器qsplitter,它支持以交互式的方式自由调节布局中各部分控件所占的大小。控件:界面上一个可供录入、显示某些信息的单元,例如:文本输入框,下拉选择框、参照框、单选框等;原生(native)控件:是指占用操作系统窗口句柄的一类控件,这类控件拥有独立的内存绘制区,与其它控件的绘制无关。非原生(alien)控件:alien控件是qt对于directui设计的一种实现,也是qt中一般的(或者说普通的、默认的、缺省的)控件。qt中为了性能优化,设计了一类不占操作系统窗口句柄的(alien)控件,这类控件则不单独占用操作系统窗口句柄,而是与同类的其它控件共同使用一个内存绘制区,所有控件同步绘制到屏幕上。这是qt中默认的控件实现方式,同时也是一种现代化的界面控件实现方式。本发明提出了一种软件界面的三维图形控件提供界面布局的装置和方法,使qt界面布局管理机制在native和alien两类控件都出现的情况下也能正常工作的方法,使得复杂三维图形控件的绘制性能不受影响的同时,又能表现得如同一般控件一样,受到正常的界面布局管理。在对界面进行布局的过程中,根据设计的实际情况和要求配置参数,配置参数可例如下表1所示:参数名称参数说明qwidgetqt中的控件,有native控件和alien控件之分parentwidget父控件nativeparentwidget祖先结点中同为native类的控件alienwidgetalien控件nativewidgetnative控件qevent::parentabouttochange父结点即将改变事件qevent::parentchange父结点已改变事件qevent::move位置变化事件qwidget有native控件和alien控件之分,用户可以对qwidget是native还是alien进行定义。前者有句柄,后者共享其父辈或其他祖先的句柄。本发明分析native控件和alien控件的树形父子结点关系,给实际绘制三维图形的native控件创造一个alien分身,让qt的布局管理机制仅管理alien分身,并利用qt的事件机制,对alien分身和实际的native控件之间的位置和大小进行同步。本发明对每个native控件创建一个alien分身,在一个实施方式中,所述alien分身,是在qt中创建一个qwidget,并将其作为native控件在qt布局管理中的一个替代物。该alien分身配合其它alien控件,接受qt布局管理,并在其位置、大小发生变化时做出相应的处理,而控件内容的绘制和用户交互事件的处理则由native控件本身负责。在一个实施例中,将native控件的alien分身在大小和位置上分别予以同步。在两者同步处理中,大小(控件的宽高尺寸)的同步比较直观,即alien分身的大小发生变化时,将native控件的大小也设置为alien分身的大小即可。位置的同步需要进行较详细的设计。在qt中,一个控件内部记录了它相对于其直接父控件(parentwidget)的位置,而native控件的位置却是相对于其祖先结点中同为native类的控件(nativeparentwidget)而言的。图1为本发明的三维绘制装置中native控件及其alien分身的父控件示意图。在如图1所示的情况中,标号为102的alien2是native控件101逻辑上的父控件,即实际上希望让native控件101受到标号为102的alien2的布局管理,则需要用alien分身105来代替native控件101,将其父结点指定为标号为102的alien2,而把native控件101的父结点指定为它的根节点(nativeparentwidget)(即图中的顶级窗口104),它是图中所有控件native控件101,标号为102的alien2,标号为103的alien1,和alien分身105的父子关系树中的根结点,也具有native控件的属性。这样,方可正确设置native控件101的位置。图2为本发明的三维绘制方法中实现位置同步的步骤示意图。需在alien分身105相对于顶级窗口104(nativeparentwidget)的位置发生变化时,同步设置native控件101的位置可实现位置同步。这里,在步骤201,设置qt事件过滤器205,用于监测alien分身105及其所有alien祖先结点(即图1中的标号为102的alien2和标号为103的alien1)的三种事件并做出相应处理,在一个实施例中,这里所述的三个事件通常不是同时发生的,做出的响应针对的是不同的事件,事件发生的顺序可以按照下列所述的顺序,也可以不按照下列的顺序,因此事件发生的顺序是不固定的:(1)步骤202,针对位置变化事件(qevent::move):同步设置native控件101的位置。(2)步骤203,针对父结点即将改变事件(qevent::parentabouttochange):解除所有alien祖先结点(即图1中的标号为102的alien2和标号为103的alien1)对该事件过滤器205的关联。(3)步骤204,针对父结点已改变事件(qevent::parentchange):对所有新的alien祖先结点关联该事件过滤器205;当发生了“父节点已改变”事件时,当前父节点就是新的父节点,沿着当前父节点、父节点的父节点等等的顺序依次向上追溯,直到遇到native控件或窗口为止。追溯并遍历到native控件或窗口之前的所有父节点即“所有新的alien祖先”这样,即可保证无论父结点如何变化,都能监测到alien分身105相对于native控件101的父结点(nativeparentwidget)(即图中的顶级窗口104)位置的变化,同时也不会有多余的事件与过滤器关联;对于某个alien控件(下文称其为“a”)来说,只有其祖先结点的位置变化会影响a的位置。因此,当a的父节点发生变化时,其旧的祖先结点就不再是a的祖先结点,它们的位置变化也不会影响a的位置,因此也不需要该事件过滤器来进行位置同步的操作,籍此解除它们之间的关联。图3为本发明的三维绘制方法的流程图。其中,在步骤301,利用qt的native控件进行三维图形绘制;在步骤302,对于每个native控件创造一个alien分身;在步骤303,将所述native控件的alien分身在大小和位置上分别予以同步;在步骤304,所述alien分身配合其他alien控件,接受qt布局管理,完成三维图形绘制。在上述步骤303中,将所述native控件的alien分身在大小上予以同步的步骤为在alien分身的大小发生变化时,将native控件的大小也设置为alien分身的大小,下列是将native控件的大小设置为alien分身大小的语句示例:nativewidget->resize(alienwidget->size());将所述native控件的alien分身在大小上予以同步的步骤为,需在所述alien分身105相对于native控件101的父结点(即顶级窗口104(nativeparentwidget))的位置发生变化时,同步设置native控件101的位置,下列是同步设置native控件101位置的语句示例:nativewidget->move(alienwidget->mapto(nativewidget->nativeparentwidget(),{}));对于如何同步设置所述置native控件101的位置的具体方式实施例,在上文针对图2的描述中已有详细描述。本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(dsp)来实现根据本发明实施例的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的三维图形绘制的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。例如,图4示出了可以实现根据本发明的服务器,例如应用服务器。该服务器传统上包括处理器1010和以存储器1020形式的计算机程序产品或者计算机可读介质。存储器1020可以是诸如闪存、eeprom(电可擦除可编程只读存储器)、eprom、硬盘或者rom之类的电子存储器。存储器1020具有用于执行上述方法中的任何方法步骤的程序代码1031的存储空间1030。例如,用于程序代码的存储空间1030可以包括分别用于实现上面的方法中的各种步骤的各个程序代码1031。这些程序代码可以从一个或者多个计算机程序产品中读出或者写入到这一个或者多个计算机程序产品中。这些计算机程序产品包括诸如硬盘,紧致盘(cd)、存储卡或者软盘之类的程序代码载体。这样的计算机程序产品通常为如参考图5所述的便携式或者固定存储单元。该存储单元可以具有与图4的服务器中的存储器1020类似布置的存储段、存储空间等。程序代码可以例如以适当形式进行压缩。通常,存储单元包括计算机可读代码1031’,即可以由例如诸如1010之类的处理器读取的代码,这些代码当由服务器运行时,导致该服务器执行上面所描述的方法中的各个步骤。图6为本发明的三维绘制方法示例的界面布局效果示意图。图中,中间画有三维几何体的矩形区域是用于三维图形绘制的原生控件,利用本发明的三维绘制方法,利用qt平台的原生控件进行三维图形绘制;对该原生控件创建一个非原生控件分身;设定所述非原生控件分身,使所述原生控件的非原生控件分身在尺寸大小和位置上分别与原生控件同步;将所述原生控件的非原生分身配合其他非原生控件(如图中控制面板1,2,3),接受qt布局管理,完成软件整个窗口界面的绘制。图6是完成上述内容后的界面效果图,从图6可以看到,本发明的方法能够解决在绘图过程中界面控件位置错乱的问题。本发明的三维绘图方法中的界面布局方法本身也是一种创新,除了可以使用在三维绘图中以外,在qt的其他应用中也可以得到应用。这种qt界面布局的方法,包括如下步骤:对每个原生控件创建一个非原生控件分身;设定所述非原生控件分身,使所述原生控件的非原生控件分身在尺寸大小和位置上分别与原生控件同步;所述原生控件的非原生分身配合其他非原生控件,完成qt界面管理。其中:设定所述非原生控件分身,使所述原生控件的非原生分身在大小上与原生控件同步的步骤中,在非原生控件分身的尺寸大小发生变化时,将原生控件的尺寸大小也设置为所述分身的大小。其中:设定所述非原生控件分身,使所述原生控件的非原生控件分身在位置上与原生控件同步的步骤中,在所述非原生控件分身(105)相对于原生控件控件(101)的父结点的位置发生变化时,将所述原生控件(101)设置为与所述非原生控件分身(105)同样的位置。其中:设定所述非原生控件分身,使所述原生控件的非原生分身在位置上与原生控件同步的步骤中还包括:设置qt事件过滤器(205),用于监测所述非原生控件分身(105)及其所有非原生控件祖先结点,并分别对不同的事件做出不同的处理:针对位置变化事件(qevent::move):同步设置所述原生控件(101)的位置;针对父结点即将改变事件(qevent::parentabouttochange):解除所有非原生控件祖先结点对该事件过滤器(205)的关联;针对父结点已改变事件(qevent::parentchange):对所有新的非原生控件祖先结点关联该事件过滤器(205)。本文中所称的“一个实施例”、“实施例”或者“一个或者多个实施例”意味着,结合实施例描述的特定特征、结构或者特性包括在本发明的至少一个实施例中。此外,请注意,这里“在一个实施例中”的词语例子不一定全指同一个实施例。以上描述并非旨在限制在限定本发明的以下权利要求书中使用的词语的含义或范围。而是提供了描述和说明以帮助理解各种实施例。预期未来在结构、功能或结果方面的修改将存在而并非实质性改变,并且权利要求书中的所有这些非实质性改变都旨在被权利要求所涵盖。因此,尽管已经说明和描述了本发明的优选实施例,但本领域技术人员将会理解,可以在不脱离要求保护的本发明的情况下做出许多改变和修改。另外,虽然术语“要求保护的发明”或“本发明”在本文中有时以单数形式使用,但将理解,存在如所描述和要求保护的多个发明。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1