0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Qt自定義委托--實(shí)現(xiàn)批量升級(jí)UI

Rice嵌入式開發(fā)技術(shù)分享 ? 來源:Rice 嵌入式開發(fā)技術(shù)分享 ? 作者:Rice 嵌入式開發(fā)技 ? 2022-10-31 12:27 ? 次閱讀

概要

使用Qt編寫上位機(jī)是一個(gè)非常不錯(cuò)的選擇,簡(jiǎn)單說一下作者的看法:

①Q(mào)t采用的是C++,所以在某種程度上與嵌入式設(shè)備數(shù)據(jù)類型兼容,所以嵌入式設(shè)備與上位機(jī)間的協(xié)議定義數(shù)據(jù)結(jié)構(gòu)等都可以相互套用,

②Qt是跨平臺(tái)的,所以代碼開發(fā)一次,多平臺(tái)運(yùn)行。

③Qt學(xué)習(xí)成本低,網(wǎng)上資料很多,基本你遇到的問題,網(wǎng)上都能找到。

對(duì)于嵌入式開發(fā)者來說,會(huì)寫上位機(jī)可以提高開發(fā)效率,比如可以開發(fā)抓包工具,日志數(shù)據(jù)分析,升級(jí)(網(wǎng)絡(luò)升級(jí),串口升級(jí)等)

說到升級(jí),那么就有些場(chǎng)景,比如批量升級(jí),某臺(tái)升級(jí)等需求。有這些需求那么就要有對(duì)應(yīng)的UI呈現(xiàn)給用戶。所以Qt的自定義委托在這種場(chǎng)景顯的尤為重要。

32d2d19a-580b-11ed-b468-dac502259ad0.png

Qt模型視圖中的委托

Qt模型視圖采用類MVC框架,那什么是MVC框架?

M--模型:負(fù)責(zé)組織數(shù)據(jù)

V--試圖:負(fù)責(zé)顯示數(shù)據(jù)

C--控制:負(fù)責(zé)用戶輸入

3304feb8-580b-11ed-b468-dac502259ad0.png

Qt模型視圖設(shè)計(jì):①視圖中集成了處理用戶輸入的功能,②視圖將用戶輸入作為內(nèi)部獨(dú)立的子功能實(shí)現(xiàn)

332c57ec-580b-11ed-b468-dac502259ad0.png

模型視圖中的委托:①委托是視圖中處理用戶輸入的部件。②視圖可以設(shè)置委托對(duì)象用于用戶輸入。③委托對(duì)象負(fù)責(zé)創(chuàng)建和顯示用戶輸入上下文。

Qt 自定義委托--實(shí)現(xiàn)批量升級(jí)UI

準(zhǔn)備工作:下載Qt工具,然后創(chuàng)建一個(gè)基類為QMainWindow的工程,并且?guī)i的。

設(shè)計(jì)一個(gè)ui,一個(gè)CheckBox控件和TableView控件

33432710-580b-11ed-b468-dac502259ad0.png

自定義表格中單選框CheckBox委托 -- 創(chuàng)建QRiceButtonDelegate類繼承QItemDelegate

重寫paint方法和editorEvent方法,其中paint用于繪制,editorEvent用于處理用戶輸入

單選框其實(shí)使用按鈕項(xiàng)樣式(QStyleOptionButton)繪制。

QRiceButtonDelegate源文件

#include"qricecheckboxdelegate.h"

#include
#include
#include
#include
#include

QRiceCheckBoxDelegate::QRiceCheckBoxDelegate(QObject*parent)
:QItemDelegate(parent)
{

}

QRiceCheckBoxDelegate::~QRiceCheckBoxDelegate()
{

}

voidQRiceCheckBoxDelegate::paint(QPainter*painter,constQStyleOptionViewItem&option,constQModelIndex&index)const
{
if(QVariant::Bool==index.data(Qt::DisplayRole).type())//如果數(shù)據(jù)類型為bool型,才繪制單選寬
{
QStyleOptionButtoncheckBox;
checkBox.state=index.data().toBool()?QStyle::State_On:QStyle::State_Off;//繪制后的默認(rèn)狀態(tài)
checkBox.state|=QStyle::State_Enabled;
checkBox.rect=option.rect;
checkBox.rect.setX(option.rect.x()+option.rect.width()/2-6);//設(shè)置在表格中的顯示位置

QApplication::style()->drawControl(QStyle::CE_CheckBox,&checkBox,painter);//繪制
}
else
{
QItemDelegate::paint(painter,option,index);
}
}

