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

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

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

QT調(diào)用動態(tài)庫開發(fā)IC卡讀寫程序

鄒振豪 ? 來源:jf_51178285 ? 作者:jf_51178285 ? 2024-12-30 09:25 ? 次閱讀

IC卡特點(diǎn):
1IC卡的內(nèi)部存儲結(jié)構(gòu)分為16個扇區(qū),從第0區(qū)到第15區(qū),每個扇區(qū)有獨(dú)立的密碼和權(quán)限控制字,可作為卡的密碼和權(quán)限控制字專用獨(dú)立的電子錢包,每個扇區(qū)有4個塊,序號為第0塊、第1塊、第2塊、第3塊,每塊16個字節(jié),第3塊是塊,禁止在此存放數(shù)據(jù)。第0塊、第1塊、第2塊可隨意存放數(shù)據(jù)。但第0區(qū)的第0塊已被固化了IC卡出廠信息,此塊只能讀出信息,不可更改。

調(diào)用DLL動態(tài)庫代碼:
   unsigned char result;
    QLibrary mylib("OUR_MIFARE.dll");
    if (!mylib.load())                //判斷是否正確加載
    {
        QMessageBox::information(NULL, "提示", "動態(tài)庫沒裝載!原因是動態(tài)庫OUR_MIFARE.dll沒放在生成exe文件相同目錄下!");
        return;
    }
 
    pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep");
    if (mypcdbeep == NULL)                   //是否成功連接上 idr_beep()函數(shù)
    {
        mylib.unload();
        QMessageBox::information(NULL, "提示", "請檢查函數(shù)名是否正確!");
        return;
 
    }
 
 
    result = mypcdbeep(30);      //這里函數(shù)指針調(diào)用dll中的idr_beep() 函數(shù)
    mylib.unload();
    if(result > 0)
    {
        if(result == 23)
        {
            QMessageBox::information(NULL, "提示", "機(jī)器沒連上或者驅(qū)動沒下載");
        }
        else
        {
            QMessageBox::information(NULL, "提示", "錯誤代碼:" + QString::number(result));
        };
    }

讀出IC卡數(shù)據(jù)的代碼:

