Creo/Proe 二次開發中使用 QT 編程流程

本文過期, 可以查看

http://blog.csdn.net/STPrinceT/article/details/71535694

或者

http://blog.csdn.net/stprincet/article/details/70805180

1.  環境

          Creo3.0 M400

          QT4.8.6 庫

          vs2015(使用vs2012編譯器)

          qtdestroy, uic  , moc   (都是qt自帶的,位置 bin中)

2.  配置

         2.1  運行環境

         QT庫的選擇  

         Qt4.8.6 自編譯庫,使用vs2012(x64)編譯器編譯,編譯方法參見另外文檔,編譯位置D:\Qt\4.8.6

         將QT庫添加到環境變量   D:\Qt\4.8.6\lib

         2.2  開發環境

         1.      C/C++  附加包含目錄  D:\Qt\4.8.6\include

         2.      鏈接器附加庫目錄          D:\Qt\4.8.6\lib

  附加依賴項    QtGuid4.lib;    QtCored4.lib        (每個版本的qt依賴項名稱不同,release和debug版不同,qt5需要多一個庫 widget)

3.  添加界面

         3.1使用 qtdestroy 設計界面,獲得dialog.ui文件

         3.2 命令行執行(cmd)  D:\Qt\4.8.6\bin\uic dialog.ui –o  ui_dialog.h                            (dialog.ui 最好是全路徑,後者相同)

         3.3 vs中添加 ui_dialog.h文件並新建類,類繼承自ui_dialog.h 中的類  和 Qdialog

         例:class dialog1 :  public QDialog,Ui_Dialog

         3.4 類初始化函數: 添加setupUi(this); // 設置界面用

        

4.  信號和槽

 4.1使用信號和槽需要繼承Q_OBJECT

     class dialog1 :  public QDialog,Ui_Dialog

{

         Q_OBJECT

                      publicslots:

    voidmyslot();

…

};


         Q_OBJECT不需要 

         信號不需要實現

         槽函數實現方式:和實現類中成員函數一樣

  4.2信號和槽的連接

         位置 類初始化函數中

    QObject::connect(this->Button_add, SIGNAL(clicked()), this, SLOT(myslot ()));


  4.3附加文件

 使用到Q_OBJECT的類需要特殊處理,使用命令moc

    D:\Qt\4.8.6\bin\moc  dialog1.h –o moc_dialog1.cpp

  4.4 將  moc_dialog1.cpp添加到項目中 ,(如果是mfc項目需要在本文件頭添加#include"stdafx.h"

 *使用到Q_OBJECT的類必須有對應的moc_xxx.cpp文件,否則編譯不通過,

 *每次修改 .h 文件後,都要對moc_xx.cpp進行重新生成

 

5.  添加圖片等資源   一個項目只能存在一個資源文件

1.      使用路徑添加,可以使用絕對路徑或者以工作目錄爲起點的相對路徑

2.      使用Qt的.qrc 文件

先將資源文件放入res(vs自動創建,位於代碼文件夾)文件夾下

打開Qt creator並新建資源文件,保存路徑爲當前代碼位置,名稱爲res

得到 res.qrc

使用rcc處理

D:\Qt\4.8.6\bin\rcc  res.qrc–o res.cpp

在項目中添加res.cpp文件

 在 res.cpp 開頭添加 #include"stdafx.h"

資源路徑爲   :/new/prefix1/res/add_down.png  基本在文件最下方

使用案例

    this->Button_add->setStyleSheet("QPushButton{border-image:url(:/new/prefix1/res/add_normal.png);}"

                                    "QPushButton:hover{border-image:url(:/new/prefix1/res/add_mouse.png);}"

                                    "QPushButton:pressed{border-image:url(:/new/prefix1/res/add_down.png);}");


6.  Creo二次開發中的qt

Qt是當作類使用的,所以uic,moc都需要手動完成,自動完成方法存在,並不討論

建立以mfc爲基礎的二次開發項目(只要能編譯dll,都可以使用),添加菜單,

 動作函數

intuiCmdCmdActFn_z(uiCmdCmdIdcommand, uiCmdValue * p_value,void *p_push_command_data)

{

    inti = 1;

    char  *path = "D:\\PTC\\Creo3.0\\M040\\Parametric\\bin\\parametric.exe";

    QApplicationapp(i, &path);

    dialog1 *dialog4 = newdialog1();

    dialog4->show();

    returnapp.exec();

    return 0;

}


將實現方法寫在槽函數中即可,與mfc編程方法一致

7.  要點

1.      需要qt庫支持,最好添加系統變量

2.      中文編碼問題,注並不能全部解決

    QTextCodec *codec = QTextCodec::codecForName("UTF-8");

       QTextCodec::setCodecForTr(codec);

    QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());

       QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());


3.      編碼轉換

QStringqs=QString::fromWCharArray(name);

4.      在qtdestroy中添加ico無法顯示的問題

在ui_xx.h文件中   icon1.addFile(QString::fromUtf8("G:\\PTC\\bin\\QTDLL_win32\\ONE\\add_normal.png"),QSize(), QIcon::Normal, QIcon::Off);

    添加完成路徑

代碼添加ico方法另查

5.      未知問題,qt的庫與proe的庫有衝突,只能使用 release版本編譯

8.  非模態界面

非模態界面參考了之前mfc中的實現方法,並不一定適合所有版本(已知qt5可能會出現錯誤)

        

dialog *dialog1 = NULL;

dialog *dialog2 = NULL;

QApplication * app1 = NULL;

intuiCmdCmdActFn_z(uiCmdCmdIdcommand, uiCmdValue * p_value, void *p_push_command_data)

{

    if (dialog1 == NULL)

    {

        dialog1 = newdialog();    

    }

    else

    {

        deletedialog1;

        dialog1 = newdialog();

    }

dialog1->show();

    return 0;

}

 intuiCmdCmdActFn_z2(uiCmdCmdIdcommand, uiCmdValue * p_value, void *p_push_command_data)

{…}

 

extern"C"intuser_initialize()

{

    inti = 1;

    char  *path = "parametric.exe";

    if (app1 == NULL)

    {

        app1 = newQApplication(i, &path);

       

    }

   

    //添加菜單

    //添加按鈕

…

 

}

////注意釋放

extern"C"voiduser_terminate()

{

    if (dialog1)

    {

        deletedialog1;

    }

    if (app1)

    {

        app1->exit();

        deleteapp1;

    }

}


參考多家彙總而成,qt5有問題,請使用qt4


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章