boolQRiceCheckBoxDelegate::editorEvent(QEvent*event,QAbstractItemModel*model,constQStyleOptionViewItem&option,constQModelIndex&index)
{
boolret=true;
if(QVariant::Bool==index.data().type())
{
QMouseEvent*mouse=dynamic_cast(event);

if((NULL!=mouse)&&(QEvent::MouseButtonPress==mouse->type())&&(option.rect.contains(mouse->pos())))
{
model->setData(index,!index.data().toBool(),Qt::DisplayRole);//更新模型數(shù)據(jù)
}
}
else
{
ret=QItemDelegate::editorEvent(event,model,option,index);
}

returnret;
}
*>

QRiceButtonDelegate頭文件

#ifndefQRICECHECKBOXDELEGATE_H
#defineQRICECHECKBOXDELEGATE_H

#include

classQRiceCheckBoxDelegate:publicQItemDelegate
{
Q_OBJECT
public:
explicitQRiceCheckBoxDelegate(QObject*parent=nullptr);
~QRiceCheckBoxDelegate();

voidpaint(QPainter*painter,constQStyleOptionViewItem&option,constQModelIndex&index)const;
booleditorEvent(QEvent*event,QAbstractItemModel*model,constQStyleOptionViewItem&option,constQModelIndex&index);
signals:

};

#endif//QRICECHECKBOXDELEGATE_H

自定義表格中進(jìn)度條ProgressBar委托 -- 創(chuàng)建QRiceProgressBarDelegate類繼承QItemDelegate

重寫paint方法和editorEvent方法,其中paint用于繪制,editorEvent用于處理用戶輸入

進(jìn)度條其實(shí)采用進(jìn)度條項(xiàng)樣式(QStyleOptionProgressBar)繪制。

QRiceProgressBarDelegate源文件

voidQRiceProgressBarDelegate::paint(QPainter*painter,constQStyleOptionViewItem&option,constQModelIndex&index)const
{
intprogress=index.data(Qt::DisplayRole).toInt();
QStyleOptionProgressBarprogressBar;

progressBar.minimum=0;//設(shè)置進(jìn)度條最小值
progressBar.maximum=100;//設(shè)置進(jìn)度條最大值
progressBar.progress=progress;//設(shè)置繪制后的數(shù)值
progressBar.rect=option.rect.adjusted(4,4,-4,-4);//設(shè)置進(jìn)度條的大小
progressBar.textVisible=true;//設(shè)置進(jìn)度條顯示數(shù)值
progressBar.textAlignment=Qt::AlignCenter;//設(shè)置進(jìn)度條數(shù)值顯示位置
progressBar.text=QString("%1%").arg(progress);//設(shè)置進(jìn)度條數(shù)值顯示

QApplication::style()->drawControl(QStyle::CE_ProgressBar,&progressBar,painter);//繪制
}

boolQRiceProgressBarDelegate::editorEvent(QEvent*event,QAbstractItemModel*model,constQStyleOptionViewItem&option,constQModelIndex&index)
{
boolret=true;

if(QEvent::MouseButtonDblClick!=event->type())
{
ret=QItemDelegate::editorEvent(event,model,option,index);
}

returnret;
}

QRiceProgressBarDelegate頭文件

#ifndefQRICEPROGRESSBARDELEGATE_H
#defineQRICEPROGRESSBARDELEGATE_H

#include

classQRiceProgressBarDelegate:publicQItemDelegate
{
Q_OBJECT
public:
explicitQRiceProgressBarDelegate(QObject*parent=nullptr);
~QRiceProgressBarDelegate();

voidpaint(QPainter*painter,constQStyleOptionViewItem&option,constQModelIndex&index)const;
booleditorEvent(QEvent*event,QAbstractItemModel*model,constQStyleOptionViewItem&option,constQModelIndex&index);
signals:

};

#endif//QRICEPROGRESSBARDELEGATE_H

