3:Ubuntu上配置QT交叉编译环境并编译QT程序到Jetson Orin Nano(ARM)

news2024/9/20 16:26:04

1.Ubuntu Qt 配置交叉编译环境

1.1 ubuntu 20.04安装Qt

sudo apt-get install qtcreator

1.2 配置QT

 

 GCC配置同上

 

最后配置Kits

上面设置完成之后 ,设置Kits 中的Device(这是为了能够直接把项目部署到arm设备上)

 

 

 点击NEXT之后会出现连接被拒绝,不用担心 ,下面会对其设置密码。

验证arm设置的密码。

 

 

 

 1.3 创建Qt项目

 

 

 

 

 

代码:

此代码是抄的别人的,具体是哪位博主的,忘记了。如果该博主看到了 请@下我,我会把连接附上

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

widget.cpp

#include "widget.h"
#include<QPainter>
#include<QTimer>
#include<QTime>
#include<QString>
#include<QVector>
#include<QMap>
#define CLOCK_RADIUS (80) //时钟的半径

#define PANEL_RADIUS_NUM (3) //表盘的3个圆

#define PANEL_RADIUS1 CLOCK_RADIUS //圆1的半径

#define PANEL_RADIUS2 (CLOCK_RADIUS - 6) //圆2的半径

#define PANEL_RADIUS3 (CLOCK_RADIUS - 8) //圆3的半径

#define HOUR_NUM_SIZE (10) //小时数字的字体大小

//3个表针的形状(三角形)

static QPoint hourHand[3] = {
    QPoint(5, 3),
    QPoint(-5, 3),
    QPoint(0, -30)
};

static QPoint minuteHand[3] = {
    QPoint(4, 6),
    QPoint(-4, 6),
    QPoint(0, -45)
};

static QPoint secondHand[3] = {
    QPoint(2, 10),
    QPoint(-2, 10),
    QPoint(0, -60)
};

//表针与刻度颜色

static QColor hourColor(255, 0, 0);

static QColor minuteColor(0, 0, 255);

static QColor secondColor(0, 255, 0);

//表盘参数

struct panelPara{
    int radius;
    QColor color;
};
//圆的半径与对于的颜色

static panelPara stPanelParaArr[] = {
   {PANEL_RADIUS1, QColor(255, 200, 100)},
   {PANEL_RADIUS2, QColor(164, 211, 238)},
   {PANEL_RADIUS3, QColor(255, 255, 255)},
};

Widget::Widget(QWidget *parent)
   : QWidget(parent)
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(1000);
    setWindowTitle(tr("Clock"));
    setMinimumSize(200, 200); //设置最小尺寸

}

Widget::~Widget()
{
}