void MainWindow::on_pushButton_3_clicked()//輕松讀卡
{
   unsigned char ctrlword;//控制字
   unsigned char serial[4];//可寫數(shù)組
   unsigned char area;//讀出的區(qū)號
   unsigned char keyA1B0;//AB密碼認(rèn)證
   unsigned char picckey[6];//存放卡密碼的數(shù)組
   unsigned char piccdata0_2[48];//下標(biāo)0~15存放作為讀出的塊0的數(shù)據(jù),下標(biāo)16~31存放作為讀出的塊1的數(shù)據(jù),下標(biāo)32~47存放作為讀出的塊2的數(shù)據(jù)
   unsigned char status;//返回
   unsigned char status1;
   unsigned char result;
   unsigned char piccdata[16];  //卡數(shù)據(jù)緩沖

   //以下控制字含義:讀塊0、塊1、塊2,僅讀指定序列號的卡,需要每次指定密碼
   if (ui->radioButton->isChecked())
   {

       ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;

   }
   else
   {//內(nèi)部密碼
       ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN;
   }
   area = ui->comboBox->currentText().toUShort();
   keyA1B0 = 1;//用A密碼
   QString Key_str = ui->lineEdit->text().trimmed();

   if(Key_str.length() < 12)
   {
       QMessageBox::information(NULL, "提示", "密碼長度不夠12位!");
       ui-?>lineEdit->setFocus();
       return;

   }

   char c;
   for (int var = 0; var < 12; ++var)
   {
       c = Key_str.at(var).toLatin1();
       if(!((('0' <= c) && (c <= '9')) || (('A' <= c) && (c <= 'F')) || (('a' <= c) && (c <= 'f'))))
       {
         QMessageBox::information(NULL, "提示", "密碼輸入字符不正確!");
         ui-?>lineEdit->setSelection(var,1);
         ui->lineEdit->setFocus();
         return;
       }
   }


   bool ok;
   for(int i = 0; i < 6; i++)
   {
       picckey[i]=QString(Key_str.mid(i*2,2)).toInt(&ok,16);
   }



   QLibrary mylib("OUR_MIFARE.dll");
   if (!mylib.load())                //判斷是否正確加載
   {
       QMessageBox::information(NULL, "提示", "動態(tài)庫沒裝載!原因是動態(tài)庫OUR_MIFARE.dll沒放在生成exe文件相同目錄下!");
       return;
   }

   piccreadex mypiccreadex = (piccreadex)mylib.resolve("piccreadex");
   status = mypiccreadex(ctrlword,serial,area,keyA1B0,picckey,piccdata0_2);

   if(status == 0)
   {
       ui-?>lineEdit_2->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata0_2[0],piccdata0_2[1],piccdata0_2[2],piccdata0_2[3],piccdata0_2[4],piccdata0_2[5],piccdata0_2[6],piccdata0_2[7],piccdata0_2[8],piccdata0_2[9],piccdata0_2[10],piccdata0_2[11],piccdata0_2[12],piccdata0_2[13],piccdata0_2[14],piccdata0_2[15]));
       ui->lineEdit_3->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata0_2[16],piccdata0_2[17],piccdata0_2[18],piccdata0_2[19],piccdata0_2[20],piccdata0_2[21],piccdata0_2[22],piccdata0_2[23],piccdata0_2[24],piccdata0_2[25],piccdata0_2[26],piccdata0_2[27],piccdata0_2[28],piccdata0_2[29],piccdata0_2[30],piccdata0_2[31]));
       ui->lineEdit_4->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata0_2[32],piccdata0_2[33],piccdata0_2[34],piccdata0_2[35],piccdata0_2[36],piccdata0_2[37],piccdata0_2[38],piccdata0_2[39],piccdata0_2[40],piccdata0_2[41],piccdata0_2[42],piccdata0_2[43],piccdata0_2[44],piccdata0_2[45],piccdata0_2[46],piccdata0_2[47]));

       piccread mypiccread = (piccread)mylib.resolve("piccread");
       status1 = mypiccread(area * 4 + 3,piccdata);
       if(status1 == 0)
       {
         ui->lineEdit_5->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata[0],piccdata[1],piccdata[2],piccdata[3],piccdata[4],piccdata[5],piccdata0_2[6],piccdata[7],piccdata[8],piccdata[9],piccdata[10],piccdata[11],piccdata[12],piccdata[13],piccdata[14],piccdata[15]));

       }

       pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep");
       if (mypcdbeep == NULL)                   //是否成功連接上 idr_beep()函數(shù)
       {
         mylib.unload();
         QMessageBox::information(NULL, "提示", "請檢查函數(shù)名是否正確!");
         return;

       }

       result = mypcdbeep(30);      //這里函數(shù)指針調(diào)用dll中的idr_beep() 函數(shù)
       mylib.unload();

   }
   else if(status == 8)
   {
       ui->lineEdit_2->clear();
       ui->lineEdit_3->clear();
       ui->lineEdit_4->clear();
       QMessageBox::information(NULL, "提示", "尋卡錯誤,根本就沒有卡在感應(yīng)區(qū)");

   }
   else if(status == 12)
   {
       ui->lineEdit_2->clear();
       ui->lineEdit_3->clear();
       ui->lineEdit_4->clear();
       QMessageBox::information(NULL, "提示", "密碼認(rèn)證失敗");

   }

}

寫入數(shù)據(jù)到IC卡的代碼:

