Qt 小工具, uic 與 moc
在用Qt寫程式的時候,最簡單的編譯方式是Qt三部曲
qmake -project
qmake
make
不過,對於在Visual Studio的整合環境下
寫個程式最後還要切出去玩Qt三部曲
那不是累死人了
OK, 好在Qt還是提供了兩個小工具
讓不想玩三部曲,又想用Qt Designer跟signal & slot的人
有個完整的解決方法
首先來看看Qt Designer,好用得不得了
直覺式的托放元件,省下不少安排UI的手續
不過,如果用的是open source code的版本
Qt Designer沒辦法整合進VS,而且做好的視窗介面只能存成 .ui 的檔案
因此,Qt提供了一個公用程式”uic”(UI Compiler)
將Qt Designer產生的 .ui 編譯為.h檔
用法是
uic -o <輸出的檔名.h> <設計好的介面檔.ui>
e.g. uic -o myform.h myform.ui
更進一步的使用方式,可以參考Qt的說明文件或是 簡介 Qt Designer
Qt會利用Meta-Object System,來處理自行定義的signal & slot
若要實做signal & slot機制,則必須使用 Q_OBJECT 巨集
並使用moc (Meta-Object Compiler),來產生Qt的C++擴充程式碼
moc -o <輸出的檔名.cpp> <包含Q_OBJECT巨集的標頭檔.h>
如果有多個使用Q_OBJECT巨集的物件/檔案
就需要對每一個檔案進行moc的處理
編譯完成的cpp檔,加入VC的專案後一併編譯就可以了
參考:
Qt4 Gossip: 自訂 Signal 與 Slot – http://caterpillar.onlyfun.net/Gossip/Qt4Gossip/CustomSignalSlot.html
很難得找到QT繁體中文的解說. 雖然並沒有我想要的information,但是想跟你打個招呼. 謝謝你詳細的解說.我相信這對某些人是很享用的. Keep it up!
Comment 由 IcHiBoN | 三月 3, 2009
谢谢啊,
我使用的是qt-sdk-win-opensource-2009.01.1.exe,
在vs2005下加入的.ui or .qrc,都不会自动invoke uic.exe or qrc.exe, further moc.exe来编译的,
看了你的说明,应该是要手动生成想要的.cpp才能加入vs2005的,否则link error。
thanks:-)
Comment 由 cjren | 四月 5, 2009
嗯,是這樣的步驟沒錯,有幫到你真是太好了。不過,還是有辦法讓VC以uic與moc來編譯這些UI的檔案,但我忘記怎麼去弄了。更何況,現在已經有VC的add-in,可以直接讓QT整合進VS開發環境中,簡化了開發UI的流程!
Comment 由 chia0418 | 四月 5, 2009
如何把產生出來CPP檔加入到VC專案裡頭,
我將CPP檔以拖曳的方式放到VC的專案視窗裡編譯,發生SLOT FUNTION無法辨
法辨認的ERROR,所以想請問如何加入CPP,
感激不盡。
Comment 由 mark | 四月 28, 2009
mark你好,你的問題可能是該cpp檔裡缺少定義Q_OBJECT巨集,使得moc無法正確辨認自行定義的slot function
Comment 由 chia0418 | 五月 5, 2009
謝謝你的答覆
我的問題已經解決了,我是把輸出的檔名換成moc_XXX.cpp,然後加入專案
裡編譯就過了,但還是謝謝你的回答,這篇文章幫助我很多。
Comment 由 mark | 五月 5, 2009
不好意思喔,我那個問題有不知為啥又出現了,而你說的在cpp檔定義
Q_OBJECT巨集,要怎定義阿,我只有再.h檔裡面有定義。
Comment 由 mark | 五月 5, 2009
mark你好,抱歉我沒有清楚,如果已經在.h裡定義了Q_OBJECT,應該不至於發生這樣的問題。Q_OBJECT的使用有些許的限制,詳細的說明請參考 http://doc.trolltech.com/4.5/moc.html,希望能夠幫到你。
Comment 由 chia0418 | 五月 6, 2009
謝謝版主的回答,研究了很久,功能終於出來了,非常感謝你 ^^
Comment 由 mark | 五月 6, 2009
版大您好
想問個問題…我想要按下按鈕之後
就可以用內建的播放軟體撥放影片
connect( button , SIGNAL(clicked()) , ??? , ??? ) ;
後面還有2個參數我不知道要怎樣使用
第一個應該是要放接收的地方而第2個應該是動作
但是這不是在視窗內而是要啟動系統內的工作
所以對於剛接觸的我而言幾乎是完全不懂>”<
懇請版大告知
Comment 由 小范 | 七月 20, 2009
小范你好,如果是剛接觸Qt的話,可以先看看Qt4 學習筆記,多練習與熟悉Qt的設計架構。等熟練了以後,那兩個打問號的地方自然就解決了。在這裡我大概講一下我的解決辦法,提供你參考。第一步,先在widget中定義一個slot function,然後利用connect()將按鈕跟slot連結。因此第一個問號的地方應該是this,第二個問號的地方是slot function。第二步,在slot function中,利用QProcess::startDetached()執行外部程式以及其參數。函式的用法可以參考Qt小幫手(Qt Assistant)。希望以上對你有幫助!
Comment 由 chia0418 | 七月 21, 2009
感謝版大!!!
Comment 由 小范 | 七月 22, 2009
版大您好
我使用
QProcess::startDetached( “path” )
可以開啟可執行檔…但是對文件或影片圖片那些都沒有用>”<
煩請版大指點
Comment 由 小范 | 七月 22, 2009