[{"data":1,"prerenderedAt":1099},["ShallowReactive",2],{"blog-en-/en/blog/embedded-linux-hmi-development-yocto-qt":3},{"id":4,"title":5,"body":6,"description":1085,"extension":1086,"meta":1087,"navigation":241,"path":1095,"seo":1096,"stem":1097,"__hash__":1098},"en_blog/en/blog/embedded-linux-hmi-development-yocto-qt.md","Embedded Linux HMI Development: Custom Interface Design with Yocto and Qt",{"type":7,"value":8,"toc":1061},"minimark",[9,14,45,53,57,62,67,80,85,96,101,112,116,155,159,163,170,190,194,205,209,366,370,374,462,468,472,480,485,873,877,881,887,891,897,901,913,945,950,1005,1009,1019,1031,1035,1057],[10,11,13],"h2",{"id":12},"introduction","Introduction",[15,16,17,18,22,23,26,27,30,31,36,37,40,41,44],"p",{},"The dominance of ",[19,20,21],"strong",{},"Windows CE"," and ",[19,24,25],{},"proprietary"," solutions in industrial HMI systems has been rapidly shifting towards ",[19,28,29],{},"Embedded Linux"," in recent years. Our ",[32,33,35],"a",{"href":34},"/en/solutions/hmi-industrial-display-solutions","HMI Industrial Display Solutions"," are at the center of this paradigm shift: customized Linux distribution with ",[19,38,39],{},"Yocto Project"," and modern interface development with ",[19,42,43],{},"Qt/QML",".",[15,46,47,48,52],{},"In this article, we examine how to build an embedded Linux HMI from scratch, Qt integration on the ",[32,49,51],{"href":50},"/en/blog/embedded-linux-with-yocto","Yocto infrastructure we explained in our blog",", and real-world applications.",[10,54,56],{"id":55},"why-embedded-linux-qt","Why Embedded Linux + Qt?",[58,59,61],"h3",{"id":60},"limitations-of-traditional-hmi-solutions","Limitations of Traditional HMI Solutions",[15,63,64],{},[19,65,66],{},"1. Windows CE / Windows Embedded",[68,69,70,74,77],"ul",{},[71,72,73],"li",{},"License costs ($100+ per device)",[71,75,76],{},"Security updates ended (Windows CE EOL in 2018)",[71,78,79],{},"High hardware requirements (minimum 512MB RAM)",[15,81,82],{},[19,83,84],{},"2. Proprietary Solutions (Siemens WinCC, Rockwell FactoryTalk)",[68,86,87,90,93],{},[71,88,89],{},"Vendor lock-in",[71,91,92],{},"Limited customization options",[71,94,95],{},"High software costs",[15,97,98],{},[19,99,100],{},"3. Arduino/MCU-based Simple Displays",[68,102,103,106,109],{},[71,104,105],{},"Low graphics performance",[71,107,108],{},"Limited networking (weak TCP/IP stack)",[71,110,111],{},"Insufficient for complex applications",[58,113,115],{"id":114},"advantages-of-embedded-linux-qt","Advantages of Embedded Linux + Qt",[15,117,118,119,122,123,126,127,130,131,126,133,136,137,126,139,142,143,126,145,148,149,126,151,154],{},"✅ ",[19,120,121],{},"Open Source & Free",": No license costs",[124,125],"br",{},"\n✅ ",[19,128,129],{},"Full Control",": Customize every layer of OS",[124,132],{},[19,134,135],{},"Powerful Graphics",": Hardware-accelerated UI with Qt Quick (QML)",[124,138],{},[19,140,141],{},"Networking",": Native TCP/IP, MQTT, Modbus support",[124,144],{},[19,146,147],{},"OTA Updates",": Secure software updates with A/B partition",[124,150],{},[19,152,153],{},"Long Lifespan",": Linux kernel and Qt, 10+ years support guarantee",[10,156,158],{"id":157},"yocto-project-custom-linux-image","Yocto Project: Custom Linux Image",[58,160,162],{"id":161},"what-is-yocto","What is Yocto?",[15,164,165,166,169],{},"Yocto Project is a build system for creating ",[19,167,168],{},"customized Linux distributions"," for embedded devices. Difference from standard Ubuntu/Debian:",[68,171,172,178,184],{},[71,173,174,177],{},[19,175,176],{},"Minimal footprint",": Only needed packages included (~50MB rootfs)",[71,179,180,183],{},[19,181,182],{},"Cross-compilation",": Compile for ARM processors on development PC (x86)",[71,185,186,189],{},[19,187,188],{},"Reproducible builds",": Every build produces same result",[58,191,193],{"id":192},"yocto-layer-structure-for-hmi","Yocto Layer Structure for HMI",[195,196,201],"pre",{"className":197,"code":199,"language":200},[198],"language-text","meta-hmi-amazeng/\n├── recipes-core/\n│   └── images/\n│       └── hmi-image.bb          # Main image recipe\n├── recipes-graphics/\n│   └── qt5/\n│       └── qtbase_%.bbappend     # Qt customizations\n├── recipes-connectivity/\n│   └── modbus/\n│       └── libmodbus_git.bb      # Modbus library\n├── recipes-kernel/\n│   └── linux/\n│       └── linux-%.bbappend      # Touchscreen drivers\n└── recipes-app/\n    └── hmi-app/\n        └── hmi-app_git.bb        # HMI application\n","text",[202,203,199],"code",{"__ignoreMap":204},"",[58,206,208],{"id":207},"example-hmi-image-recipe","Example HMI Image Recipe",[195,210,214],{"className":211,"code":212,"language":213,"meta":204,"style":204},"language-bitbake shiki shiki-themes github-light github-dark","# hmi-image.bb\nDESCRIPTION = \"Amazeng HMI Linux Image\"\nLICENSE = \"MIT\"\n\nIMAGE_FEATURES += \" \\\n    splash \\\n    ssh-server-dropbear \\\n    hwcodecs \\\n\"\n\nIMAGE_INSTALL = \" \\\n    packagegroup-core-boot \\\n    qtbase \\\n    qtdeclarative \\\n    qtquickcontrols2 \\\n    qtgraphicaleffects \\\n    qtsvg \\\n    qtwebsockets \\\n    libmodbus \\\n    hmi-app \\\n    ca-certificates \\\n    tzdata \\\n\"\n\ninherit core-image\n","bitbake",[202,215,216,224,230,236,243,249,255,261,267,273,278,284,290,296,302,308,314,320,326,332,338,344,350,355,360],{"__ignoreMap":204},[217,218,221],"span",{"class":219,"line":220},"line",1,[217,222,223],{},"# hmi-image.bb\n",[217,225,227],{"class":219,"line":226},2,[217,228,229],{},"DESCRIPTION = \"Amazeng HMI Linux Image\"\n",[217,231,233],{"class":219,"line":232},3,[217,234,235],{},"LICENSE = \"MIT\"\n",[217,237,239],{"class":219,"line":238},4,[217,240,242],{"emptyLinePlaceholder":241},true,"\n",[217,244,246],{"class":219,"line":245},5,[217,247,248],{},"IMAGE_FEATURES += \" \\\n",[217,250,252],{"class":219,"line":251},6,[217,253,254],{},"    splash \\\n",[217,256,258],{"class":219,"line":257},7,[217,259,260],{},"    ssh-server-dropbear \\\n",[217,262,264],{"class":219,"line":263},8,[217,265,266],{},"    hwcodecs \\\n",[217,268,270],{"class":219,"line":269},9,[217,271,272],{},"\"\n",[217,274,276],{"class":219,"line":275},10,[217,277,242],{"emptyLinePlaceholder":241},[217,279,281],{"class":219,"line":280},11,[217,282,283],{},"IMAGE_INSTALL = \" \\\n",[217,285,287],{"class":219,"line":286},12,[217,288,289],{},"    packagegroup-core-boot \\\n",[217,291,293],{"class":219,"line":292},13,[217,294,295],{},"    qtbase \\\n",[217,297,299],{"class":219,"line":298},14,[217,300,301],{},"    qtdeclarative \\\n",[217,303,305],{"class":219,"line":304},15,[217,306,307],{},"    qtquickcontrols2 \\\n",[217,309,311],{"class":219,"line":310},16,[217,312,313],{},"    qtgraphicaleffects \\\n",[217,315,317],{"class":219,"line":316},17,[217,318,319],{},"    qtsvg \\\n",[217,321,323],{"class":219,"line":322},18,[217,324,325],{},"    qtwebsockets \\\n",[217,327,329],{"class":219,"line":328},19,[217,330,331],{},"    libmodbus \\\n",[217,333,335],{"class":219,"line":334},20,[217,336,337],{},"    hmi-app \\\n",[217,339,341],{"class":219,"line":340},21,[217,342,343],{},"    ca-certificates \\\n",[217,345,347],{"class":219,"line":346},22,[217,348,349],{},"    tzdata \\\n",[217,351,353],{"class":219,"line":352},23,[217,354,272],{},[217,356,358],{"class":219,"line":357},24,[217,359,242],{"emptyLinePlaceholder":241},[217,361,363],{"class":219,"line":362},25,[217,364,365],{},"inherit core-image\n",[10,367,369],{"id":368},"modern-hmi-interface-with-qtqml","Modern HMI Interface with Qt/QML",[58,371,373],{"id":372},"qt-quick-qml-vs-qt-widgets","Qt Quick (QML) vs Qt Widgets",[375,376,377,393],"table",{},[378,379,380],"thead",{},[381,382,383,387,390],"tr",{},[384,385,386],"th",{},"Feature",[384,388,389],{},"Qt Widgets (C++)",[384,391,392],{},"Qt Quick (QML)",[394,395,396,410,423,436,449],"tbody",{},[381,397,398,404,407],{},[399,400,401],"td",{},[19,402,403],{},"Performance",[399,405,406],{},"CPU-based",[399,408,409],{},"GPU-accelerated",[381,411,412,417,420],{},[399,413,414],{},[19,415,416],{},"Development Speed",[399,418,419],{},"Slow (compile)",[399,421,422],{},"Fast (interpreted)",[381,424,425,430,433],{},[399,426,427],{},[19,428,429],{},"Animation",[399,431,432],{},"Complex",[399,434,435],{},"Very easy",[381,437,438,443,446],{},[399,439,440],{},[19,441,442],{},"Touchscreen",[399,444,445],{},"Mouse events",[399,447,448],{},"Native touch",[381,450,451,456,459],{},[399,452,453],{},[19,454,455],{},"Designer Support",[399,457,458],{},"Qt Designer",[399,460,461],{},"Qt Design Studio",[15,463,464,467],{},[19,465,466],{},"Qt Quick (QML) should definitely be preferred"," for HMI applications.",[58,469,471],{"id":470},"simple-hmi-application-loadcell-reader","Simple HMI Application: Loadcell Reader",[15,473,474,475,479],{},"HMI reading weight from ",[32,476,478],{"href":477},"/en/products/gdt-digital-transmitter","GDT Digital Transmitter"," via Modbus TCP:",[15,481,482],{},[19,483,484],{},"main.qml",[195,486,490],{"className":487,"code":488,"language":489,"meta":204,"style":204},"language-qml shiki shiki-themes github-light github-dark","import QtQuick 2.15\nimport QtQuick.Controls 2.15\nimport QtQuick.Layouts 1.15\n\nApplicationWindow {\n    visible: true\n    width: 1024\n    height: 600\n    title: \"GDT Loadcell Monitor\"\n\n    // Background gradient\n    Rectangle {\n        anchors.fill: parent\n        gradient: Gradient {\n            GradientStop { position: 0.0; color: \"#2C3E50\" }\n            GradientStop { position: 1.0; color: \"#34495E\" }\n        }\n    }\n\n    ColumnLayout {\n        anchors.centerIn: parent\n        spacing: 30\n\n        // Title\n        Text {\n            text: \"Tank 1 - Net Weight\"\n            font.pixelSize: 36\n            font.bold: true\n            color: \"#ECF0F1\"\n            Layout.alignment: Qt.AlignHCenter\n        }\n\n        // Weight display\n        Rectangle {\n            width: 600\n            height: 200\n            color: \"#1ABC9C\"\n            radius: 20\n\n            Text {\n                anchors.centerIn: parent\n                text: modbusBackend.weight.toFixed(2) + \" kg\"\n                font.pixelSize: 72\n                font.bold: true\n                color: \"white\"\n            }\n        }\n\n        // Control buttons\n        RowLayout {\n            Layout.alignment: Qt.AlignHCenter\n            spacing: 20\n\n            Button {\n                text: \"TARE\"\n                font.pixelSize: 24\n                implicitWidth: 150\n                implicitHeight: 80\n                onClicked: modbusBackend.tare()\n            }\n\n            Button {\n                text: \"ZERO\"\n                font.pixelSize: 24\n                implicitWidth: 150\n                implicitHeight: 80\n                onClicked: modbusBackend.zero()\n            }\n        }\n    }\n}\n","qml",[202,491,492,497,502,507,511,516,521,526,531,536,540,545,550,555,560,565,570,575,580,584,589,594,599,603,608,613,619,625,631,637,643,648,653,659,665,671,677,683,689,694,700,706,712,718,724,730,736,741,746,752,758,763,769,774,780,786,792,798,804,810,815,820,825,831,836,841,846,852,857,862,867],{"__ignoreMap":204},[217,493,494],{"class":219,"line":220},[217,495,496],{},"import QtQuick 2.15\n",[217,498,499],{"class":219,"line":226},[217,500,501],{},"import QtQuick.Controls 2.15\n",[217,503,504],{"class":219,"line":232},[217,505,506],{},"import QtQuick.Layouts 1.15\n",[217,508,509],{"class":219,"line":238},[217,510,242],{"emptyLinePlaceholder":241},[217,512,513],{"class":219,"line":245},[217,514,515],{},"ApplicationWindow {\n",[217,517,518],{"class":219,"line":251},[217,519,520],{},"    visible: true\n",[217,522,523],{"class":219,"line":257},[217,524,525],{},"    width: 1024\n",[217,527,528],{"class":219,"line":263},[217,529,530],{},"    height: 600\n",[217,532,533],{"class":219,"line":269},[217,534,535],{},"    title: \"GDT Loadcell Monitor\"\n",[217,537,538],{"class":219,"line":275},[217,539,242],{"emptyLinePlaceholder":241},[217,541,542],{"class":219,"line":280},[217,543,544],{},"    // Background gradient\n",[217,546,547],{"class":219,"line":286},[217,548,549],{},"    Rectangle {\n",[217,551,552],{"class":219,"line":292},[217,553,554],{},"        anchors.fill: parent\n",[217,556,557],{"class":219,"line":298},[217,558,559],{},"        gradient: Gradient {\n",[217,561,562],{"class":219,"line":304},[217,563,564],{},"            GradientStop { position: 0.0; color: \"#2C3E50\" }\n",[217,566,567],{"class":219,"line":310},[217,568,569],{},"            GradientStop { position: 1.0; color: \"#34495E\" }\n",[217,571,572],{"class":219,"line":316},[217,573,574],{},"        }\n",[217,576,577],{"class":219,"line":322},[217,578,579],{},"    }\n",[217,581,582],{"class":219,"line":328},[217,583,242],{"emptyLinePlaceholder":241},[217,585,586],{"class":219,"line":334},[217,587,588],{},"    ColumnLayout {\n",[217,590,591],{"class":219,"line":340},[217,592,593],{},"        anchors.centerIn: parent\n",[217,595,596],{"class":219,"line":346},[217,597,598],{},"        spacing: 30\n",[217,600,601],{"class":219,"line":352},[217,602,242],{"emptyLinePlaceholder":241},[217,604,605],{"class":219,"line":357},[217,606,607],{},"        // Title\n",[217,609,610],{"class":219,"line":362},[217,611,612],{},"        Text {\n",[217,614,616],{"class":219,"line":615},26,[217,617,618],{},"            text: \"Tank 1 - Net Weight\"\n",[217,620,622],{"class":219,"line":621},27,[217,623,624],{},"            font.pixelSize: 36\n",[217,626,628],{"class":219,"line":627},28,[217,629,630],{},"            font.bold: true\n",[217,632,634],{"class":219,"line":633},29,[217,635,636],{},"            color: \"#ECF0F1\"\n",[217,638,640],{"class":219,"line":639},30,[217,641,642],{},"            Layout.alignment: Qt.AlignHCenter\n",[217,644,646],{"class":219,"line":645},31,[217,647,574],{},[217,649,651],{"class":219,"line":650},32,[217,652,242],{"emptyLinePlaceholder":241},[217,654,656],{"class":219,"line":655},33,[217,657,658],{},"        // Weight display\n",[217,660,662],{"class":219,"line":661},34,[217,663,664],{},"        Rectangle {\n",[217,666,668],{"class":219,"line":667},35,[217,669,670],{},"            width: 600\n",[217,672,674],{"class":219,"line":673},36,[217,675,676],{},"            height: 200\n",[217,678,680],{"class":219,"line":679},37,[217,681,682],{},"            color: \"#1ABC9C\"\n",[217,684,686],{"class":219,"line":685},38,[217,687,688],{},"            radius: 20\n",[217,690,692],{"class":219,"line":691},39,[217,693,242],{"emptyLinePlaceholder":241},[217,695,697],{"class":219,"line":696},40,[217,698,699],{},"            Text {\n",[217,701,703],{"class":219,"line":702},41,[217,704,705],{},"                anchors.centerIn: parent\n",[217,707,709],{"class":219,"line":708},42,[217,710,711],{},"                text: modbusBackend.weight.toFixed(2) + \" kg\"\n",[217,713,715],{"class":219,"line":714},43,[217,716,717],{},"                font.pixelSize: 72\n",[217,719,721],{"class":219,"line":720},44,[217,722,723],{},"                font.bold: true\n",[217,725,727],{"class":219,"line":726},45,[217,728,729],{},"                color: \"white\"\n",[217,731,733],{"class":219,"line":732},46,[217,734,735],{},"            }\n",[217,737,739],{"class":219,"line":738},47,[217,740,574],{},[217,742,744],{"class":219,"line":743},48,[217,745,242],{"emptyLinePlaceholder":241},[217,747,749],{"class":219,"line":748},49,[217,750,751],{},"        // Control buttons\n",[217,753,755],{"class":219,"line":754},50,[217,756,757],{},"        RowLayout {\n",[217,759,761],{"class":219,"line":760},51,[217,762,642],{},[217,764,766],{"class":219,"line":765},52,[217,767,768],{},"            spacing: 20\n",[217,770,772],{"class":219,"line":771},53,[217,773,242],{"emptyLinePlaceholder":241},[217,775,777],{"class":219,"line":776},54,[217,778,779],{},"            Button {\n",[217,781,783],{"class":219,"line":782},55,[217,784,785],{},"                text: \"TARE\"\n",[217,787,789],{"class":219,"line":788},56,[217,790,791],{},"                font.pixelSize: 24\n",[217,793,795],{"class":219,"line":794},57,[217,796,797],{},"                implicitWidth: 150\n",[217,799,801],{"class":219,"line":800},58,[217,802,803],{},"                implicitHeight: 80\n",[217,805,807],{"class":219,"line":806},59,[217,808,809],{},"                onClicked: modbusBackend.tare()\n",[217,811,813],{"class":219,"line":812},60,[217,814,735],{},[217,816,818],{"class":219,"line":817},61,[217,819,242],{"emptyLinePlaceholder":241},[217,821,823],{"class":219,"line":822},62,[217,824,779],{},[217,826,828],{"class":219,"line":827},63,[217,829,830],{},"                text: \"ZERO\"\n",[217,832,834],{"class":219,"line":833},64,[217,835,791],{},[217,837,839],{"class":219,"line":838},65,[217,840,797],{},[217,842,844],{"class":219,"line":843},66,[217,845,803],{},[217,847,849],{"class":219,"line":848},67,[217,850,851],{},"                onClicked: modbusBackend.zero()\n",[217,853,855],{"class":219,"line":854},68,[217,856,735],{},[217,858,860],{"class":219,"line":859},69,[217,861,574],{},[217,863,865],{"class":219,"line":864},70,[217,866,579],{},[217,868,870],{"class":219,"line":869},71,[217,871,872],{},"}\n",[10,874,876],{"id":875},"real-world-application-multi-tank-monitoring","Real World Application: Multi-Tank Monitoring",[58,878,880],{"id":879},"scenario","Scenario",[15,882,883,884,886],{},"3 milk tanks, each with ",[32,885,478],{"href":477}," + 4 loadcells. Monitoring all tanks with a central 10.1\" HMI.",[58,888,890],{"id":889},"architecture","Architecture",[195,892,895],{"className":893,"code":894,"language":200},[198],"┌──────────────┐    Modbus TCP     ┌──────────────┐\n│  Tank 1 GDT  │◄─────────────────►│              │\n│ 192.168.1.101│                   │              │\n└──────────────┘                   │   HMI Panel  │\n                                   │  (10.1 inch) │\n┌──────────────┐    Modbus TCP     │   Qt/QML     │\n│  Tank 2 GDT  │◄─────────────────►│              │\n│ 192.168.1.102│                   │              │\n└──────────────┘                   └──────────────┘\n",[202,896,894],{"__ignoreMap":204},[10,898,900],{"id":899},"cloud-integration-hmi-aws-iot","Cloud Integration: HMI + AWS IoT",[15,902,903,904,907,908,912],{},"HMI panel can also work as an ",[19,905,906],{},"IoT gateway",". In our ",[32,909,911],{"href":910},"/en/solutions/cloud-iot-data-collection","Cloud & IoT Data Collection"," solution, HMI:",[914,915,916,930,936],"ol",{},[71,917,918,919,22,923,926,927],{},"Collects data from ",[32,920,922],{"href":921},"/en/products/zma-data-acquisition","ZMA",[32,924,925],{"href":477},"GDT"," devices via ",[19,928,929],{},"Modbus RTU/TCP",[71,931,932,933],{},"Sends to AWS IoT Core via ",[19,934,935],{},"MQTT",[71,937,938,939,22,942],{},"Displays both on ",[19,940,941],{},"local interface",[19,943,944],{},"Grafana dashboard",[15,946,947],{},[19,948,949],{},"Qt MQTT Client Example:",[195,951,955],{"className":952,"code":953,"language":954,"meta":204,"style":204},"language-cpp shiki shiki-themes github-light github-dark","#include \u003CQtMqtt/QMqttClient>\n\nQMqttClient *mqttClient = new QMqttClient(this);\nmqttClient->setHostname(\"xxxxx.iot.eu-west-1.amazonaws.com\");\nmqttClient->setPort(8883);\nmqttClient->connectToHost();\n\n// Publish data read from GDT\nQByteArray payload = QString(\"{\\\"tank_id\\\":1,\\\"weight\\\":%1}\").arg(weight).toUtf8();\nmqttClient->publish(\"amazeng/tank/data\", payload);\n","cpp",[202,956,957,962,966,971,976,981,986,990,995,1000],{"__ignoreMap":204},[217,958,959],{"class":219,"line":220},[217,960,961],{},"#include \u003CQtMqtt/QMqttClient>\n",[217,963,964],{"class":219,"line":226},[217,965,242],{"emptyLinePlaceholder":241},[217,967,968],{"class":219,"line":232},[217,969,970],{},"QMqttClient *mqttClient = new QMqttClient(this);\n",[217,972,973],{"class":219,"line":238},[217,974,975],{},"mqttClient->setHostname(\"xxxxx.iot.eu-west-1.amazonaws.com\");\n",[217,977,978],{"class":219,"line":245},[217,979,980],{},"mqttClient->setPort(8883);\n",[217,982,983],{"class":219,"line":251},[217,984,985],{},"mqttClient->connectToHost();\n",[217,987,988],{"class":219,"line":257},[217,989,242],{"emptyLinePlaceholder":241},[217,991,992],{"class":219,"line":263},[217,993,994],{},"// Publish data read from GDT\n",[217,996,997],{"class":219,"line":269},[217,998,999],{},"QByteArray payload = QString(\"{\\\"tank_id\\\":1,\\\"weight\\\":%1}\").arg(weight).toUtf8();\n",[217,1001,1002],{"class":219,"line":275},[217,1003,1004],{},"mqttClient->publish(\"amazeng/tank/data\", payload);\n",[10,1006,1008],{"id":1007},"conclusion","Conclusion",[15,1010,1011,1012,1015,1016,1018],{},"The Embedded Linux + Qt combination is the ",[19,1013,1014],{},"most flexible and powerful solution"," for modern industrial HMIs. Our ",[32,1017,35],{"href":34}," are built on this technology stack and:",[15,1020,1021,1022,1024,1025,1027,1028,1030],{},"✅ 70% more economical than proprietary solutions",[124,1023],{},"\n✅ Full customization freedom",[124,1026],{},"\n✅ 10+ years long-term support guarantee",[124,1029],{},"\n✅ Ready for Cloud and IoT integration",[58,1032,1034],{"id":1033},"related-resources","Related Resources",[68,1036,1037,1042,1049,1053],{},[71,1038,1039],{},[32,1040,1041],{"href":50},"Embedded Linux with Yocto",[71,1043,1044,1048],{},[32,1045,1047],{"href":1046},"/en/blog/why-we-use-zephyr-rtos","Why We Use Zephyr RTOS"," (alternative RTOS approach)",[71,1050,1051],{},[32,1052,35],{"href":34},[71,1054,1055],{},[32,1056,911],{"href":910},[1058,1059,1060],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":204,"searchDepth":226,"depth":226,"links":1062},[1063,1064,1068,1073,1077,1081,1082],{"id":12,"depth":226,"text":13},{"id":55,"depth":226,"text":56,"children":1065},[1066,1067],{"id":60,"depth":232,"text":61},{"id":114,"depth":232,"text":115},{"id":157,"depth":226,"text":158,"children":1069},[1070,1071,1072],{"id":161,"depth":232,"text":162},{"id":192,"depth":232,"text":193},{"id":207,"depth":232,"text":208},{"id":368,"depth":226,"text":369,"children":1074},[1075,1076],{"id":372,"depth":232,"text":373},{"id":470,"depth":232,"text":471},{"id":875,"depth":226,"text":876,"children":1078},[1079,1080],{"id":879,"depth":232,"text":880},{"id":889,"depth":232,"text":890},{"id":899,"depth":226,"text":900},{"id":1007,"depth":226,"text":1008,"children":1083},[1084],{"id":1033,"depth":232,"text":1034},"Complete guide for developing customized industrial interfaces using Yocto Project and Qt/QML in Linux-based HMI systems.","md",{"date":1088,"author":1089,"readTime":275,"featured":241,"tags":1090},"2025-12-29","Amazeng Technical Team",[29,1091,39,1092,1093,1094,442],"HMI","Qt","QML","Industrial UI","/en/blog/embedded-linux-hmi-development-yocto-qt",{"title":5,"description":1085},"en/blog/embedded-linux-hmi-development-yocto-qt","7macDMOyCxSm_uvH78y_GFJh8oXP_IS5k1_2sx_ttM8",1778229658203]