void MainWindow::on_pushButton_12_clicked()//輕松寫卡
{  
   unsigned char serial[4];//可寫數(shù)組
   unsigned char area;//讀出的區(qū)號
   unsigned char keyA1B0;//AB密碼認(rèn)證
   unsigned char picckey[6];//存放卡密碼的數(shù)組
   unsigned char piccdata0_2[48];//下標(biāo)0~15存放作為讀出的塊0的數(shù)據(jù),下標(biāo)16~31存放作為讀出的塊1的數(shù)據(jù),下標(biāo)32~47存放作為讀出的塊2的數(shù)據(jù)
   unsigned char status;//返回
   unsigned char result;
   char s;
   //以下控制字含義:讀塊0、塊1、塊2,僅讀指定序列號的卡,需要每次指定密碼
   if (ui->radioButton->isChecked())
   {

       ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY + NEEDHALT;

   }
   else
   {//內(nèi)部密碼
       ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN;
   }



   area = ui->comboBox->currentText().toUShort();
   keyA1B0 = 1;//用A密碼

   QString Key_str = ui->lineEdit->text().trimmed();

   if(Key_str.length() < 12)
   {
       QMessageBox::information(NULL, "提示", "密碼長度不夠12位!");
       ui-?>lineEdit->setFocus();
       return;

   }

   char c;
   for (int var = 0; var < 12; ++var)
   {
       c = Key_str.simplified().at(var).toLatin1();
       if(!((('0' <= c) && (c <= '9')) || (('A' <= c) && (c <= 'F')) || (('a' <= c) && (c <= 'f'))))
       {
         QMessageBox::information(NULL, "提示", "密碼輸入字符不正確!");
         //ui-?>lineEdit->setSelection(var,1);
         ui->lineEdit->setSelection(var,1);
         ui->lineEdit->setFocus();
         return;
       }
   }

   bool ok;
   for(int i = 0; i < 6; i++)
   {
       picckey[i]=QString(Key_str.mid(i*2,2)).toInt(&ok,16);
   }

   //第0塊數(shù)據(jù)
   QChar ch;
   QString writinf = ui-?>lineEdit_2->text().trimmed();
   QString writinf1 = "";
   int m = 0;
   int n = 0;

   ch = writinf.at(0);
   s = writinf.at(0).toLatin1();
   for(int i=0; i=16)
             {
                 break;
             }
         }
       }
       else if(s == ' ')
       {

       }
       else
       {
         QMessageBox::information(NULL, "提示", "寫卡數(shù)據(jù)錯誤,請輸入正確的16進(jìn)制數(shù)據(jù)!");

         ui->lineEdit_2->setSelection(i,1);
         ui->lineEdit_2->setFocus();

         return;

       }
   }

   if(mlineEdit_2->setFocus();
       return;
   }


   //第1塊數(shù)據(jù)
   writinf = ui->lineEdit_3->text().trimmed();
   QString writinf2 = "";
   m = 16;
   for(int i=0; i=32)
             {
                 break;
             }
         }
       }
       else if(s == ' ')
       {

       }
       else
       {
         QMessageBox::information(NULL, "提示", "寫卡數(shù)據(jù)錯誤,請輸入正確的16進(jìn)制數(shù)據(jù)!");
         qDebug() lineEdit_3->setSelection(i,1);
         ui->lineEdit_3->setFocus();
         return;
       }
   }
   if(mlineEdit_3->setFocus();
       return;
   }


   //第2塊數(shù)據(jù)
   writinf = ui->lineEdit_4->text().trimmed();
   QString writinf3 = "";
   m = 32;
   for(int i=0; i=48)
             {
                 break;
             }
         }
       }
       else if(s == ' ')
       {

       }
       else
       {
         QMessageBox::information(NULL, "提示", "寫卡數(shù)據(jù)錯誤,請輸入正確的16進(jìn)制數(shù)據(jù)!");
         ui->lineEdit_4->setSelection(i,1);
         ui->lineEdit_4->setFocus();
         return;

       }
   }

   if(mlineEdit_4->setFocus();
       return;
   }

   QLibrary mylib("OUR_MIFARE.dll");
   if (!mylib.load())                //判斷是否正確加載
   {
       QMessageBox::information(NULL, "提示", "動態(tài)庫沒裝載!原因是動態(tài)庫OUR_MIFARE.dll沒放在生成exe文件相同目錄下!");
       return;
   }

   piccwriteex mypiccwriteex = (piccwriteex)mylib.resolve("piccwriteex");
   status = mypiccwriteex(ctrlword,serial,area,keyA1B0,picckey,piccdata0_2);
   if(status == 0)
   {
       pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep");
       if (mypcdbeep == NULL)                   //是否成功連接上 idr_beep()函數(shù)
       {
         mylib.unload();
         QMessageBox::information(NULL, "提示", "請檢查函數(shù)名是否正確!");
         return;

       }
       result = mypcdbeep(30);      //這里函數(shù)指針調(diào)用dll中的idr_beep() 函數(shù)
       mylib.unload();
       QMessageBox::information(NULL, "提示", "寫卡成功!");
   }
   else if(status == 8)
   {
       ui->lineEdit_2->clear();
       ui->lineEdit_3->clear();
       ui->lineEdit_4->clear();
       QMessageBox::information(NULL, "提示", "尋卡錯誤,根本就沒有卡在感應(yīng)區(qū)");
   }
   else if(status == 12)
   {
       ui->lineEdit_2->clear();
       ui->lineEdit_3->clear();
       ui->lineEdit_4->clear();
       QMessageBox::information(NULL, "提示", "密碼認(rèn)證失敗");
   }
}

