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

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ARM-汇编指令

一&#xff0c;map.lds文件 链接脚本文件 作用&#xff1a;给编译器进行使用&#xff0c;告诉编译器各个段&#xff0c;如何进行分布 /*输出格式&#xff1a;32位可执行程序&#xff0c;小端对齐*/ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm",…

React原理 - React Virtual DOM 原理

目录 扩展学习资料 Virtual DOM 是什么【虚拟dom】 React渲染 Virtual DOM VS 原生DOM【vDom是否比原生Dom更高效】 Virtual DOM数据结构 Virtaual DOM Diff【虚拟dom前后比对&#xff0c;更新不同dom的算法】 源码解读 react源码组织方式&#xff1a; React Stack Rec…

YOLOv5基础知识入门(7)— NMS(非极大值抑制)原理解析

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。NMS是指非极大值抑制&#xff08;non maximum suppression&#xff09;&#xff0c;它是一种常用于物体检测任务的算法。在物体检测中&#xff0c;通常会有多个预测框&#xff08;bounding box&#xff09;被提议出来&…

开始MySQL探索——数据库概述

计算机语言 计算机语言概述 计算机语言&#xff08;Computer Language&#xff09;可以简单的理解为一种计算机和人都能识别的语言。 机器语言 汇编语言 高级语言 机器语言 汇编语言 高级语言 SQL语言基础 SQL的概述 SQL全称&#xff1a;Structured Query Language&…

Aspose.Tasks for .NET V23Crack

Aspose.Tasks for .NET V23Crack 改进了大型项目的内存占用。 添加了API&#xff0c;允许您在应用程序无法访问系统字体文件夹时指定用户的字体文件夹。 Aspose.Tasksfor.NET是处理MicrosoftProject文件的可靠的项目管理API。API支持在不依赖Microsoft Project的情况下读取、写…

平安私人银行慈善沙龙广州站:善财传承公益有道,广州分行聚爱同行

近年来&#xff0c;平安私人银行将慈善作为客户服务的王牌权益之一&#xff0c;激发和满足客户公益慈善心愿&#xff0c;打造财富人群和困境人群的桥梁&#xff0c;并链接公益机构等专业组织&#xff0c;深度挖掘金融赋能慈善的多种可能性&#xff0c;让财富通过慈善事业释放出…

在router中使用pinia、在组件外使用pinia时 报错没有激活pinia

getActivePinia was called with no active Pinia. Did you forget to install pinia? 我想在路由守卫中使用store中部的数据&#xff0c;但是拿不到仓库&#xff0c;提示pinia没激活 解决方案&#xff1a;借鉴vben-admin 在每个模块中都把pinia和当前的仓库绑定一份暴漏出去…

ARM--day5(C语言点灯实验、总线、串口通信信息、串口通讯协议)

函数分装实现点灯 gpio.c: #include "gpio.h" //函数功能&#xff1a;GPIO引脚初始化操作 //参数1&#xff1a;GPIO组号 //参数2&#xff1a;引脚编号 //参数3&#xff1a;初始化内容 void hal_gpio_init(volatile gpio_t*gpiox,unsigned int pin,gpio_init_t* ini…

net start Mysql 启动服务时 ,显示“Mysql服务正在启动 Mysql服务无法启动 服务没有报告任何错误

一、问题 有时候&#xff0c;输入net start Mysql 启动服务时 mysql>net start Mysql 显示 Mysql服务正在启动 Mysql服务无法启动 服务没有报告任何错误 二、原因 由于mysql的默认端口是3306&#xff0c;因此在启动服务的时候&#xff0c;如果此端口被占用&#xff0c;就会出…

VB.NET通过VB6 ActiveX DLL调用PowerBasic及FreeBasic动态库

前面说的Delphi通过Activex DLL同时调用PowerBasic和FreeBasic写的DLL&#xff0c;是在WINDOWS基础平台上完成的。 而 .NET平台是架在WINDOWS基础平台之上的&#xff0c;它的上面VB.NET或C#等开发的APP程序&#xff0c;下面写一下用VB.NET&#xff0c;通过VB6注册的Activex DLL…