自定義表格中按紐Button委托 -- 創(chuàng)建QRiceButtonDelegate類繼承QItemDelegate

重寫paint方法和editorEvent方法,其中paint用于繪制,editorEvent用于處理用戶輸入

按鈕其實(shí)按鈕項(xiàng)樣式(QStyleOptionButton)繪制。

QRiceButtonDelegate源文件

voidQRiceButtonDelegate::paint(QPainter*painter,constQStyleOptionViewItem&option,constQModelIndex&index)const
{
QStyleOptionButton*buttonStyle=buttonDelegate.value(index);
if(!buttonStyle)
{
buttonStyle=newQStyleOptionButton();//創(chuàng)建按鈕項(xiàng)樣式
buttonStyle->text="Update";//設(shè)置按鈕中顯示的內(nèi)容
buttonStyle->state|=QStyle::State_Enabled;//設(shè)置按鈕中的狀態(tài)
(const_cast(this))->buttonDelegate.insert(index,buttonStyle);
}
buttonStyle->rect=option.rect.adjusted(4,4,-4,-4);//設(shè)置按鈕的大小
painter->save();

if(option.state&QStyle::State_Selected){
painter->fillRect(option.rect,option.palette.highlight());
}

painter->restore();
QApplication::style()->drawControl(QStyle::CE_PushButton,buttonStyle,painter);//繪制
}

boolQRiceButtonDelegate::editorEvent(QEvent*event,QAbstractItemModel*model,constQStyleOptionViewItem&option,constQModelIndex&index)
{
Q_UNUSED(model);
Q_UNUSED(option);
QMouseEvent*mouseEvent=(QMouseEvent*)event;

if(event->type()==QEvent::MouseButtonPress)//按鈕按下,設(shè)置按鈕的狀態(tài)
{
if(buttonDelegate.contains(index))
{
QStyleOptionButton*buttonStyle=buttonDelegate.value(index);
if(buttonStyle->rect.contains(mouseEvent->x(),mouseEvent->y()))
{
buttonStyle->state|=QStyle::State_Sunken;
}
}
}
if(event->type()==QEvent::MouseButtonRelease)//按鈕松開,設(shè)置按鈕的狀態(tài)
{
if(buttonDelegate.contains(index))
{
QStyleOptionButton*buttonStyle=buttonDelegate.value(index);
if(buttonStyle->rect.contains(mouseEvent->x(),mouseEvent->y()))
{
buttonStyle->state&=(~QStyle::State_Sunken);
showMsg(tr("btn1column%1").arg(index.row()));//松開彈出消息框,顯示對(duì)應(yīng)行號(hào)
}
}
}

returntrue;
}

voidQRiceButtonDelegate::showMsg(QStringstr)
{
QMessageBoxmsg;
msg.setText(str);
msg.exec();
}

QRiceButtonDelegate頭文件

#ifndefQRICEBUTTONDELEGATE_H
#defineQRICEBUTTONDELEGATE_H

#include

classQRiceButtonDelegate:publicQItemDelegate
{
Q_OBJECT
public:
explicitQRiceButtonDelegate(QObject*parent=nullptr);
~QRiceButtonDelegate();

voidpaint(QPainter*painter,constQStyleOptionViewItem&option,constQModelIndex&index)const;
booleditorEvent(QEvent*event,QAbstractItemModel*model,constQStyleOptionViewItem&option,constQModelIndex&index);
signals:

private:
voidshowMsg(QStringstr);

private:
typedefQMapcollButtons;
collButtonsbuttonDelegate;
};

#endif//QRICEBUTTONDELEGATE_H
,>

創(chuàng)建一個(gè)自定義QRiceTableView類繼承QTableView類

構(gòu)造方法實(shí)現(xiàn):①創(chuàng)建QStandardItemModel模型。②創(chuàng)建單選框委托到視圖中。③創(chuàng)建進(jìn)度條委托到視圖第五列中。④創(chuàng)建按鈕委托到視圖第六列中。⑤設(shè)置表格視圖的頭部。