修改A,B區(qū)密碼:

void MainWindow::on_pushButton_14_clicked()
{
   unsigned char ctrlword;//控制字
   unsigned char serial[4];//可寫數(shù)組
   unsigned char area;//讀出的區(qū)號
   unsigned char keyA1B0;//AB密碼認(rèn)證
   unsigned char piccoldkey[6];//存放卡原始密碼的數(shù)組
   unsigned char piccdata[17];//存放卡新A密碼(也就是準(zhǔn)備改成的密碼)、密碼權(quán)限訪問字、新B密碼的數(shù)組、指定更改項目的標(biāo)志
   unsigned char status;//返回
   unsigned char result;
   if (ui->radioButton->isChecked())
   {
       ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY + NEEDHALT;
   }
   else
   {//內(nèi)部密碼
       ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN;
   }

   area = ui->comboBox->currentText().toUShort();
   keyA1B0 = 1;//用A密碼
   QString Key_str = ui->lineEdit->text().trimmed();

   if(Key_str.length() < 12)
   {
       QMessageBox::information(NULL, "提示", "密碼長度不夠12位!");
       ui-?>lineEdit->setFocus();
       return;

   }

   char c;
   for (int var = 0; var < 12; ++var)
   {
       c = Key_str.simplified().at(var).toLatin1();
       if(!((('0' <= c) && (c <= '9')) || (('A' <= c) && (c <= 'F')) || (('a' <= c) && (c <= 'f'))))
       {
         QMessageBox::information(NULL, "提示", "密碼輸入字符不正確!");
         ui-?>lineEdit->setSelection(var,1);
         ui->lineEdit->setFocus();
         return;
       }
   }

   bool ok;
   for(int i = 0; i < 6; i++)
   {
       piccoldkey[i]=QString(Key_str.mid(i*2,2)).toInt(&ok,16);
   }


   QChar ch;
   QString writinf = ui-?>lineEdit_5->text().trimmed();
   QString writinf4 = "";
   int m = 0;
   int n = 0;
   char s;
   for(int i=0; i=16)
             {
                 break;
             }
         }
       }
       else if(s == ' ')
       {

       }
       else
       {
         QMessageBox::information(NULL, "提示", "寫卡數(shù)據(jù)錯誤,請輸入正確的16進(jìn)制數(shù)據(jù)!");
         ui->lineEdit_5->setSelection(i,1);
         ui->lineEdit_5->setFocus();
         return;

       }
   }

   if(mlineEdit_5->setFocus();
       return;
   }

   QLibrary mylib("OUR_MIFARE.dll");
   if (!mylib.load())                //判斷是否正確加載
   {
       QMessageBox::information(NULL, "提示", "動態(tài)庫沒裝載!原因是動態(tài)庫OUR_MIFARE.dll沒放在生成exe文件相同目錄下!");
       return;
   }
   piccchangesinglekeyex mypiccchangesinglekeyex = (piccchangesinglekeyex)mylib.resolve("piccchangesinglekeyex");
   status = mypiccchangesinglekeyex(ctrlword,serial,area,keyA1B0,piccoldkey,piccdata);
   QMessageBox::warning(this, "警告", "你確定修改密碼控制塊的數(shù)據(jù)嗎 ?此數(shù)據(jù)塊如果改寫錯誤,數(shù)據(jù)卡將會被限制", QMessageBox::Ok, QMessageBox::Cancel);
   if(status == 0)
   {
       QMessageBox::information(NULL, "提示", "操作成功,寫卡數(shù)據(jù)有效!");
       pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep");
       if (mypcdbeep == NULL)                   //是否成功連接上 idr_beep()函數(shù)
       {
         mylib.unload();
         QMessageBox::information(NULL, "提示", "請檢查函數(shù)名是否正確!");
         return;

       }
       result = mypcdbeep(30);      //這里函數(shù)指針調(diào)用dll中的idr_beep() 函數(shù)
       mylib.unload();

   }
   else if(status == 8)
   {
       QMessageBox::information(NULL, "提示", "尋卡錯誤,根本就沒有卡在感應(yīng)區(qū)");

   }
   else if(status == 12)
   {
       QMessageBox::information(NULL, "提示", "密碼認(rèn)證失敗");
   }

}