void Widget::paintEvent(QPaintEvent *event)
{
    int side = qMin(width(), height());
    QTime time = QTime::currentTime();
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.translate(width()/2, height()/2); //画图的基准位置

    painter.scale(side/200.0, side/200.0); //随窗口尺寸自动缩放

    //表盘

    for (int i=0; i<PANEL_RADIUS_NUM; i++)
   {
        QBrush brush(stPanelParaArr[i].color);
        QPen pen(stPanelParaArr[i].color);
        painter.setBrush(brush);
        painter.setPen(pen);
        painter.drawEllipse(-stPanelParaArr[i].radius, -

stPanelParaArr[i].radius, 2*stPanelParaArr[i].radius, 

2*stPanelParaArr[i].radius);
   }
    //小时的表针

    painter.setPen(Qt::NoPen);
    painter.setBrush(hourColor);
    painter.save();
    painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
    painter.drawConvexPolygon(hourHand, 3);
    painter.restore();
    //小时的刻度

    painter.setPen(hourColor);
    for (int i = 0; i < 12; ++i)
{
        painter.rotate(30.0);
        painter.drawLine(PANEL_RADIUS3-6, 0, PANEL_RADIUS3, 0);
        QFont font("TimesNewRoman", HOUR_NUM_SIZE);
        painter.setFont(font);
        painter.drawText(-HOUR_NUM_SIZE, -(CLOCK_RADIUS-15), 2*HOUR_NUM_SIZE, 

2*HOUR_NUM_SIZE, Qt::AlignHCenter, QString::number(i+1));
   }
    //分钟的表针

    painter.setPen(Qt::NoPen);
    painter.setBrush(minuteColor);
    painter.save();
    painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
    painter.drawConvexPolygon(minuteHand, 3);
    painter.restore();
    painter.setPen(minuteColor);
    for (int j = 0; j < 60; ++j)
   {
        if ((j % 5) != 0)
       {
            painter.drawLine(PANEL_RADIUS3-4, 0, PANEL_RADIUS3, 0);
       }
        painter.rotate(6.0);
   }
    //秒钟的表针

    painter.setPen(Qt::NoPen);
    painter.setBrush(secondColor);
    painter.save();
    painter.rotate(6.0 * time.second());
    painter.drawConvexPolygon(secondHand, 3);
    painter.restore();
    painter.end();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>

class Widget : public QWidget

{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void paintEvent(QPaintEvent *event);
};

#endif // WIDGET_H

配置 clock.pro ,在pro文件添加下面代码。

#要部署的到ARM设备上的目录

target.path=/opt/arm #安装目标文件

INSTALLS+=target

先对项目进行编译,再把项目发布到 arm设备。

 上面项目部署之后,登陆arm设备进到对应的目录下查看代码。

 查看生成的文件 格式, 为arm aarch 64 正是arm 设备运行的文件 。

 

 执行命令运行程序,如下

nvidia@ubuntu:/opt/clock/bin$ ./clock

 

 

2.windows下使用visual studio或qt进行

arm linux程序开发环境搭建

2.1 创建项目

 

 

 

 

 

 widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#pragma execution_character_set("utf-8")

Widget::Widget(QWidget *parent) :
   QWidget(parent),
   ui(new Ui::Widget)
{
   ui->setupUi(this);
   connect(&timer, SIGNAL(timeout()), this, SLOT(timeout_slot()));
   connect(&timer, SIGNAL(timeout()), this, SLOT(update()));
   connect(ui->Btn_Reset, SIGNAL(clicked()), this, SLOT(update()));
   time.setHMS(0,0,0,0);
   ui->Txt_ShowTime->setText("00:00:00");
   ui->Btn_Start->setChecked(false);
   ui->Btn_Reset->setEnabled(false);
   ui->Btn_Hit->setEnabled(false);
}
Widget::~Widget()
{
   delete ui;
}
void Widget::timeout_slot()
{
   //qDebug("hello");
   QTime nowTime = QTime::currentTime();
   time = time.addMSecs(lastTime.msecsTo(nowTime));
   lastTime = nowTime;
   ui->Txt_ShowTime->setText(time.toString("mm:ss.zzz"));
}
void Widget::on_Btn_Start_toggled(bool checked)
{
    if (checked)
   {
       timer.start(ADD_TIME_MSEC);
       lastTime = QTime::currentTime();//记录时间戳

       ui->Btn_Start->setText("暂停");
       ui->Btn_Reset->setEnabled(false);
       ui->Btn_Hit->setEnabled(true);
   }
    else

   {
       timer.stop();
       ui->Btn_Start->setText("继续");
       ui->Btn_Reset->setEnabled(true);
       ui->Btn_Hit->setEnabled(false);
   }
}
void Widget::on_Btn_Reset_clicked()
{
   m_iHitCnt = 0;
   timer.stop();
   time.setHMS(0,0,0,0);
   ui->Txt_ShowTime->setText("00:00:00");
   ui->Txt_ShowItem->clear();
   ui->Btn_Start->setText("开始");
   ui->Btn_Start->setChecked(false);
   ui->Btn_Reset->setEnabled(false);
   ui->Btn_Hit->setEnabled(false);
}
void Widget::on_Btn_Hit_clicked()
{
   QString temp;
   m_iHitCnt++;
   temp.sprintf("--计次 %d--", m_iHitCnt);
   ui->Txt_ShowItem->setFontPointSize(9);
   ui->Txt_ShowItem->append(temp);
   ui->Txt_ShowItem->setFontPointSize(12);
   ui->Txt_ShowItem->append(time.toString("[mm:ss.zzz]"));
}
//------------------

#define CLOCK_RADIUS (90) //时钟的半径

#define PANEL_RADIUS_NUM (3) //表盘的3个圆

#define PANEL_RADIUS1 CLOCK_RADIUS //圆1的半径

#define PANEL_RADIUS2 (CLOCK_RADIUS - 6) //圆2的半径

#define PANEL_RADIUS3 (CLOCK_RADIUS - 8) //圆3的半径

#define PANEL_RADIUS4 (40) //内圆的半径

#define SEC_NUM_SIZE (10) //小时数字的字体大小

#define MIN_NUM_SIZE (7) //分钟数字的字体大小

//3个表针的形状(三角形)

static QPoint minuteHand[3] = {
QPoint(2, 6),
   QPoint(-2, 6),
   QPoint(0, -45)
};
static QPoint secondHand[3] = {
   QPoint(2, 8),
   QPoint(-2, 8),
   QPoint(0, -85)
};
//表针与刻度颜色

static QColor secondColor(0, 0, 255);
static QColor minuteColor(0, 0, 0);
//表盘参数

struct panelPara{
   int radius;
   QColor color;
};
//圆的半径与对于的颜色

static panelPara stPanelParaArr[] = {
   {PANEL_RADIUS1, QColor(255, 200, 100)},
   {PANEL_RADIUS2, QColor(164, 211, 238)},
   {PANEL_RADIUS3, QColor(255, 255, 255)},
};
void Widget::paintEvent(QPaintEvent *event)
{
   int side = qMin(width(), height());
   //QTime time = QTime::currentTime();
   QPainter painter(this);
   painter.setRenderHint(QPainter::Antialiasing);
   painter.translate(width()/3, height()*2/5); //画图的基准位置

   painter.scale(side/300.0, side/300.0); //随窗口尺寸自动缩放

   //表盘(3个同心圆)
    for (int i=0; i<PANEL_RADIUS_NUM; i++)
   {
       QBrush brush(stPanelParaArr[i].color);
       QPen pen(stPanelParaArr[i].color);
       painter.setBrush(brush);
       painter.setPen(pen);
       painter.drawEllipse(-stPanelParaArr[i].radius, -stPanelParaArr[i].radius, 

2*stPanelParaArr[i].radius, 2*stPanelParaArr[i].radius);
   }
   //秒的刻度

   painter.setPen(secondColor);
    for (int i = 0; i < 60; i++)
   {
        if ((i % 5) == 0)
       {
           painter.drawLine(PANEL_RADIUS3-8, 0, PANEL_RADIUS3, 0);
           QFont font("TimesNewRoman", SEC_NUM_SIZE);
           painter.setFont(font);
           painter.drawText(-SEC_NUM_SIZE, -(CLOCK_RADIUS-15), 2*SEC_NUM_SIZE, 

2*SEC_NUM_SIZE, Qt::AlignHCenter, QString::number(i==0? 60 : i));
}
        else

       {
           painter.drawLine(PANEL_RADIUS3-5, 0, PANEL_RADIUS3, 0);
       }
       //秒再细分5个格

        for (int j = 0; j < 5; j++)
       {
           painter.rotate(6.0/5);
            if (j != 4)
           {
               painter.drawLine(PANEL_RADIUS3-2, 0, PANEL_RADIUS3, 0);
           }
       }
   }
   //分钟的刻度

   painter.setPen(minuteColor);
    for (int k = 0; k < 30; k++)
   {
        if ((k % 5) == 0)
       {
           painter.rotate(-90.0);
           painter.drawLine(PANEL_RADIUS4-8, 0, PANEL_RADIUS4, 0);
           painter.rotate(90.0);
           QFont font("TimesNewRoman", MIN_NUM_SIZE);
           painter.setFont(font);
           painter.drawText(-MIN_NUM_SIZE, -(PANEL_RADIUS4-10), 2*MIN_NUM_SIZE, 

2*MIN_NUM_SIZE, Qt::AlignHCenter, QString::number(k==0? 30 : k));
       }
        else

       {
           painter.rotate(-90.0);
           painter.drawLine(PANEL_RADIUS4-4, 0, PANEL_RADIUS4, 0);
           painter.rotate(90.0);
       }
       painter.rotate(12.0);
   }
   //分钟的表针

   painter.setPen(Qt::NoPen);
   painter.setBrush(minuteColor);
   painter.save();
   painter.rotate(12.0 * (time.minute() + time.second() / 60.0));
   painter.drawConvexPolygon(minuteHand, 3);
   painter.restore();
   //秒钟的表针

   painter.setPen(Qt::NoPen);
   painter.setBrush(secondColor);
   painter.save();
   //painter.rotate(6.0 * time.second());
   painter.rotate(6.0 * (time.second()+time.msec()/1000.0));
   painter.drawConvexPolygon(secondHand, 3);
   painter.restore();
   painter.end();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTimer>
#include <QTime>
#include <QDebug>
#define ADD_TIME_MSEC 30

namespace Ui {
class Widget;
}
class Widget : public QWidget
{
   Q_OBJECT
public:
   explicit Widget(QWidget *parent = nullptr);
   ~Widget();
   void paintEvent(QPaintEvent *event);
   QTimer timer;
   QTime time;
   QTime lastTime;
private slots:
   void on_Btn_Start_toggled(bool checked);
   void timeout_slot();
   void on_Btn_Reset_clicked();
   void on_Btn_Hit_clicked();
private:
   Ui::Widget *ui;
   int m_iHitCnt = 0;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   Widget w;
   w.show();
   return a.exec();
}

 2.2 运行项目

 

 2.3把文件移动到Linux下

在win下编译通过之后,把文件 main.cpp timer.pro widget.cpp widget.h widget.ui 移动到

Linux 下

 用编译源码生成的 qmake(前面2. Linux Server 20.04 Qt5.14.2配置Jetson Orin Nano Developer Kit 交叉编译环境 生成的qmake) 进行对 timer.pro 文件进行编译

/opt/Qt5JetsonOrinNano/sysroot/usr/local/Qt5JetsonOrinNano/bin/qmake timer.pro

之后会生成 Makefile 文件

再执行 make 命令

 生成 .o 文件

 

 输入命令 file timer 查看生成的 timer 文件 类型

 把文件拷贝到 arm 设备

scp ./timer nvidia@192.168.20.230:/home/nvidia/Downloads/test/time

 

 

sudo vim /etc/profile

#加入下面5行代码 

export QT_DEBUG_PLUGINS=1

export QTDIR=/usr/local/Qt5JetsonOrinNano#编译的源码

export LD_LIBRARY_PATH=/usr/local/Qt5JetsonOrinNano/lib:$LD_LIBRARY_PATH

export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins

export QT_QPA_PLATFORM=xcb#编译源码时加入的显示模块 -xcb

sudo source /etc/profile

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/902778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IEC61499/ OPCUA pub/sub 测试

OpenDACS 是基于OPCUA 信息模型的IEC61499 分布式自动控制系统。本文介绍它如何采用Opcua Pub/Sub 实现分布式设备中功能块之间的通信。 4diac 构建IEC61499 系统和应用 系统结构 试验系统共有三台设备&#xff0c;为了实验方便&#xff0c;我们让它们在一台Linux PC 上运行…

智能文件改名,一键与上上级目录名称同步,让文件整理更加便捷

在整理文件时&#xff0c;经常会遇到需要将文件名称与上上级目录名称保持一致的情况。手动逐个修改文件名不仅费时费力&#xff0c;还容易出错。现在&#xff0c;我们为你带来了一款智能文件改名工具&#xff0c;让你能够一键将文件名称改成跟上上级目录名称一样&#xff0c;让…

Qt+C++跑马灯-指示灯-风扇-虚线灯带-动画仿真

程序示例精选 QtC跑马灯-指示灯-风扇-虚线灯带-动画仿真 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC跑马灯-指示灯-风扇-虚线灯带-动画仿真>>编写代码&#xff0c;代码整…

Vulnhub靶机系列 Infosec_Warrior1

InfoSecWarrior CTF 2020: 01官网地址 难易程度&#xff1a;So Easy 信息收集 主机发现 arp-scan -l端口扫描 nmap -A -p- 192.168.80.145目录爆破 dirsearch -u 192.168.80.145 -i 200访问80端口&#xff0c;只能看出是Apache站点&#xff0c;没有别的 访问一下sitemap.xm…

火山引擎ByteHouse:一套方案,让OLAP引擎在精准投放场景更高效

由于流量红利逐渐消退&#xff0c;越来越多的广告企业和从业者开始探索精细化营销的新路径&#xff0c;取代以往的全流量、粗放式的广告轰炸。精细化营销意味着要在数以亿计的人群中优选出那些最具潜力的目标受众&#xff0c;这无疑对提供基础引擎支持的数据仓库能力&#xff0…

开源ChatGPT系统源码 采用NUXT3+Laravel9后端开发 前后端分离版本

开源ChatGPT系统源码 采用NUXT3Laravel9后端开发 前后端分离版本 ChatGPT是一种基于AI的聊天机器人技术&#xff0c;它可以帮助用户与聊天机器人进行自然语言交流&#xff0c;以解决用户的问题或满足用户的需求。ChatGPT的核心技术是使用自然语言处理&#xff08;NLP&#xff…

设计模式之组合模式(Composite)的C++实现

1、组合模式的提出 在软件开发过程中&#xff0c;使用者Client过多依赖所操作对象内部的实现结构&#xff0c;如果对象内部的实现结构频繁发生变化&#xff0c;则使用者的代码结构将要频繁地修改&#xff0c;不利于代码地维护和扩展性&#xff1b;组合模式可以解决此类问题。组…

JQuery快速入门教程

1、JQuery快速入门 1.1、JQuery介绍 jQuery 是一个 JavaScript 库。所谓的库&#xff0c;就是一个 JS 文件&#xff0c;里面封装了很多预定义的函数&#xff0c;比如获取元素&#xff0c;执行隐藏、移动等&#xff0c;目的就 是在使用时直接调用&#xff0c;不需要再重复定义…

蓝牙 - BLE SPP的设计策略(Serial over BLE strategy)

在开发 BLE 连接产品的过程中&#xff0c;你可能会有这样的疑问&#xff1a;"Serial profile在哪里&#xff1f;也许你以为你在蓝牙技术联盟网站上滚动浏览长长的profile列表时错过了它。又或者&#xff0c;你根本就没去看&#xff0c;而是准备选择更快的方法&#xff0c;…

第 359 场 LeetCode 周赛题解

A 判别首字母缩略词 签到题… class Solution { public:bool isAcronym(vector<string> &words, string s) {string pf;for (auto &s: words)pf.push_back(s[0]);return pf s;} };B k-avoiding 数组的最小总和 贪心&#xff1a;从 1 1 1开始升序枚举&#xff0c…

mybatis-plus--配置-(sql)日志输出-自动填充-分页-多数据源-逻辑删除

写在前面&#xff1a; 本文主要介绍mybatis-plus的配置&#xff0c;以后在有的时候在补充。欢迎交流。 文章目录 日志输出自动填充分页全局字段配置多数据源 日志输出 调试的时候需要看执行的sql&#xff0c;这时候就很需要日志来记录查看了。 mybatis-plus的日志配置在yml…

葡萄目标检测(yolov8模型,无需修改路径,python代码,解压缩后直接运行)

运行效果视频&#xff1a;葡萄目标检测&#xff08;yolov8模型&#xff0c;无需修改路径&#xff0c;python代码&#xff0c;解压缩后直接运行&#xff09;_哔哩哔哩_bilibili 1.采用yolov8模型 models文件夹保存的是yolov8的训练好的模型参数 PinotNoir文件夹存放的是训练集 …

局部变量可能会引发的错误---误判---用阶乘函数求强数的 Python 程序中遇到的问题

背景介绍 今天遇到这样一个额需求&#xff1a;用阶乘函数求强数的 Python 程序。所谓强数&#xff0c;就是一个特殊数字&#xff0c;满足其所有数字阶乘的和应等于数字本身的条件。 问题描述 def facorial_of_number(number):result 1for i in range(1, number 1):result *…

如何使用Python实现遥感彩色合成?

综述 遥感影像真彩色合成是一种将多光谱遥感影像转换为真实感彩色影像的技术。它通过将不同波段的遥感数据进行组合&#xff0c;以模拟人眼对地物颜色的感知&#xff0c;从而提供更直观、更易于理解的影像信息。 库索引名&#xff1a;arcpy.CompositeBands_management 通过不同…

如何在window下cmd窗口执行linux指令?

1.Git&#xff1a;https://git-scm.com/downloads(官网地址) 2.根据自己的实际路径,添加两个环境变量 3.重启电脑

[oneAPI] 使用Bert进行中文文本分类

[oneAPI] 使用Bert进行中文文本分类 Intel Optimization for PyTorch基于BERT的文本分类模型数据预处理数据集定义tokenize建立词表转换为Token序列padding处理与mask 模型 结果OneAPI参考资料 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517…

标速高就是好?不看4K随机就别买SSD!

游戏玩家心心念念的SSD终于降到了白菜价&#xff0c;1TB的固态硬盘甚至比机械硬盘都便宜了&#xff0c;不过如果只看到动辄3000MB/s的读速&#xff0c;那你下单的时候还真的会被骗。 之所以这么说&#xff0c;是因为商品页面标注的速度都是连续读写速度&#xff0c;也就是直接向…

面试官:JVM是如何判定对象已死的?学JVM必会的知识!

本文已收录至GitHub&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录 引用计数算法可达性分析算法引用类型Dead Or Alive永久代真的"永久"吗&#xff1f;垃圾收集算法标记-清除算法标记-复制算法标记-整理算法标记-清除 VS 标记-整理 作为一名Java程序员&…

Autosar存储入门系列02_NVM之CRC校验及显隐式同步机制

本文框架 0.前言1. NVM中CRC校验2. NVM的显隐式同步机制2.1 隐式同步2.2 显式同步 0.前言 本系列是Autosar存储入门系列&#xff0c;希望能从学习者的角度把存储相关的知识点梳理一遍&#xff0c;这个过程中如果大家觉得有讲得不对或者不够清晰的地方&#xff0c;还请一定指出…