生活随笔
收集整理的這篇文章主要介紹了
基于Zigbee的智能路灯控制系统的Qt操作界面
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本項目已經用于參加過比賽,在加之本人確實有點忙,所以拖到現在才發。這里只詳細說明關于Qt控制界面的相關功能說明,本來是19年寫的,代碼量有點大,具體的地方,我自己都可能有點遺忘了,不過還是發出來供大家參考使用,因為當初時間緊迫可能代碼格式不夠規范,看起來有些吃力,希望大家見諒,大部分核心的控制函數,我還是有較為詳細的功能說明的。
言歸正傳,因為代碼量確實大,總和代碼量大概在2000+行的樣子,所以我就只在博文中說明部分即可,若想進一步了解的話,請自行點擊下方的下載鏈接進行下載。
首先,本項目Qt操作界面的整體功能框架如下:
已經用于的功能和帶擴展的功能,上圖都已經有說明。
下面進行分部分介紹:
一、 智能照明
本智能路燈可以根據光照亮度,來進行自動照明。其通過光敏傳感器所接收到的光照,判斷其光照強度,外界環境較亮時(即傍晚)照射黃光,外界環境光亮弱時(即夜晚)照射白光。(這個部分是Zigbee部分的控制,Qt只是在控制切換自動模式還是手動模式)
此外還可以通過上位機Qt端的天氣情況,將數據發送到ZigBee端,自動轉換燈色,以適應天氣。(聯網獲取天氣信息在文章后面會提)
此外,系統設計之初設置有光強的漸變,即在智能自動模式下,燈光會根據環境的光照情況或燈內部的紅外傳感是否感應到行人來自動調節光線強度,目前光強漸變功能正處于研究與測試階段。(Qt的界面控制中有否有人通過的圖像顯示標識)
void Widget
::open_sum
()
{if(ui
->checkBox_lighting_1
->checkState
()==0&&ui
->checkBox_lighting_2
->checkState
()==0){qDebug()<<"請勾選需要點亮的燈泡";QMessageBox
::information
(this,"提示","請勾選需要點亮的燈泡");ui
->label_bulb_1
->setPixmap
(QPixmap("phono/bulb_notlighting.png"));ui
->label_bulb_1
->setScaledContents
(true);ui
->label_bubl_2
->setPixmap
(QPixmap("phono/bulb_notlighting.png"));ui
->label_bubl_2
->setScaledContents
(true);}if(ui
->checkBox_lighting_1
->checkState
()==2&&ui
->checkBox_lighting_2
->checkState
()==0){chocie
="1";if(ui
->comboBox_lighting_1
->currentText
()=="white"){P_1
="1";P_2
="3";ui
->label_bulb_1
->setPixmap
(QPixmap("phono/bulb_white.png"));ui
->label_bulb_1
->setScaledContents
(true);}if(ui
->comboBox_lighting_1
->currentText
()=="yellow"){P_1
="0";P_2
="3";ui
->label_bulb_1
->setPixmap
(QPixmap("phono/bulb_yellow.png"));ui
->label_bulb_1
->setScaledContents
(true);}ui
->label_bubl_2
->setPixmap
(QPixmap("phono/bulb_notlighting.png"));ui
->label_bubl_2
->setScaledContents
(true);send_datas
();}if(ui
->checkBox_lighting_1
->checkState
()==0&&ui
->checkBox_lighting_2
->checkState
()==2){chocie
="2";if(ui
->comboBox_lighting_2
->currentText
()=="white"){P_1
="3";P_2
="0";ui
->label_bubl_2
->setPixmap
(QPixmap("phono/bulb_white.png"));ui
->label_bubl_2
->setScaledContents
(true);}if(ui
->comboBox_lighting_2
->currentText
()=="yellow"){P_1
="3";P_2
="1";ui
->label_bubl_2
->setPixmap
(QPixmap("phono/bulb_yellow.png"));ui
->label_bubl_2
->setScaledContents
(true);}ui
->label_bulb_1
->setPixmap
(QPixmap("phono/bulb_notlighting.png"));ui
->label_bulb_1
->setScaledContents
(true);send_datas
();}if(ui
->checkBox_lighting_1
->checkState
()==2&&ui
->checkBox_lighting_2
->checkState
()==2){chocie
="3";if(ui
->comboBox_lighting_1
->currentText
()=="white"){P_1
="1";
ui
->label_bulb_1
->setPixmap
(QPixmap("phono/bulb_white.png"));ui
->label_bulb_1
->setScaledContents
(true);}if(ui
->comboBox_lighting_2
->currentText
()=="white"){
P_2
="0";ui
->label_bubl_2
->setPixmap
(QPixmap("phono/bulb_white.png"));ui
->label_bubl_2
->setScaledContents
(true);}if(ui
->comboBox_lighting_1
->currentText
()=="yellow"){P_1
="0";
ui
->label_bulb_1
->setPixmap
(QPixmap("phono/bulb_yellow.png"));ui
->label_bulb_1
->setScaledContents
(true);}if(ui
->comboBox_lighting_2
->currentText
()=="yellow"){
P_2
="1";ui
->label_bubl_2
->setPixmap
(QPixmap("phono/bulb_yellow.png"));ui
->label_bubl_2
->setScaledContents
(true);}send_datas
();}}
里面存在很多圖像標識設置。
二、路燈升降,角度轉動
本智能路燈可以控制升降。它分為自動模式和手動模式。自動模式下路燈將自動調節照射的范圍,使照射到地面上的光照更強,達到較好照明效果。手動模式下,用戶可手動控制路燈高低,路燈與地面的仰角。在現實應用中,該模式不僅方便維修人員進行相關操作,減少維修人員高空作業風險,還使路燈控制更加人性化。(大部分語句使用的是我們報告中的語句,所以顯的有點那啥。。。哈哈哈)
這個部分功能的實現主要使用的滑塊組件與qss語言的配合實現的圖像的變換,因為本人還沒有系統的學習關于Qt自定義控件的設計,所以只能依托PS和qss語句進行變換圖像的顯示功能。
路燈的升降:
void Widget
::send_up()
{if(ui
->checkBox_dial_1
->checkState
()==0&&ui
->checkBox_dial_2
->checkState
()==0){qDebug()<<"未被選中";QMessageBox
::information
(this,"提示","請勾選需要升降的路燈");}if(ui
->checkBox_dial_1
->checkState
()==2&&ui
->checkBox_dial_2
->checkState
()==0){chocie
="1";G_1
="1";G_2
="0";send_datas
();}if(ui
->checkBox_dial_1
->checkState
()==0&&ui
->checkBox_dial_2
->checkState
()==2){chocie
="2";G_2
="1";G_1
="0";send_datas
();}if(ui
->checkBox_dial_1
->checkState
()==2&&ui
->checkBox_dial_2
->checkState
()==2){chocie
="3";G_1
="1";G_2
="1";send_datas
();}}void Widget
::show_up
()
{int max
=6;int min
=0;ui
->verticalSlider_light
->setRange
(min
,max
);ui
->verticalSlider_light
->setSingleStep
(1);ui
->verticalSlider_light_2
->setRange
(min
,max
);ui
->verticalSlider_light_2
->setSingleStep
(1);if(ui
->checkBox_dial_1
->checkState
()==2&&ui
->checkBox_dial_2
->checkState
()==0){ui
->label_gan_hint_1
->show
();ui
->label_gan_hint_2
->show
();ui
->verticalSlider_light
->setValue
(add
);add
++;if(add
>=7){timer_5
->stop
();qDebug()<<"1上升完畢";QMessageBox
::information
(this,"提示","燈1上升完畢");ui
->label_gan_hint_1
->hide();ui
->label_gan_hint_2
->hide
();}}if(ui
->checkBox_dial_1
->checkState
()==0&&ui
->checkBox_dial_2
->checkState
()==2){ui
->label_gan_hint_1
->show
();ui
->label_gan_hint_2
->show
();ui
->verticalSlider_light_2
->setValue
(bdd
);bdd
++;if(bdd
>=7){timer_8
->stop
();qDebug()<<"2上升完畢";QMessageBox
::information
(this,"提示","燈2上升完畢");ui
->label_gan_hint_1
->hide();ui
->label_gan_hint_2
->hide
();}}if(ui
->checkBox_dial_1
->checkState
()==2&&ui
->checkBox_dial_2
->checkState
()==2){if(add
==bdd
){ui
->label_gan_hint_1
->show
();ui
->label_gan_hint_2
->show
();ui
->verticalSlider_light
->setValue
(add
);ui
->verticalSlider_light_2
->setValue
(bdd
);add
++;bdd
++;if(add
==7&&bdd
==7){timer_5
->stop
();timer_8
->stop
();qDebug()<<"兩盞上升完畢";QMessageBox
::information
(this,"提示","兩盞燈上升完畢");ui
->label_gan_hint_1
->hide();ui
->label_gan_hint_2
->hide
();}}else{timer_5
->stop
();timer_8
->stop
();qDebug()<<"請取消無需升降操作的選項";QMessageBox
::information
(this,"提示","請取消無需升降操作的選項");ui
->label_gan_hint_1
->hide();ui
->label_gan_hint_2
->hide
();}}}
void Widget
::timer_up
()
{if(ui
->checkBox_dial_1
->checkState
()==2&&ui
->checkBox_dial_2
->checkState
()==0){timer_6
->stop
();timer_5
->start
(1000);}if(ui
->checkBox_dial_1
->checkState
()==0&&ui
->checkBox_dial_2
->checkState
()==2){timer_9
->stop
();timer_8
->start
(1000);}if(ui
->checkBox_dial_1
->checkState
()==2&&ui
->checkBox_dial_2
->checkState
()==2){timer_6
->stop
();timer_5
->start
(1000);timer_9
->stop
();timer_8
->start
(1000);}
}
第一個函數判斷選中的控制路燈(因為此項目控制的是兩個升降路燈模型);第二個函數控制路燈升降控制的圖像變換顯示,主要機制還是定時器的使用。(這里下降與上升異曲同工)
路燈燈部轉動
void Widget
::dial_1()
{int max
=180;int min
=90;int single_sp
=15;int single_ver
=15;ui
->spinBox_3
->setMaximum
(max
);ui
->spinBox_3
->setMinimum
(min
);ui
->spinBox_5
->setRange
(90,180);ui
->spinBox_3
->setSingleStep
(single_sp
);ui
->spinBox_5
->setSingleStep
(single_sp
);ui
->spinBox_3
->setValue
(90);ui
->spinBox_5
->setValue
(90);ui
->dial
->setSingleStep
(single_ver
);ui
->dial_2
->setSingleStep
(single_ver
);connect
(ui
->spinBox_3
,SIGNAL
(valueChanged(int)),ui
->dial
,SLOT
(setValue(int)));connect
(ui
->dial
,SIGNAL
(valueChanged(int)),ui
->spinBox_3
,SLOT
(setValue(int)));connect
(ui
->spinBox_5
,SIGNAL
(valueChanged(int)),ui
->dial_2
,SLOT
(setValue(int)));connect
(ui
->dial_2
,SIGNAL
(valueChanged(int)),ui
->spinBox_5
,SLOT
(setValue(int)));connect
(ui
->spinBox_3
,SIGNAL
(valueChanged(int)),this,SLOT
(spinBox_hint_1
()));connect
(ui
->spinBox_5
,SIGNAL
(valueChanged(int)),this,SLOT
(spinBox_hint_2
()));}void Widget
::spinBox_hint_1
()
{ui
->label_light_hint_1
->setText
(" 調節中");ui
->label_light_hint_1
->show
();
}void Widget
::spinBox_hint_2
()
{ui
->label_light_hint_2
->setText
(" 調節中");ui
->label_light_hint_2
->show
();
}void Widget
::dial_hint
()
{QString value1
;QString value2
;value1
=ui
->spinBox_3
->text
();value2
=ui
->spinBox_5
->text
();int value1_int
=value1
.toInt
();int value2_int
=value2
.toInt
();value1_int
=value1_int
-90;value2_int
=value2_int
-90;value1
=QString
::number
(value1_int
);value2
=QString
::number
(value2_int
);if(value1_int
<=10){value1
="0"+value1
;}if(value2_int
<=10){value2
="0"+value2
;}timer_7
->setSingleShot
(true);if(ui
->checkBox_dial_1
->checkState
()==0&&ui
->checkBox_dial_2
->checkState
()==0){qDebug()<<"未被選中";QMessageBox
::information
(this,"提示","請勾選需要轉動的路燈");}if(ui
->checkBox_dial_1
->checkState
()==2&&ui
->checkBox_dial_2
->checkState
()==0){chocie
="1";Z_1
=value1
;ui
->label_light_hint_1
->setText
("正在轉動中...");ui
->label_light_hint_1
->show
();timer_7
->start
(2*1000);}if(ui
->checkBox_dial_2
->checkState
()==2&&ui
->checkBox_dial_1
->checkState
()==0){chocie
="2";Z_2
=value2
;ui
->label_light_hint_2
->setText
("正在轉動中...");ui
->label_light_hint_2
->show
();timer_7
->start
(2*1000);}if(ui
->checkBox_dial_2
->checkState
()==2&&ui
->checkBox_dial_1
->checkState
()==2){chocie
="3";Z_1
=value1
;Z_2
=value2
;ui
->label_light_hint_1
->setText
("正在轉動中...");ui
->label_light_hint_2
->setText
("正在轉動中...");ui
->label_light_hint_1
->show
();ui
->label_light_hint_2
->show
();timer_7
->start
(2*1000);}send_datas
();
}void Widget
::dial_execute
()
{ui
->label_light_hint_1
->hide
();ui
->label_light_hint_2
->hide
();timer_7
->stop
();QMessageBox
::information
(this,"提示","轉動完成");
}
同樣是定時器的運用
控制界面如下:
三、數據庫
在上位機上設置有數據庫,用于存儲路段的相關情況目前主要工作。光敏傳感等傳感器將檢測到的數據反饋到上位機,上位機將數據進行存儲,能夠更加清晰地了解該路段所存在的情況。目前的存儲信息格式為“時間—光照強度—天氣情況——溫度”,用戶從主操作界面點擊進入數據庫界面,可對數據庫列表數據進行更新、數量設定等操作。后期我們將新增信息搜索等功能已完善與優化數據庫系統。
我在以前的博文中提到過數據庫的使用,這里就不過多贅述,直接上代碼:
#include "data_storeroom.h"
#include "ui_data_storeroom.h"int sum
=1440;data_storeroom
::data_storeroom(QWidget
*parent
) :QWidget(parent
),ui(new Ui
::data_storeroom
)
{ui
->setupUi(this);this->setMaximumSize
(837,592);ui
->lineEdit_sum
->setEnabled
(false);this->setWindowTitle
("數據庫");db
=QSqlDatabase
::addDatabase
("QSQLITE");db
.setDatabaseName
("data_lighting.db");bool ok
=db
.open
();if(!ok
){qDebug()<<"數據庫打開失敗";}else{qDebug()<<"數據庫打開成功";}up_data();if(setting
.value
("sum").toInt
()==0){ui
->lineEdit_sum
->setText
(QString
::number
(sum
));}else{save_setting
();}timer
->start
(1000);QObject
::connect
(ui
->pushButton_updata
,SIGNAL
(clicked()),this,SLOT
(up_data()));QObject
::connect
(timer
,SIGNAL
(timeout()),this,SLOT
(detection_data())); QPalette pa
;QPixmap pix
;pix
=QPixmap("phono/background.jpg").scaled
(this->size
());pa
.setBrush
(this->backgroundRole
(),QBrush(pix
));this->setPalette
(pa
);}data_storeroom
::~data_storeroom()
{delete ui
;
}void data_storeroom
::save_setting
()
{int a
;QString A
;a
=setting
.value
("sum").toInt
();A
=QString
::number
(a
);ui
->lineEdit_sum
->setText
(A
);sum
=ui
->lineEdit_sum
->text
().toInt
();}void data_storeroom
::up_data
()
{int i
;QSqlQuery query
;qryModel
=new QSqlQueryModel(this);theSelection
=new QItemSelectionModel(qryModel
);qryModel
->setQuery
("select time,lighting,weather,temperature from light order by time desc");if(qryModel
->lastError
().isValid()){QMessageBox
::information
(this,"錯誤","數據表格查詢失敗\n"+qryModel
->lastError
().text
(),QMessageBox
::Ok
,QMessageBox
::NoButton
);qDebug()<<db
.lastError
();}qryModel
->setHeaderData
(0,Qt
::Horizontal
,QObject
::tr
("時間"));qryModel
->setHeaderData
(1,Qt
::Horizontal
,QObject
::tr
("光照強度"));qryModel
->setHeaderData
(2,Qt
::Horizontal
,QObject
::tr
("天氣情況"));qryModel
->setHeaderData
(3,Qt
::Horizontal
,QObject
::tr
("溫度/℃"));ui
->tableView
->setModel
(qryModel
);ui
->tableView
->setSelectionModel
(theSelection
);ui
->tableView
->setAlternatingRowColors
(true);ui
->tableView
->setColumnWidth
(0,150);ui
->tableView
->setColumnWidth
(1,80);ui
->tableView
->setColumnWidth
(2,80);ui
->tableView
->setColumnWidth
(3,100);i
=qryModel
->rowCount
();QString n
,m
;m
="條(滿數%1)";m
=m
.arg
(sum
);n
=QString
::number
(i
);ui
->label_number
->setText
(n
+m
);}void data_storeroom
::detection_data
()
{int i
;QSqlQuery query
;i
=qryModel
->rowCount
();if(i
>sum
){qDebug()<<"數據已到上限執行清除命令";QMessageBox
::information
(this,"提示","數據已經達到上限執行數據清除");bool ok_1
;query
.prepare
("delete from light");ok_1
=query
.exec
();if(!ok_1
){qDebug()<<"數據已滿執行清空數據失敗";}else{up_data();qDebug()<<"數據已滿執行清空數據成功";}}}void data_storeroom
::on_pushButton_clear_clicked()
{bool ok_1
;QSqlQuery query
;query
.prepare
("delete from light");ok_1
=query
.exec
();if(!ok_1
){qDebug()<<"數據已滿執行清空數據失敗";}else{up_data();qDebug()<<"數據已滿執行清空數據成功";}
}void data_storeroom
::on_pushButton_setting_clicked()
{if(ui
->pushButton_setting
->text
()=="更改設置"){ui
->lineEdit_sum
->setEnabled
(true);ui
->pushButton_setting
->setText
("確認更改");}else{sum
=ui
->lineEdit_sum
->text
().toInt
();setting
.setValue
("sum",sum
);QMessageBox
::information
(this,"提示","更改成功");ui
->lineEdit_sum
->setEnabled
(false);up_data
();ui
->pushButton_setting
->setText
("更改設置");}
}void data_storeroom
::on_pushButton_back02_clicked()
{this->close
();
}
界面效果:
四、天氣情況顯示
上位機通過聯網獲取網站,在網站上獲取天氣預報信息,并解析反饋到上位機,實時更新,方便快捷地了解到當地當時的天氣,作為路燈輔助控制手段之一。
天氣顯示,主要是通過聯網獲取天氣網站的天氣數據來實現的,難點是在如何解析獲取的網絡語言
JSON,各位可以去搜一下,下面附上代碼:
void Widget
::receive_weather
()
{if(!ui
->lineEdit_city
->text
().isEmpty
()){QString local_country
=ui
->lineEdit_city
->text
();char quest_array
[256]="http://wthrcdn.etouch.cn/weather_mini?city=";QNetworkRequest quest
;sprintf
(quest_array
,"%s%s",quest_array
,local_country
.toUtf8
().data
());quest
.setUrl
(QUrl(quest_array
));quest
.setHeader
(QNetworkRequest
::UserAgentHeader
,"RT-Thread ART");manager
->get
(quest
);QObject
::connect
(manager
,SIGNAL
(finished(QNetworkReply
*)),this,SLOT
(getting_weather
(QNetworkReply
*)));}else{QMessageBox
::warning
(this,"錯誤","請輸入查詢的城市");}
}void Widget
::judge_weather
()
{if(weather
=="陰"){ui
->label_weather_map
->setPixmap
(QPixmap("phono/small_picture/weather/weather_clouds.png"));ui
->label_weather_map
->setScaledContents
(true);}if(weather
=="多云"){ui
->label_weather_map
->setPixmap
(QPixmap("phono/small_picture/weather/weather_cloudy.png"));ui
->label_weather_map
->setScaledContents
(true);}if(weather
=="晴"){ui
->label_weather_map
->setPixmap
(QPixmap("phono/small_picture/weather/weather_sun.png"));ui
->label_weather_map
->setScaledContents
(true);}if(weather
=="小雨"){ui
->label_weather_map
->setPixmap
(QPixmap("phono/small_picture/weather/weather_rain_little.png"));ui
->label_weather_map
->setScaledContents
(true);}if(weather
=="中雨"){ui
->label_weather_map
->setPixmap
(QPixmap("phono/small_picture/weather/weather_rain.png"));ui
->label_weather_map
->setScaledContents
(true);}if(weather
=="大雨"){ui
->label_weather_map
->setPixmap
(QPixmap("phono/small_picture/weather/weather_rain.png"));ui
->label_weather_map
->setScaledContents
(true);}if(weather
=="陣雨"){ui
->label_weather_map
->setPixmap
(QPixmap("phono/small_picture/weather/weather_rain.png"));ui
->label_weather_map
->setScaledContents
(true);}}
void Widget
::getting_weather
(QNetworkReply
*reply
)
{qDebug()<<"數據接收到!!!";QString data
=reply
->readAll
();qDebug()<<data
;QJsonParseError err
;QJsonDocument json
=QJsonDocument
::fromJson
(data
.toUtf8
(),&err
);qDebug()<<err
.error
;if(!json
.isNull
()){QJsonObject object
=json
.object
();if(object
.contains
("data")){QJsonValue value
=object
.value
("data");if(value
.isObject
()){QJsonObject object_data
=value
.toObject
();if(object_data
.contains
("forecast")){QJsonValue values
=object_data
.value
("forecast");if(values
.isArray
()){QJsonObject today_weather
=values
.toArray
().at
(0).toObject
();weather
=today_weather
.value
("type").toString
();QString low
=today_weather
.value
("low").toString
();QString high
=today_weather
.value
("high").toString
();temperature
=low
.mid
(low
.length
()-3,4)+"~"+high
.mid
(high
.length
()-3,4);ui
->label_weather
->setText
(weather
);ui
->label_temperature_value
->setText
(temperature
);judge_weather
();}}}}}else{qDebug()<<"沒有接受到數據";}reply
->deleteLater
();
}
出了這些外,你還需要一些圖標才行,我在下面的代碼包中,提供有,本系統會用的圖標。
效果圖如下:
他能在聯網的情況下獲取各大市級城市的天氣情況。輸入自己查詢的地區名,點擊確認即可。
五、光照強度曲線圖
ZigBee控制光敏傳感器實時采集光照強度,然后將所采集到的數據反饋進入上位機,形成曲線圖,直觀地了解路況光照信息,并存入數據庫,為優化路燈收集事實基礎。
這個部分還是在我以前的博文中提到過,我就不贅述了,直接上代碼:
void Widget
::createChart()
{maxsize
=31;max_x
=300;max_y
=150;splineSeries
->setColor
(Qt
::red
);splineSeries_2
->setColor
(Qt
::blue
);QChart
*chart
=new QChart();chart
->addSeries
(splineSeries
);chart
->addSeries
(splineSeries_2
);splineSeries
->setName
("燈1檢測到的光照強度");splineSeries_2
->setName
("燈2檢測的光照強度");chart
->legend
()->setVisible
(true);chart
->legend
()->setAlignment
(Qt
::AlignTop
);chart
->setTitle
("數據動態曲線");chart
->createDefaultAxes
();chart
->axisX
()->setRange
(0,max_x
);chart
->axisY
()->setRange
(0,max_y
);chart
->axisX
()->setTitleText
("時間X軸單位/0.1s))");chart
->axisY
()->setTitleText
("光照強度");ui
->ChartView
->setChart
(chart
);ui
->ChartView
->setRenderHint
(QPainter
::Antialiasing
);}void Widget
::receiveChart
(int light
, int light_2
)
{list
<<light
;list_2
<<light_2
;while (list
.size
()>maxsize
&&list_2
.size
()>maxsize
){list
.removeFirst
();list_2
.removeFirst
();}if(isVisible
()){splineSeries
->clear
();splineSeries_2
->clear();for(int p
=0;p
<list
.size
();p
++){splineSeries
->append
(10+p
*10,list
.at
(p
));splineSeries_2
->append
(10+p
*10,list_2
.at
(p
));}}}
現在附上整體界面設計圖(說實話,我也覺得丑,原諒我只是個工科生。。。。)
好了,主要的部分我已經發出來了,如果需要詳細了解的話,就請下載下方的鏈接文件:
智能路燈Qt操作界面代碼
總結
以上是生活随笔為你收集整理的基于Zigbee的智能路灯控制系统的Qt操作界面的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。