日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt [GC9-13]:HUD-转向灯、速度表、背景透明处理

發布時間:2024/3/24 编程问答 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt [GC9-13]:HUD-转向灯、速度表、背景透明处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于Qt的汽車儀表模擬

?

先看下目前的運行效果,這篇主要說一下轉向燈、速度表和背景透明的實現。

?

HUD在車上的使用場景就是投影在汽車前風擋玻璃上面,所以背景一定要做成空的。但是作為顯示器,我先應該是黑色吧,這里我就模擬了我們眼睛看到的畫面,至于顯示設備上面的,應該是黑色,或者根據每個玻璃上的參數不同調整下背景顏色,影響不大。代碼就兩行,這里我做了隱藏標題處理,所以就是三行了,如下

this->setWindowFlag(Qt::FramelessWindowHint); //隱藏標題欄this->setWindowOpacity(1);this->setAttribute(Qt::WA_TranslucentBackground);

轉向燈,屬于汽車燈光組成的一部分,主要就是告訴別人我要怎么走,左拐還是右拐或者我車怎么滴了,不能走了,警示后車即雙閃。大致流程如下圖所示。

?

這個圖看著有點復雜,其實代碼是不怎么復雜的。

說先定義三個變量,用來表示左轉、右轉和警告即雙閃。

#define TURN_LEFT 1 //左轉向燈 #define TURN_RIGHT 2 //右轉向燈 #define WARNING 3 //雙閃

其實這個不是必要的,只是為了后面使用方便。

初始化我們的定時器并吧要干活的分配給它

timer_TurnLeftLight = new QTimer;connect(timer_TurnLeftLight,&QTimer::timeout,this,[=](){if(ui->label_turnLight_L->isHidden()){ui->label_turnLight_L->show();}else{ui->label_turnLight_L->hide();}});timer_TurnRightLight = new QTimer;connect(timer_TurnRightLight,&QTimer::timeout,this,[=](){if(ui->label_turnLight_R->isHidden()){ui->label_turnLight_R->show();}else{ui->label_turnLight_R->hide();}});

這里我沒有單獨另寫槽函數,而是用了lambda表達式,詳細可以自行百度這個東東。

下面就是主要的接口了,

void HUD::set_TurnLight(int signalType, bool isOn) {switch (signalType) {case TURN_LEFT:{if(isOn){timer_TurnLeftLight->start(1000);}else{timer_TurnLeftLight->stop();ui->label_turnLight_L->hide();}break;}case TURN_RIGHT:{if(isOn){timer_TurnRightLight->start(1000);}else{timer_TurnRightLight->stop();ui->label_turnLight_R->hide();}break;}case WARNING:{if(isOn){timer_TurnLeftLight->start(1000);timer_TurnRightLight->start(1000);}else{timer_TurnLeftLight->stop();ui->label_turnLight_L->hide();timer_TurnRightLight->stop();ui->label_turnLight_R->hide();}break;}default:break;} }

控制定時器的開關和時間就好了。

速度表其實更好實現了,我仔細觀察了我車的HUD上面的速度表,三位數 單位km/h 三位數足夠了,哈哈,看樣子他的樣子和8位數碼管顯示的樣子差不多,這里我就百度了8為數碼管的樣子,仿照做了數字。

實現這個東西的大致想法如下

?

這里制作數字的過程就省略了。最后就是10張圖片,如下

?

上圖中實際背景是透明的,我只是為了截圖可看清,在這里我犯了一個錯誤,那就就是這個10和素材的大小不一樣,這就導致我在實際資源使用中,廢了好大勁才對齊所有數字。這個過程會在后面代碼中體現出來。

?

上圖中布局就是我的數字,就一個QLabel,完了根據數據接口的數字來給這個Lebel分配不同的資源。實現代碼如下

void HUD_Number::set_Number(int temp) {switch (temp) {case 0:ui->label_hudNumber->setGeometry(1,0,85,122);ui->label_hudNumber->setStyleSheet("border-image:url(:/HUD/Resources/Images/HUD/number/0.png)");break;case 1:ui->label_hudNumber->setGeometry(29,5,57,113);ui->label_hudNumber->setStyleSheet("border-image:url(:/HUD/Resources/Images/HUD/number/1.png)");break;case 2:ui->label_hudNumber->setGeometry(0,0,86,122);ui->label_hudNumber->setStyleSheet("border-image:url(:/HUD/Resources/Images/HUD/number/2.png)");break;case 3:ui->label_hudNumber->setGeometry(6,0,80,122);ui->label_hudNumber->setStyleSheet("border-image:url(:/HUD/Resources/Images/HUD/number/3.png)");break;case 4:ui->label_hudNumber->setGeometry(14,4,72,114);ui->label_hudNumber->setStyleSheet("border-image:url(:/HUD/Resources/Images/HUD/number/4.png)");break;case 5:ui->label_hudNumber->setGeometry(6,0,77,122);ui->label_hudNumber->setStyleSheet("border-image:url(:/HUD/Resources/Images/HUD/number/5.png)");break;case 6:ui->label_hudNumber->setGeometry(0,0,83,122);ui->label_hudNumber->setStyleSheet("border-image:url(:/HUD/Resources/Images/HUD/number/6.png)");break;case 7:ui->label_hudNumber->setGeometry(31,0,55,121);ui->label_hudNumber->setStyleSheet("border-image:url(:/HUD/Resources/Images/HUD/number/7.png)");break;case 8:ui->label_hudNumber->setGeometry(0,0,86,122);ui->label_hudNumber->setStyleSheet("border-image:url(:/HUD/Resources/Images/HUD/number/8.png)");break;case 9:ui->label_hudNumber->setGeometry(6,0,79,122);ui->label_hudNumber->setStyleSheet("border-image:url(:/HUD/Resources/Images/HUD/number/9.png)");break;default:break;} }

在上面的代碼中,可以看到,我每次給label分配資源的時候,都需要重新設置label的位置和大小,這就是因為我開始制作素材是沒有注意這個問題。大家在后面制作素材是可以注意。

那么我的這一個數字表就做好了,怎么把呀做成三個了,這就到了真真的設置速度的接口了,我吧這個實現方式寫在了設置速度表的接口中。如下

void HUD::set_Current_Speed(int temp) {if(temp <10){number_2->hide();number_3->hide();number_1->setGeometry(157,70,86,122);number_1->set_Number(temp);ui->label_Kmh->setGeometry(156,195,88,22);}else if(temp>=10 && temp<100){number_2->show();number_3->hide();number_1->setGeometry(200,70,86,122);number_2->setGeometry(114,70,86,122);number_1->set_Number(temp%10);number_2->set_Number(temp/10);ui->label_Kmh->setGeometry(199,195,88,22);}else{number_2->show();number_3->show();number_1->setGeometry(243,70,86,122);number_2->setGeometry(157,70,86,122);number_3->setGeometry(71,70,86,122);number_1->set_Number(temp%10);number_2->set_Number((temp/10)%10);number_3->set_Number(temp/100);ui->label_Kmh->setGeometry(240,195,88,22);} }

好了,這邊篇就完事了

?

2019/07/23 14:20

?

?

總結

以上是生活随笔為你收集整理的Qt [GC9-13]:HUD-转向灯、速度表、背景透明处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。