QRiceTableView::QRiceTableView(QWidget*parent):
QTableView(parent)
{
horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

tableItemModel=newQStandardItemModel();
setModel(tableItemModel);

tableCheckBoxDelegate=newQRiceCheckBoxDelegate(this);
setItemDelegate(tableCheckBoxDelegate);

tableProgressBarDelegate=newQRiceProgressBarDelegate(this);
setItemDelegateForColumn(4,tableProgressBarDelegate);

tableButtonDelegate=newQRiceButtonDelegate(this);
setItemDelegateForColumn(5,tableButtonDelegate);

QStringListtableHeaders;
tableHeaders<setHorizontalHeaderLabels(tableHeaders);
}
,>(

在QRiceTableView中實(shí)現(xiàn)用戶使用方法:

方法 說明
int QRiceTableGetRow(void); 獲取列表行數(shù)
int QRiceTableGetColumn(void); 獲取列表列數(shù)
void QRiceTableAddItem(int row, struct tableItemInfo *info); 增加一行
void QRiceTableSetProgress(int row, int Progress); 設(shè)置某行的進(jìn)度條
void QRiceTableSetSelect(int row, bool select); 單選框狀態(tài)設(shè)置
bool QRiceTableGetSelect(int row); 單選框狀態(tài)獲取
QString QRiceTableGetString(int row, int column); 獲取某行某列的數(shù)據(jù)

在QRiceTableView中方法代碼:

intQRiceTableView::QRiceTableGetRow(void)
{
returntableItemModel->rowCount();
}

intQRiceTableView::QRiceTableGetColumn(void)
{
returntableItemModel->columnCount();
}

voidQRiceTableView::QRiceTableAddItem(introw,structtableItemInfo*info)
{
QStandardItem*otaDeviceListStandardItem=tableItemModel->invisibleRootItem();

QStandardItem*checkBox=newQStandardItem();
QStandardItem*name=newQStandardItem();
QStandardItem*age=newQStandardItem();
QStandardItem*work=newQStandardItem();

checkBox->setData(false,Qt::DisplayRole);
name->setData(info->name,Qt::DisplayRole);
age->setData(info->age,Qt::DisplayRole);
work->setData(info->work,Qt::DisplayRole);

otaDeviceListStandardItem->setChild(row,0,checkBox);
otaDeviceListStandardItem->setChild(row,1,name);
otaDeviceListStandardItem->setChild(row,2,age);
otaDeviceListStandardItem->setChild(row,3,work);
}

voidQRiceTableView::QRiceTableSetProgress(introw,intProgress)
{
if(rowrowCount())
{
QModelIndexindex=tableItemModel->index(row,4);
tableItemModel->setData(index,Progress,Qt::DisplayRole);
}
}

voidQRiceTableView::QRiceTableSetSelect(introw,boolselect)
{
if(rowrowCount())
{
QModelIndexindex=tableItemModel->index(row,0);
tableItemModel->setData(index,select,Qt::DisplayRole);
}
}

boolQRiceTableView::QRiceTableGetSelect(introw)
{
if(rowrowCount())
{
QModelIndexindex=tableItemModel->index(row,0);
returnindex.data(Qt::DisplayRole).toBool();
}
returnfalse;
}

QStringQRiceTableView::QRiceTableGetString(introw,intcolumn)
{
if(rowrowCount()
&&column>0&&columncolumnCount()-2))
{
QModelIndexindex=tableItemModel->index(row,column);
returnindex.data(Qt::DisplayRole).toString();
}
return"";
}

QRiceTableView頭文件:

#ifndefQRICETABLEVIEW_H
#defineQRICETABLEVIEW_H

#include

#include
#include"qricecheckboxdelegate.h"
#include"qriceprogressbardelegate.h"
#include"qricebuttondelegate.h"

classQRiceTableView:publicQTableView
{
Q_OBJECT
public:
structtableItemInfo
{
QStringname;
QStringage;
QStringwork;
};
public:
explicitQRiceTableView(QWidget*parent=nullptr);
~QRiceTableView();

signals:

public:
intQRiceTableGetRow(void);
intQRiceTableGetColumn(void);
voidQRiceTableAddItem(introw,structtableItemInfo*info);
voidQRiceTableSetProgress(introw,intProgress);
voidQRiceTableSetSelect(introw,boolselect);
boolQRiceTableGetSelect(introw);
QStringQRiceTableGetString(introw,intcolumn);

private:
QStandardItemModel*tableItemModel;

QRiceCheckBoxDelegate*tableCheckBoxDelegate;
QRiceProgressBarDelegate*tableProgressBarDelegate;
QRiceButtonDelegate*tableButtonDelegate;
};