審核編輯 黃宇

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

    關(guān)注

    2

    文章

    168

    瀏覽量

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

    關(guān)注

    1

    文章

    306

    瀏覽量

    37951
收藏 人收藏

    評論

    相關(guān)推薦

    ID讀卡器TCP協(xié)議QT程序開發(fā)

    ID網(wǎng)絡(luò)讀卡器TCP協(xié)議QT程序開發(fā)。 TCP(傳輸控制協(xié)議,Transmission Control Protocol)是互聯(lián)網(wǎng)中最核心、最基本的協(xié)議之一。以下是對TCP協(xié)議的詳
    的頭像 發(fā)表于 12-31 10:19 ?83次閱讀
    ID讀卡器TCP協(xié)議<b class='flag-5'>QT</b>小<b class='flag-5'>程序</b><b class='flag-5'>開發(fā)</b>

    USB免驅(qū)全協(xié)議IC讀寫QT程序開發(fā)

    ? 讀取15693,IC讀卡器如下入所示: 15693卡片,通常指的是符合ISO/IEC 15693標(biāo)準(zhǔn)的非接觸式智能或RFID。以下是對15693卡片的詳細(xì)介紹: 一、基本概述
    的頭像 發(fā)表于 12-30 17:42 ?108次閱讀
    USB免驅(qū)全協(xié)議<b class='flag-5'>IC</b><b class='flag-5'>卡</b><b class='flag-5'>讀寫</b>器 <b class='flag-5'>QT</b><b class='flag-5'>程序</b><b class='flag-5'>開發(fā)</b>

    C++ QT開發(fā),IC讀寫程序

    第一步:新建一個qt C++項目 在此需要注意, 名稱和路徑不能有中文。 第二步: 添加控件 完成UI布局 IC讀寫讀寫IC
    的頭像 發(fā)表于 12-30 14:55 ?81次閱讀
    C++ <b class='flag-5'>QT</b><b class='flag-5'>開發(fā)</b>,<b class='flag-5'>IC</b><b class='flag-5'>讀寫</b>器<b class='flag-5'>程序</b>

    QT調(diào)用動態(tài)

    \", \"動態(tài)沒裝載!原因是動態(tài)OUR_IDR.dll沒放在生成exe文件相同目錄下!\"); return; } idr_beep myidr_beep
    發(fā)表于 12-28 16:19

    EEPROM輕量級的簡易類文件的數(shù)據(jù)讀寫:EEPROMFS

    小。 這里就給大家分享一款EEPROM輕量級的簡易類文件的數(shù)據(jù)讀寫:EEPROMFS 1 關(guān)于EEPROMFS EEPROMFS,基于EEPROM的簡易類文件的數(shù)據(jù)讀寫,方便做
    的頭像 發(fā)表于 11-15 16:31 ?504次閱讀
    EEPROM輕量級的簡易類文件的數(shù)據(jù)<b class='flag-5'>讀寫</b><b class='flag-5'>庫</b>:EEPROMFS

    Arduino程序:實現(xiàn)SD NAND(貼片sd)的讀寫功能

      單片機(jī)上傳程序的時候,有時候感覺它的rom和 ram有時直接限制了他的使用,之前使用eeprom,和sd模塊. []()   然后最近看到了出的SD NAND 就是下面這個
    發(fā)表于 11-07 17:45

    EEPROM讀寫程序詳解

    EEPROM(Electrically Erasable Programmable Read-Only Memory)讀寫程序的詳解涉及多個方面,包括EEPROM的基本工作原理、讀寫流程、編程接口、代碼示例以及注意事項等。以下是
    的頭像 發(fā)表于 09-05 12:32 ?2284次閱讀

    EtherCAT運(yùn)動控制器上位機(jī)開發(fā)之Python+Qt(三):PDO配置與SDO讀寫

    PC上位機(jī)Python+Qt混合編程實現(xiàn)PDO配置與SDO讀寫
    的頭像 發(fā)表于 08-21 15:56 ?1151次閱讀
    EtherCAT運(yùn)動控制器上位機(jī)<b class='flag-5'>開發(fā)</b>之Python+<b class='flag-5'>Qt</b>(三):PDO配置與SDO<b class='flag-5'>讀寫</b>

    嵌入式QT常見開發(fā)方式有哪些?

    嵌入式QT常見開發(fā)方式有哪些? 嵌入式工程師在學(xué)習(xí)和使用Qt進(jìn)行開發(fā)時,常見的幾種開發(fā)方式包括: 1.
    發(fā)表于 08-12 10:05

    LabVIEW調(diào)用Aspose.dll實現(xiàn)excel讀寫、圖片插入,

    使用labview讀寫excel,有多種方式。 1、使用LV自帶的excel函數(shù),缺點(diǎn)是電腦必須安裝相應(yīng)版本的excel,且容易報各種錯誤。放棄。 2、調(diào)用NPOI的dll,免費(fèi),不用安裝
    發(fā)表于 06-24 17:01

    HarmonyOS開發(fā)案例:【搭建關(guān)系型數(shù)據(jù)】(4)

    本節(jié)將介紹如何調(diào)用關(guān)系型數(shù)據(jù)接口在本地搭建數(shù)據(jù),并讀寫相應(yīng)的用戶數(shù)據(jù)。
    的頭像 發(fā)表于 05-11 10:27 ?909次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【搭建關(guān)系型數(shù)據(jù)<b class='flag-5'>庫</b>】(4)

    STM8L15X能不能直接用于IC讀寫

    如題,STM8L15X能不能直接用于IC讀寫IC讀寫沒有外圍零件,直接使用STM8L15
    發(fā)表于 05-10 07:22

    鴻蒙OS開發(fā)學(xué)習(xí):【第三方調(diào)用

    在Stage模型中,如何調(diào)用已經(jīng)上架到[三方中心]的社區(qū)和項目內(nèi)創(chuàng)建的本地。
    的頭像 發(fā)表于 04-14 11:34 ?926次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>學(xué)習(xí):【第三方<b class='flag-5'>庫</b><b class='flag-5'>調(diào)用</b>】

    Qt上位機(jī)開發(fā)實戰(zhàn)案例

    Qt框架的開發(fā)人員能迅速上手和操作。 即使不開發(fā)Qt應(yīng)用程序Qt Creator也是一個
    的頭像 發(fā)表于 03-13 12:31 ?2584次閱讀
    <b class='flag-5'>Qt</b>上位機(jī)<b class='flag-5'>開發(fā)</b>實戰(zhàn)案例

    Qt For OpenHarmony圖形化的進(jìn)展突破

    Qt 適配 OpenHarmony 意義 Qt 是一個 C++ 跨平臺開發(fā)框架,主要用于開發(fā)圖形用戶界面(Graphical User Interface,GUI)
    的頭像 發(fā)表于 02-02 14:29 ?1545次閱讀
    <b class='flag-5'>Qt</b> For OpenHarmony圖形化的進(jìn)展突破