Ubuntu20.04安装软件报错:The following packages have unmet dependencies

Ubuntu20.04更换阿里云源后安装软件都会报错&#xff1a;The following packages have unmet dependencies 查看资料&#xff0c;大概是ubuntu本身的源比较版本较老&#xff0c;而阿里云的源比较新&#xff0c;因此版本不匹配造成依赖的库不匹配&#xff0c;所以只要将阿里云的…

vue 简单实验 数据更新

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"counter">Counter: {{ counter }} </div> <script> const Counter {data() {return {counter: 5}},mounted() {set…

基于Jenkins CICD的代码发布与回滚-------从小白到大神之路之学习运维第87天

第四阶段提升 时 间&#xff1a;2023年8月24日 地 点&#xff1a;2304教室 授课人&#xff1a;李凤海 参加人&#xff1a;全班人员 内 容&#xff1a; 基于Jenkins CICD的代码发布与回滚 目录 一、案例概述 二、案例知识点 三、案例环境 &#xff08;一&#xff0…

PHP“牵手”拼多多商品详情数据获取方法,拼多多API接口批量获取拼多多商品详情数据说明

拼多多商品详情接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取拼多多商品的详细信息&#xff0c;包括商品的标题、描述、图片等信息。在拼多多电商平台的开发中&#xff0c;拼多多详情接口 API 是非常常用的 API&#xff0c;因此本文将详细介绍拼多多…

领域建模之数据模型设计方法论

本文通过实际业务需求场景建模案例&#xff0c;为读者提供一种业务模型向数据模型设计的方法论&#xff0c;用于指导实际开发中如何进行业务模型向数据模型转化抽象&#xff0c;并对设计的数据模型可用性、扩展性提供了建议性思考。通过文章&#xff0c;读者可以收获到业务模型…

POI groupRow 折叠分组,折叠部分不显示问题

折叠组是什么&#xff1f;如图就是用POI 实现的&#xff0c;代码很简单&#xff1a;sheet.groupRow(开始行&#xff0c;结束行)即可 但是万万没想到&#xff0c;最终实现出的结果&#xff0c;合并的组&#xff0c;有一部分并没有渲染出来&#xff0c;如下图&#xff1a; 因为我…

线性代数的学习和整理9(草稿-----未完成)

3.3 特征值和特征向量是什么&#xff1f; 直接说现在&#xff1a;特征向量这个块往哪个方向进行了拉伸&#xff0c;各个方向拉伸了几倍。这也让人很容易理解为什么&#xff0c;行列式的值就是特征值的乘积。 特征向量也代表了一些良好的性质&#xff0c;即这些线在线性变换后…

基于GPT-4和LangChain构建云端定制化PDF知识库AI聊天机器人

参考&#xff1a; GitHub - mayooear/gpt4-pdf-chatbot-langchain: GPT4 & LangChain Chatbot for large PDF docs 1.摘要&#xff1a; 使用新的GPT-4 api为多个大型PDF文件构建chatGPT聊天机器人。 使用的技术栈包括LangChain, Pinecone, Typescript, Openai和Next.js…

图论基础和表示(Java 实例代码)

目录 图论基础和表示 一、概念及其介绍 二、适用说明 三、图的表达形式 Java 实例代码 src/runoob/graph/DenseGraph.java 文件代码&#xff1a; src/runoob/graph/SparseGraph.java 文件代码&#xff1a; 图论基础和表示 一、概念及其介绍 图论(Graph Theory)是离散数…

基于Python的图书馆大数据可视化分析系统设计与实现

博主介绍&#xff1a;✌csdn特邀作者、博客专家、java领域优质创作者、博客之星&#xff0c;擅长Java、微信小程序、Python、Android等技术&#xff0c;专注于Java、Python等技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; …