OSG QT控制項互動

2021-09-26 04:47:07 字數 3172 閱讀 8240

最近自己匯入三維模型折騰,基本上匯入模型和qt的訊號傳遞,基本上是弄清楚了,舉個qt控制項控制小車旋轉的簡單例子吧:

在ui設計師中點開訊號與槽的圖示

按照慣例我們先選擇輸入訊號clicked()輸出訊號為我們自定義的訊號pushbutton_add()作為槽函式響應,這樣在ui_osg_qt.h中就會有

qobject:

:connect

(pushbutton_add,

signal

(clicked()

), osg_qtclass,

slot

(pushbutton_add()));

ps:這麼一行**自動生成(connect相關的)我們在寫自定義的控制項connect的時候還是不要這麼寫,會有坑的,為什麼不要這麼寫後面我再詳細點的說。

同樣寫出與我們控制項相關的osg實現**先:

osg_qt.cpp

///讀取檔案

osg:

:ref_ptr

:matrixtransform> floortrans = new osg:

:matrixtransform;

osgdb:

:options *funa = new osgdb:

:options

(std:

:string

("notristrippolygons"))

; car = osgdb:

:readnodefile

("my_car.stl"

, funa)

; car->

setname

("mycar");

///角度調整

osg:

:ref_ptr

:matrixtransform> rotate_node = new osg:

:matrixtransform;

rotate_node =

control_angle

(car)

;//角度調整節點

///角度調整的實現

osg:

:ref_ptr

:matrixtransform> osg_qt:

:control_angle

(osg:

:node* node)

旋轉節點控制rotate_car的主要是通過四元數控制繞z軸旋轉的所以

osg_qt.h標頭檔案中把角度宣告全域性

public:

double _zrotate =

0.0 osg:

:ref_ptr

:matrixtransform>

control_angle

(osg:

:node* node)

;

接下來就是槽函式了

osg_qt.h新增

private slots:

void

pushbutton_add()

;

osg_qt.cpp中加上

void osg_qt:

:pushbutton_add()

即可將osg與控制項相關聯

實現大概如下

訊息欄的其他相互響應也是差不多的都是qt響應的基礎

不用signal()和slot()原因很簡單我們現在基本上qt都是用的qt5了這個語法還是qt4的假若我們用這個寫得對沒問題,響應一般都是成功的,但是如果沒有寫對就很麻煩,所以一般還是用下面這種形式來寫connect

(訊號傳送者,傳送的訊號,訊號接收者,處理函式)

eg:pick_handler為我在cpickhandler類的乙個extern指標

connect

(pick_handler,

&cpickhandler:

:singnalpicked,this,

&osg_qt:

:showpickdata)

;

自己繼承的時候一定要搞清楚繼承的順序如果要用qt的訊號槽機制一定要記得在類裡面加上qobeject

eg:

class cpickhandler :public qobject ,public osgga:

:guieventhandler//一定記得是guieventhandeler

還有在**控制項響應時用了extern

在訊號響應中要記得自己的控制項為提公升類無論是connect還是槽函式

其「指標」一律為類+控制項被提公升的物件非控制項傳遞訊號的則不用直接類的指標就好

pqtab_wideget->tablewidget_postion->..

.

qt的lineedit用osg::vec3d直接強制轉化傳入可能會有問題建議先格式轉化再傳入

eg:

float x = pos[0]

; qstring data_x =

qstring

("%1").

arg(x)

;//斷點報錯因為傳入格式問題

ui.lineedit_x->

settext

(data_x)

;

點選模型時用到了qt的訊號與槽函式一定要會書寫改掉原來的直接在類裡面實現建構函式的習慣

.h的建構函式宣告

cpickhandler

(os**iewer:

:viewer *viewer)

;

.cpp的建構函式實現

cpickhandler:

:cpickhandler

(os**iewer:

:viewer *viewer)

:mviewer

(viewer)

;

後面幾天著重寫路徑漫遊,爭取能寫出自己滿意的實現**~

osgQt編譯 執行

1 軟體環境 vs2017 qt5.9.2 cmake3.10.0 2 一開始用的是cmake的最新版本3.15,遇到了一堆問題,cmakelist.txt裡面的一些巨集3.15不再支援,折騰了半天,才發現可能是版本的問題,換了幾個版本之後,發現3.10.0可以編譯通過 參考這裡 4 把qt的bin...

sciter table控制項互動

需要特別注意語法的問題。html原始碼 item name description okc 中原始碼 tableid 表控制項id sciter value cmakepeframe itemtest sjson cjson printunformatted proot stra sjson cst...

Appium控制項互動

點選views 滑動選擇並點選textfields 清除文字 usr bin python3 coding utf 8 import pytest class testlocator def setup self desired caps desired caps platformname andr...