#endif//QRICETABLEVIEW_H

將UI中的QTableView提升為QRiceTableView:

右擊QTableView控件,選擇提升為:

3377fcec-580b-11ed-b468-dac502259ad0.png

填寫對(duì)應(yīng)類名,類的頭文件相對(duì)路徑:

34078f88-580b-11ed-b468-dac502259ad0.png

點(diǎn)擊添加后,然后點(diǎn)擊提升按鈕,就完成了控件的提升

在mainwindow.cpp中增加測(cè)試用例:

在構(gòu)造方法中,創(chuàng)建兩條數(shù)據(jù),并且啟動(dòng)一個(gè)定時(shí)器刷新進(jìn)度條:

MainWindow::MainWindow(QWidget*parent)
:QMainWindow(parent)
,ui(newUi::MainWindow)
{
ui->setupUi(this);

setWindowTitle(tr("RiceDelegate"));

structQRiceTableView::tableItemInfoinfo;
info.name=tr("RiceChen");
info.age=tr("18");
info.work=tr("程序員");
ui->tableView->QRiceTableAddItem(0,&info);

info.name=tr("米飯");
info.age=tr("20");
info.work=tr("公務(wù)員");
ui->tableView->QRiceTableAddItem(1,&info);

QTimer*timer=newQTimer(this);
connect(timer,&QTimer::timeout,[=](){
staticintProgress1=0;
staticintProgress2=0;

ui->tableView->QRiceTableSetProgress(0,Progress1);
ui->tableView->QRiceTableSetProgress(1,Progress2);
Progress1+=1;
Progress2+=2;
if(Progress1>100)
{
Progress1=0;
}
if(Progress2>100)
{
Progress2=0;
}
});
timer->start(1000);
}

界面中全選框的實(shí)現(xiàn):

voidMainWindow::on_allCheckBox_clicked()
{
for(introw=0;rowtableView->QRiceTableGetRow();row++)
{
if(ui->allCheckBox->checkState()==Qt::Checked)
{
ui->tableView->QRiceTableSetSelect(row,true);
}
else
{
ui->tableView->QRiceTableSetSelect(row,false);
}
}
}

最終呈現(xiàn)結(jié)果:

