QML筆記八

QML與C++交互
QML中調用C++功能、使用QML或者Quick中的C++接口、使用C++實現自定義的QML對象
注:
只有QObject的派生類才能與QML交互
QML引擎集成Qt元對象系統,QObject的派生子類的屬性、方法、信號都可以在QML中訪問
C++類可以被注冊為一個QML實例
C++類可以被注冊為一個單例類型,可在QML中導入單例對象
C++類實例可以作為上下文屬性或上下文對象嵌入到QML中

1.QML運行時C++類

Qt QML模塊實現了QML框架的C++類,客戶端可以使用這些類與QML運行時進行交互
以C++為切入點的QML客戶端啟動時會:
1.客戶端初始化一個QQmlEngine
2.使用QQmlComponent對象加載QML文件
3.QML引擎提供一個默認的QQmlContext對象作為頂層執行上下文,用來執行QML文件中定義的函數、表達式;通過QQmlEngine::rootContext獲取該上下文
4.若加載QML文件沒錯時,QML文件的對象將使用QQmlComponent對象的create()創建。
5.所有對象創建完畢,客戶端將控制權交給應用程序的事件循環

2.QQmlEngine
2.1提供一個QML引擎,管理qml文件的對象層次結構
2.2提供一個默認上下文,即根上下文,代表執行環境,保證在需要時對象屬性可以被更新
2.3允許將全局設置應用到它管理的所有對象

3.QQmlApplicationEngine

是 QQmlEngine的子類,結合了QQmlEngine、QQmlComponent功能
更簡便的實現從一個單一的qml文件加載應用程序
提供一些核心應用程序功能,,一般由C++控制
例如:
QQmlQpplicationEngine engine;
engine.load(QStringLiteral(“qrc:/main.qml”))
一般QQmlQpplicationEngine加載的qml文件其根對象應該是widnow或者ApplicationWindow,不然無法顯示
若要加載根不是window或其子類的qml文件時使用
QQuickView* view=new QQuickView
view->setSource(QUrl::fromLocalFile(“myqmlfile.qml”))
view->show()

4.QQmlContext

提供了對象實例化和表達式執行所需的上下文
所有對象都要在特定的上下文中實例化
QQmlContext在QML引擎中定義了一個上下文,允許將數據暴露給由QML引擎實例化的QML組件
QQmlContext屬性能通過名字將數據顯示綁定到上下文,使用setContextProperty()
例如:
QQmlEngine engine;
QStingListModel modelData;
QQmlContext* context = engine.rootContext()
context->setContextProperty(“stringModel”,&modelData)
QQmlContext創建者需要有權去銷毀QQmlContext對象 下方例子中context由根上下文中創建了一個新的上下文,modelData被添加到該新的的上下文,
window銷毀后,新創建的context必須顯示銷毀,可以將window作為context父對象,利用QT的對象內存結構自動銷毀
例如:
QQmlEngine engine;
QStingListModel modelData;
QQmlContext* context = new QQmlContext(engine.rootContext()) ;
context->setContextProperty(“stringModel”,&modelData) //和下面代碼的區別

QQmlComponent component(&engin);
component.setData(“importQtQuick;ListView{model:stringModel}”,QUrl());
QObject* window=component.create();

在QQmlContext中設置一上下文(按照這樣new QQmlContext(engine.rootContext())),上下文對象的是所有屬性都可以在context中通過名稱訪問
使用上下文對象可以更簡單快捷維護屬性
例如:
class MyDataSet:public QObject
{
Q_PROPERTY(QAbstractItemModel* myModel READ NOTIFY modelChanged)
};
MyDataSet myDataSet;
QQmlEngine engine;
QQmlContext* context=new QQmlContext(engine.rootContext());
context->setContextObject(&myDataSet); //和上面代碼的區別

QQmlComponent componet(&engine);
componet.setData(“import QtQuick;ListView{model:myModel}”,QUrl());
component.create(context);

使用setContextProperty顯示設置的屬性優先于上下文對象的屬性
QQmlEngine engine;
QQmlContext* context1=new QQmlContext(engine.rootContext());
QQmlContext* context2=new QQmlContext(context1); //context2 是context1的子上下文。
context1->setContextProperty(“a”,12);
context1->setContextProperty(“b”,15);
context2->setContextProperty(“5”,15); //context2具有context1的全部屬性

