本文過期, 可以查看
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