32d2d19a-580b-11ed-b468-dac502259ad0.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5059

    文章

    18973

    瀏覽量

    302042
  • ui
    ui
    +關(guān)注

    關(guān)注

    0

    文章

    203

    瀏覽量

    21330
  • 上位機(jī)
    +關(guān)注

    關(guān)注

    27

    文章

    930

    瀏覽量

    54696
  • Qt
    Qt
    +關(guān)注

    關(guān)注

    1

    文章

    301

    瀏覽量

    37786
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HarmonyOS開發(fā)實(shí)例:【自定義Emitter】

    使用[Emitter]實(shí)現(xiàn)事件的訂閱和發(fā)布,使用[自定義彈窗]設(shè)置廣告信息。
    的頭像 發(fā)表于 04-14 11:37 ?954次閱讀
    HarmonyOS開發(fā)實(shí)例:【<b class='flag-5'>自定義</b>Emitter】

    OpenHarmony應(yīng)用開發(fā)之自定義彈窗

    , `getApplicationVersion is fail`) } } ... ... 以上是應(yīng)用升級(jí)所需的數(shù)據(jù)結(jié)構(gòu)及部分?jǐn)?shù)據(jù)獲取。 彈窗具體實(shí)現(xiàn) 自定義彈窗的實(shí)現(xiàn)就是在原頁面
    發(fā)表于 09-06 14:40

    OpenHarmony自定義組件介紹

    見的容器組件上。 二、頁面和自定義組件生命周期 在開始之前,我們先明確自定義組件和頁面的關(guān)系: ● 自定義組件:@Component裝飾的UI單元,可以組合多個(gè)系統(tǒng)組件
    發(fā)表于 09-25 15:36

    1602自定義字符

    1602液晶能夠顯示自定義字符,能夠根據(jù)讀者的具體情況顯示自定義字符。
    發(fā)表于 01-20 15:43 ?1次下載

    Qt自定義窗口部件的創(chuàng)建

    通過對(duì)一個(gè)已經(jīng)存在的Qt窗口部件進(jìn)行子類化或者直接對(duì)QWidget進(jìn)行子類化,就可以創(chuàng)建自定義窗口部件。以下直接對(duì)已有的Qt窗口部件進(jìn)行子類化
    發(fā)表于 09-09 09:00 ?2409次閱讀

    如何在LabVIEW中實(shí)現(xiàn)自定義控件

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何在LabVIEW中實(shí)現(xiàn)自定義控件。
    發(fā)表于 01-14 17:17 ?48次下載
    如何在LabVIEW中<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>自定義</b>控件

    基于HAL庫的USB自定義HID設(shè)備實(shí)現(xiàn)

    基于HAL庫的USB自定義HID設(shè)備實(shí)現(xiàn)基于HAL庫的USB自定義HID設(shè)備實(shí)現(xiàn)準(zhǔn)備工作CubeMX配置代碼實(shí)現(xiàn)基于HAL庫的USB
    發(fā)表于 12-28 20:04 ?13次下載
    基于HAL庫的USB<b class='flag-5'>自定義</b>HID設(shè)備<b class='flag-5'>實(shí)現(xiàn)</b>

    三種自定義彈窗UI組件封裝的實(shí)現(xiàn)

    鴻蒙已經(jīng)提供了全局 UI 方法自定義彈窗,本文是基于基礎(chǔ)的自定義彈窗來實(shí)現(xiàn)提示消息彈窗、確認(rèn)彈窗、輸入彈窗的 UI 組件封裝。
    的頭像 發(fā)表于 03-30 09:28 ?3070次閱讀

    自定義視圖組件教程案例

    自定義組件 1.自定義組件-particles(粒子效果) 2.自定義組件- pulse(脈沖button效果) 3.自定義組件-progress(progress效果) 4.
    發(fā)表于 04-08 10:48 ?14次下載

    ArkUI如何自定義彈窗(eTS)

    自定義彈窗其實(shí)也是比較簡(jiǎn)單的,通過CustomDialogController類就可以顯示自定義彈窗。
    的頭像 發(fā)表于 08-31 08:24 ?2097次閱讀

    自定義特性能做什么?

    今天跟大家分享的主題是基于自定義特性實(shí)現(xiàn)DataGridView全自動(dòng)生成。
    的頭像 發(fā)表于 02-22 16:20 ?783次閱讀
    <b class='flag-5'>自定義</b>特性能做什么?

    labview自定義控件

    labview自定義精美控件
    發(fā)表于 05-15 16:46 ?17次下載

    Omniverse 中文課程系列 3:實(shí)戰(zhàn)練習(xí)如何成為自定義 UI 界面大師

    Omniverse 為 3D 工具構(gòu)建漂亮的自定義 UI 界面 學(xué)習(xí)目標(biāo) 如果您是虛擬世界的構(gòu)建者和創(chuàng)作者,那么您一定不能錯(cuò)過親身體驗(yàn) NVIDIA Omniverse 套件中的 Omni.ui 工具及框架
    的頭像 發(fā)表于 06-09 20:45 ?546次閱讀
    Omniverse 中文課程系列 3:實(shí)戰(zhàn)練習(xí)如何成為<b class='flag-5'>自定義</b> <b class='flag-5'>UI</b> 界面大師

    自定義算子開發(fā)

    一個(gè)完整的自定義算子應(yīng)用過程包括注冊(cè)算子、算子實(shí)現(xiàn)、含自定義算子模型轉(zhuǎn)換和運(yùn)行含自定義op模型四個(gè)階段。在大多數(shù)情況下,您的模型應(yīng)該可以通過使用hb_mapper工具完成轉(zhuǎn)換并順利部署
    的頭像 發(fā)表于 04-07 16:11 ?2710次閱讀
    <b class='flag-5'>自定義</b>算子開發(fā)

    labview超快自定義控件制作和普通自定義控件制作

    labview超快自定義控件制作和普通自定義控件制作
    發(fā)表于 08-21 10:32 ?12次下載