5.QQmlComponent

動態對象實例化,
可以使用C++直接創建,也可以通過createComponent在QML中創建
組件是可重用的、具有定義好的對外接口的封裝QML類型,
QQmlComponent封裝了QML組件的定義,用于加載QML文檔,需要QQmlComponent實例化QML的對象

例如:
qml
import QtQuick
Item{width:100;height:100}

c++
#include
#include
#include
int main(int argc,char* argv[])
{
QCoreApplication a(argc,argv);
QQmlEngine engine;
QQmlComponent component(&engine,Qurl::fromLocalFile(“…/main.qml”));
QObject* myObj=component.create();
QuickItem* item = qobject_cast<QQuickItem*>(myObj);
qreal width = item->width();
return a.exec();
}
如果QQmlComponent要加載網絡中的QML文件時,需要先獲取到文件才能加載,所以有一個過程,會變成Loading,只有狀態變為Ready后才能調用create
void Init(){
QQmlComponent component(&engine,Qurl(“http://www.eample.com/main.qml”));
if(component->isLoading())
{
QObject::connect(component,&QQmlComponent::statusChanged,this,&MyApplication::continuedLoading)
}
else
{
continuedLoading();
}
}

void continuedLoading()
{
if(component->isError())
{
qWarning<< component->errors();
}else
{
QObject* myObj = component->create();
}
}

6.QQmlExpression

動態執行表達式
允許客戶端在C++中利用一個特定的上下文執行javascript表達式,表達式的結果以QVariant返回
例子:
xx.qml文件
Item{
width:100;height:100
}
C++中
QQmlEngine engine = new QQmlEngine();
QQmlComponent component(engine,QUrl::fromLocalFile(“xx.qml”));
QObject* object=component.create();
QQmlExpression* express = new QQmlExpression(engine->rootContext(),object,“width*2”);
int ret = expression->evaluate().toInt();

7.QML中注冊C++類型

7.1 qmlRegisterType
Qt5.14后不在推薦使用qmlRegisterType
7.2 基于宏的注冊方式
Qt5.15后使用一組可以添加到類定義中的宏,注冊C++,會將類型導出到QML中;

QML_ELEMENT:
最重要的宏
可以將所在的類提供給QML作為類型,類型名稱就是類名
QML_NAMED_ELEMENT(name)可以自定義類型名

例子:
c++文件
#include <QtQml/qqmlregistration.h> //必備
class Backend:public QObject
{
Q_OBJECT
Q_PROPERTY(QString username READ userName WRITE setUserName NOTIFY usernameChanged)

QML_ELEMENT //必備

public:
explicit Backend(QObject* parent = nullptr){}
QString username(){return m_userName;}
void setUserName(const QString &userName)
{
m_userName = userName;
emit userNameChanged();
}
signals:
void userNameChanged();
private:
QString m_userName;
};

在pro文件中添加如下
CONFIG += qmltypes
QML_IMPORT_NAME=io.qt.examples.backend
QML_IMPORT_MAJOR_VERSION = 1
這樣就可以在類型命名控件為《io.qt.examples.backend》中注冊版本為1的類型
次要版本將從附加到屬性、方法、信號的任何修訂中派生,默認次要版本為0,
將QML_ADDED_IN_minor_VERSION()宏添加到類定義中,可以顯示的將類型限制為特定的次要版中可用

在qml文件中
import QtQuick
import QtQuick.Controls
import io.qt.examples.backend //C++中的類型空間
ApplicationWindow{
id:root
width:100;height:100
visible:true
BackEnd{
id:backend
onUserNameChanged:console.log(backend.userName);
}
Column{
spacing:10
anchors.centerIn:parent
TextField{
placeholderText:qsTr(“User Name”)
onTextChanged:backend.username = text
}
Label{
text:backend.username
width:100;height:100
background:Rectangle{
color:“lightgrey”
}
}
}

}
7.3 注冊值類型
具有Q_GADGET宏的任何類型都可以注冊為QML值類型
Q_GADGET是Q_OBJECT簡化版,適用于不從QOBJECT派生,但希望使用QMetaObject的一些功能
可以使用Q_ENUM、Q_PROPERTY、Q_INVOKABLE;但不能使用信號和槽
值類型名稱需要小寫,
注冊方式:QML_VALUE_TYPE或者QML_ANONYMOUS
class Person{
Q_GADGET
Q_PROPERTY(QString firstName READ firstName WRITE setFirstName NOTIFY fierstNameChanged)
Q_PROPERTY(QString lastName READ lastName WRITE setLastName NOTIFY usernameChanged)
QML_VALUE_TYPE(persion) //值類型名稱需要小寫,
}
使用方式和7.2類似

7.4注冊不可實例的對象類型
有時候需要將QObject派生類注冊為不可實例化的對象類型
符合情況的C++類
- 該類是個接口類型,不應該被實例化
- 該類不需要向QML公開的基類
- 僅聲明一些可以從QML訪問的枚舉
- 是應通過單例提供給QML的類型
QML提供了以下幾種方法用于注冊非實例化的類型的宏
QML_ANONYMOUS: 注冊不可實例化,且無法從QML引用的C++類型
QML_INTERFACE:注冊Qt接口類型
QML_UNCREATETABLE(reason):注冊一個命名的C++類型,不可實例,但可被QML系統識別,需要搭配QML_ELEMENT或者QML_NAMED_ELEMENT
QML_SINGLETON:注冊一個可以從QML導入的單例類型;需要搭配QML_ELEMENT或者QML_NAMED_ELEMENT
單例允許QML使用命名空間訪問其屬性值、信號、函數,不需要手動實例化一個對象
單例類型不需要和QQmlContext關聯,它被所有上下文共享
單例類型由QQmlEngine構造持有,engine銷毀該單例銷毀

8. 定義QML特定類型、屬性

8.1 附加屬性
QML中有一個附加屬性、附加信號處理器,是附加到一個對象的額外特性
8.2屬性修飾符類型
可以作用于QML對象實例的一種屬性
屬性值設置攔截器:在屬性被設置時,用于過濾和改變設置值
屬性值源:隨時間推移,自動更新值

8.3指定QML對象為默認屬性、父級屬性
Q_CLASSINFO宏和DefaultProperty搭配指定默認屬性
class A{
Q_CLASSINFO(“DefaultProperty”,“messages”) //將屬性messages設置為默認屬性
Q_CLASSINFO(“ParentProperty”,“boadr”) //告訴QML哪個屬性表示QML層次結構父對象
}
8.4枚舉類型
使用自定義枚舉類型,需要先將類注冊,枚舉使用Q_ENUM()聲明
class Message:public QObject
{
Q_OBJECT
Q_PROPERTY(Status staus READ status NOTIFY statusChanged)
public:
enum Status{ready,Loading,Error};
Q_ENUM(Status)
Status status( )const;
signals:
void statusChanged();
}

在qml文件中使用
Message
{
onStatusChanged:
{
if(status == Message.Ready)
{
console.log(“Message is loaded”)
}
}
}

9.使用C++屬性

QObject的子類或者包含有Q_GADGET宏的類的所有屬性都能夠被QML訪問
可以使用Q_PROPERTY宏定義屬性
例子
class Message:public QObject
{
Q_OBJECT
Q_PROPERTY(Status staus READ status NOTIFY statusChanged)
Q_PROPERTY(QString m_author READ author WRITE setAuthor NOTIFY authorChanged)
public:
enum Status{ready,Loading,Error};
Q_ENUM(Status)
Status status( )const;
QString authorconst{return m_author;}
void SetAuthor(const QString& autho)
{
if(autho != m_author)
{
m_author=autho;
emit authorChanged();
}
}
signals:
void statusChanged();
void authorChanged();
private:
QString m_author;
}
cpp文件中
QQuickView view;
Message msg;
view.engine()->rootContext()->setContextProperty(“msg”,&msg);
view.setSource(QUrl::fromLocalFile(MyItem.qml));
view.show();
在qml文件中:
import QtQuick
Text
{
width:100;height:100;
text:msg.author //調用author()
Component.onCompleted:
{
msg.author = “Jonah” //調用SetAuthor()
}
}

10.增強QML、C++交互性,屬性都應該顯示關聯一個NOTIFY屬性,屬性改變時發射該信號

10.1 對象類型屬性
如果類注冊到QML,在qml中可以直接使用這個類
class Message : public QObject
{
Q_OBJECT
Q_PROPERTY(QString m_author READ author WRITE setAuthor NOTIFY authorChanged)
public:
QString authorconst{return m_author;}
void SetAuthor(const QString& autho)
{
if(autho != m_author)
{
m_author=autho;
emit authorChanged();
}
}
signals:
void authorChanged();
private:
QString m_author;
}

在qml中直接 Message{}
10.2對象列表屬性
如果屬性包含QObject子類列表,在QML中訪問必須使用QQmlListProperty作為屬性類型
class MessageBoadr: public QObject
{
Q_OBJECT
Q_PROPERTY(QQmlListProperty messages READ messages)
public:
QQmlListProperty messages()const; //返回一個由QList<Message*> m_messages構造的新的QQmlListProperty對象
{
return QQmlListProperty(this,0,&MessageBoard::append_message);
}
private:
static void append_message(QQmlListProperty* list,Message* msg)
{
MessageBoard* msgBoard=qobject_cast<MessageBoard*>(list->object);
if(msg)
msgBoard->m_messages.append(msg);
}
QList<Message*> m_messages;
}
10.3屬性組
屬性組用于描述一個類型相關的特征
class MessageAuthor:publicQObject
{
Q_PROPERTY(QString name READ name WRITE setName)
Q_PROPERTY(QString email READ email WRITE setEmail)
}
class Message:public QObject
{
Q_OBJECT
Q_PROPERTY(MessageAuthor* author READ author)
public:
Message(QObject* parent):QObject(parent),m_author(new MessageAuthor(this)){}
MessageAuthor* author()const{return m_author;}
private:
MessageAuthor* m_author;
}

Message、MessageAuthor注冊到QML后
Message
{
author.name:“aaa”
author.email:“aaa@qq.com”
}
10.4使用函數和槽、信號
QML中可以有條件的訪問QObject子類的函數
使用Q_INVOKABLE標記的public函數
public的槽函數
class MessageBoard:public QObject
{
Q_OBJECT
public:
Q_INVOKABLE bool postMessage(const QString &msg)
{
return true;
}
signals:
void newMessagePosted(const QString &subject);
public slots:
void refresh(){}
}

cpp
MessageBoard msgBoard
QQuickView view;
view.engine()->rootContext()->setContextProperty(“msgBoard”,&msgBoard);
view->setSource(QUrl::fromLocateFile(“MyItem.qml”));
view.show();

qml
import QtQuick
Item
{
width:100;height:100;
MouseArea
{
anchors.fill:parent
onClicked:
{
var result = msgBoard.postMessage(“sss”);
msgBoard.refresh();
}
}

onNewMwssagePosted:(subject)=>{}
}
10.5 C++中使用QML
QML可以使用QQmlComponent、QQuickView進行加載;
– QQmlComponent讀取到qml后,將其轉為c++對象,即可在C++中進行修改
– QQuickView也和QQmlComponent類似,不過由于QQuickView是QWindow的子類,所以被加載的對象還可以進行可視化渲染;
因此,QQuickView用于將一個可視化的QML與應用程序的圖形界面整合
Item
{
width:100
height:100
}
使用QQmlComponent
QQmlEngine engine;
QQmlComponent component(&engine,QUrl::fromLocalFile(“main.qml”));
QObject* obj=component.create();
//…
delete obj;

獲取到QObject后,利用setPorperty、QQmlProperty對其屬性修改
obj->setProperty(“width”,500);
QQmlProperty(obj,“width”).write(600)

還可以轉換成其他類型
QQuickItem* item=qobject_cast<QQuickItem*>(object);
item->setWidth(500);
qDebug()<property(“width”)
使用QQuickView
QQuickView view;
view.setSource(QUrl::fromLocalFile(“main.qml”));
view.show();
QQuickItem* item=view.rootObject();
item->setWidth(500);
qDebug()<width();
10.6 連接QML信號
Item
{
id:item
signal qmlSignal(msg:string)
signal qmlSSignal(obj:Item)
MouseArea
{
anchors.fill:parent
onClicked:
{
item.qmlSignal(“sss”)
item.qmlSSignal(item)
}

}
}
class MyClass:public QObject
{
Q_OBJECT
public slots:
void cppSlot(QString msg){}
void cppSlot(QQuickItem* item){}
}

main:
QQuickView view(QUrl:;fromLocalFile(“MyItem.qml”));
QObject* item=view.rootObject();
MyClass myClass;
QObject::connect(item,SIGNAL(qmlSignal(QString)),&myClass,SLOT(cppSlot(QSting)));
QObject::connect(item,SIGNAL(qmlSignal(QVariant)),&myClass,SLOT(cppSlot(QVariant)));

view.show();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13061.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13061.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13061.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Web后端】請求頭

1、簡介 請求頭&#xff08;Request Headers&#xff09;是在HTTP協議中&#xff0c;客戶端&#xff08;如瀏覽器或應用程序&#xff09;向服務器發送請求時附帶的元數據。包含了關于請求的額外信息&#xff0c;有助于客戶端與服務器之間的有效通信。請求頭中的信息可以讓服務…

.[sqlback@memeware.net].2700勒索病毒數據怎么處理|數據解密恢復

導言&#xff1a; 隨著信息技術的飛速發展&#xff0c;網絡安全問題愈發嚴峻&#xff0c;其中勒索病毒成為了企業和個人用戶面臨的重要威脅之一。.[sqlbackmemeware.net].2700勒索病毒作為其中的佼佼者&#xff0c;以其獨特的攻擊方式和強大的破壞力&#xff0c;引起了廣泛關注…

【Go語言入門學習筆記】Part1.夢開始的地方

一、前言 經過一系列的學習&#xff0c;終于有時間來學習一些新的語言&#xff0c;Go語言在現在還是比較時髦的&#xff0c;多一個技能總比不多的好&#xff0c;故有時間來學一下。 二、配置環境 按照網絡中已有的配置方法配置好&#xff0c;本人采用了Jetbrain的Goland&#…

DTC 2024回顧丨zData X 多元數據庫一體機:開創多元數據庫時代部署新范式

導語 在2024“數據技術嘉年華”上&#xff0c;云和恩墨數據庫一體機產品總經理劉宇在“數據庫極致特性”專題論壇發表了題為《打造多元數據庫部署新范式&#xff0c;引領一體化資源池創新之路》的演講。他深入分析了國產數據庫面臨的挑戰&#xff0c;并詳細介紹了云和恩墨如何利…

5.10.1 Pre-Trained Image Processing Transformer

研究了低級計算機視覺任務&#xff08;例如去噪、超分辨率和去雨&#xff09;并開發了一種新的預訓練模型&#xff0c;即圖像處理變壓器&#xff08;IPT&#xff09;。利用著名的 ImageNet 基準來生成大量損壞的圖像對。 IPT 模型是在這些具有多頭和多尾的圖像上進行訓練的。此…

Megatron-lm、DeepSpeed

1、為了訓練更多的數據、更大的模型&#xff0c;提出了并行訓練框架。 2、并行的方式&#xff1a;數據并行、模型并行&#xff08;張量并行、流水線并行&#xff09;。 3、Megatron-LM 綜合應用了數據并行&#xff08;Data Parallelism&#xff09;&#xff0c;張量并行&…

內網安全工具之ADExplorer的使用

ADExplorer是域內一款信息查詢工具&#xff0c;它是獨立的可執行文件&#xff0c;無需安裝。它能夠列出域組織架構、用戶賬號、計算機賬號登&#xff0c;可以幫助尋找特權用戶和數據庫服務器等敏感目標。 下載地址&#xff1a;http://live.sysinternals.com/ 連接 下載了ADE…

第十四屆藍橋杯大賽軟件賽國賽C/C++ 大學 B 組 拼數字

//bfs只能過40%。 #include<bits/stdc.h> using namespace std; #define int long long int a,b,c,dp[2028]; struct s {int x,y,z;string m; }; map<vector<int>,int>k; signed main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>a…

Java入門基礎學習筆記24——While循環和do-while循環

1、While循環&#xff1a; 例1&#xff1a; package cn.ensource.loop;public class WhileDemo3 {public static void main(String[] args) {// 目標&#xff1a;掌握while循環的書寫格式&#xff0c;以及理解其執行流程// 需求&#xff1a;打印多行Hello Worldint i 0;while…

EFCore_創建項目

添加依賴 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Tools(Migration工具) 根據使用的DB添加對應依賴&#xff1a; SQL Server&#xff1a;Microsoft.EntityFrameworkCore.SqlServer 添加該依賴時可不添加Microsoft.EntityFrameworkCore&#xff0c;該依…

電工能混到這份上

最近看到某電工師傅發了一篇帖子&#xff0c;大致內容是他在處理一個簡單故障的時候居然花了很長的時間。我們一起來看看他遇到的是什么故障吧! plc 控制的一臺設備&#xff0c;行走部分靠 2 個腳踏開關控制&#xff08;內部開關量控制方向&#xff0c;電位器控制速度&#xff…

Java:使用BigDecimal、NumberFormat和DecimalFormat保留小數

一、代碼和調試結果 1.1 BigDecimal ![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/fa36749de8124266a730817710fdf737.png) 1.2 DecimalFormat 1.3 NumberFormat 二、原代碼 BigDecimalUtil.java 代碼 package utils;import java.math.BigDecimal; import jav…

前端模塊導入導出方式

不同的導出方式和相應的導入方式&#xff0c;可以提煉成 3 種類型&#xff1a;name、default 和 list。 以下是使用示例&#xff1a; // Name Export | Name Import // 一個“命名”的導出 export const name value import { name } from ...? 錯誤示例&#xff1a; export…

Linux平臺和Windows平臺互傳文件

rz和sz的出發對象都是從Linux出發的&#xff0c;例如sz發送&#xff08;Send&#xff09;從Linux->發送到Windows。 rz 從Windows文件發送到Linux中 先創立一個新文本文件 之后將hello Windows輸入到該文本文件中 在顯示器上顯示里面是否有hello Windows內容 sz發送Lin…

Flutter 中的 PageStorage 小部件:全面指南

Flutter 中的 PageStorage 小部件&#xff1a;全面指南 在Flutter中&#xff0c;PageStorage小部件提供了一種方法來保存和恢復頁面間的信息&#xff0c;這對于具有多個頁面且需要在這些頁面之間共享狀態的應用程序非常有用。本文將詳細介紹PageStorage的用途、如何使用它以及…

Microsoft Azure AI語音服務

一&#xff1a;文字轉語音SDK安裝 安裝語音 SDK - Azure AI services | Microsoft Learn 二&#xff1a;基于文本轉語音Rest API 文本轉語音 API 參考 (REST) - 語音服務 - Azure AI services | Microsoft Learn 三&#xff1a;基于文本合成語音 如何基于文本合成語音 - 語…

Retrying,一個神奇優雅的 Python 庫

大家好&#xff01;我是愛摸魚的小鴻&#xff0c;關注我&#xff0c;收看每期的編程干貨。 一個簡單的庫&#xff0c;也許能夠開啟我們的智慧之門&#xff0c; 一個普通的方法&#xff0c;也許能在危急時刻挽救我們于水深火熱&#xff0c; 一個新穎的思維方式&#xff0c;也許能…

非成對意象翻譯中的內容制約范式再思考

Rethinking the Paradigm of Content Constraints in Unpaired Image-to-Image Translation 非成對意象翻譯中的內容制約范式再思考 Xiuding Cai1 2, Yaoyao Zhu1 2, Dong Miao1 2, Linjie Fu1 2, Yu Yao1 2 蔡秀定 1 2 、朱瑤瑤 1 2 、苗東 1 2 、付林杰 1 2 、余瑤 1 2 Corre…

遙感數據集制作(Potsdam數據集為例):TIF圖像轉JPG,TIF標簽轉PNG,圖像重疊裁剪

文章目錄 TIF圖像轉JPGTIF標簽轉PNG圖像重疊裁剪圖像重命名數據集轉COCO格式數據集轉VOC格式 遙感圖像不同于一般的自然圖像&#xff0c;由于波段數量、圖像位深度等原因&#xff0c;TIF圖像數據不能使用簡單的格式轉換方法。本文以Potsdam數據集為例&#xff0c;制作能夠直接用…

Linux安裝配置CGAL,OpenCV和Gurobi記錄

安裝Qt&#xff0c;查看當前的Qt版本&#xff0c;需要至少滿足v5.12 qmake -v安裝CGAL&#xff0c;The Computational Geometry Algorithms Library (cgal.org) CGAL v5.6.1&#xff1a;https://github.com/CGAL/cgal/releases/download/v5.6.1/CGAL-5.6.1.tar.xz 確保C編譯…