[回到版面]
回應模式
名 稱
內 文
附加圖檔[] []
  • 可附加圖檔類型:GIF, JPG, JPEG, PNG,瀏覽器才能正常附加圖檔
  • 附加圖檔最大上傳資料量為 4096 KB。
  • 當檔案超過寬 125 像素、高 125 像素時會自動縮小尺寸顯示
  • AA可使用 [aa][/aa] 防止變形
  • 回覆時程式碼縮排會被trim消掉,請善用[code][/code]標色或貼到ideone等網站
  • LaTeX記法可以用「$$」或「\( \)」包起來,例如「$\sum_{k=1}^{k=n} k^2 = \frac{n(n+1)(n+2)}{6}$」

檔名:1501081928808.jpg-(47 KB, 620x626)
47 KB
無標題無名氏17/07/26(三)23:12:08 ID:K7HEfW/oNo.12297
我想在暑假無聊的時候學寫程式
目前只是學一點皮毛用QT去練習C++
我想問如果想要在已經編譯好的程式裡面在運行過程中
動態的新增一個東西( new配置記憶體之類的方式或是vector? )
又要它可以跟原本或是後來新增的物件互動的話
大概要怎麼做?
還有已經宣告好的類別要怎麼樣去擴展它?( 另外加一些函式之類的
如果透過繼承的話又會讓它類別名字不一樣
我想要在程式關掉之後下次再開還能保有上次原來的一些資料可以怎麼做?

MinGW編譯跟MSVC編譯出來的程式會差很多嗎
大概什麼樣的情況會害程式不能在其他電腦執行
剛剛學到怎麼讓QT做靜態編譯所以編譯出來的程式不需要去放那些動態連結庫了
無名氏17/07/26(三)23:36:59 ID:9X3i8mnwNo.12298
先說我沒玩過Qt,只會C++

>>我想問如果想要在已經編譯好的程式裡面在運行過程中動態的新增一個東西
你這個問題不太清楚
如果你是說想要修改一個已經編譯好的程式、且編譯該程式時沒有預期會要修改的話
很難,不是菜鳥該碰的
如果你要修改的是別人的程式的話就更難
如果是你自己的,直接修改原始程式碼重新編譯一次就好了,不需要拿編譯出來的東西來修改

如果你是希望在程式運行中動態地增加變數之類的東西
基本上是用new跟delete,稱為動態配置
int otherthing;
int *something=new int;
*something=10;
otherthing=*something-3;
delete something;

上例中,something是個指標(如果不懂指標就先去學,整個動態配置系統都要用到指標)
程式編譯的時候只有something這個指標存在
它所指向的東西是到了new那行才正式誕生
用完後要記得用delete把那塊記憶體還給電腦,在那之後就不能使用*something了

動態配置主要是用來自己控制變數的生命期,或是製造不固定長度的陣列
class SomeObject *obj=new SomeObject(arg0,arg1,arg2ofConstructor);
obj->someMethod(arg);
delete obj;

int arrNum;
arrNum<<cin;
int *arr=new int[arrNum];
for(int i=0;i<arrNum;i++)
arr[i]=i*i;
delete [] arr;

如果你要動態配置的是Qt畫面上的東西,就要去找Qt的文件,理論上應該可以


>>還有已經宣告好的類別要怎麼樣去擴展它?( 另外加一些函式之類的
直接修改class宣告就好了
只要不造成衝突,舊有的code本來就是能讓你隨意修改的
除非你要擴展Qt內部的東西,那就真的要繼承換一個名字

>>我想要在程式關掉之後下次再開還能保有上次原來的一些資料可以怎麼做?
存成一個檔案
C++的標準檔案處理叫fstream,用起來跟iostream(cin/cout)差不多
無名氏17/07/26(三)23:40:15 ID:9X3i8mnwNo.12299
呃...
太久沒用iostream,把cin打反了
上面的arrNum<<cin;請改成cin>>arrNum;
無名氏17/07/27(四)07:02:28 ID:sCdS/9xcNo.12300
檔名:1501110148328.jpg-(87 KB, 700x700)
87 KB
>>12298
謝謝你

>>我想問如果想要在已經編譯好的程式裡面在運行過程中動態的新增一個東西
像是程式跑了之後我希望按按鈕就能透過按鈕的功能新增一些物件到視窗上
然後我希望新增的物件能夠就像跟這個程式是一體的一樣
可以跟原來的物件互動( 像是檢查時間有沒有到然後跳出提醒視窗之類的 )
後來躺著想一想之後有想到大概可以怎麼做了
無名氏17/07/27(四)18:33:39 ID:alaxqqBINo.12301
>>像是程式跑了之後我希望按按鈕就能透過按鈕的功能新增一些物件到視窗上
那就是我所謂的
>>如果你要動態配置的是Qt畫面上的東西,就要去找Qt的文件,理論上應該可以
一般來說是用動態配置新增物件,然後呼叫某些函式傳給Qt本體
所以你還是要先搞懂動態配置才能活用

幫你稍微查了一下
https://stackoverflow.com/questions/17989231/how-to-add-buttons-to-a-main-window-in-qt
這個人的問題跟你一樣
你可以參考他用了哪些參數
然後依照下面的回答用setCentralWidget把這個新物件傳給Qt知道


或是你不想用動態配置那種複雜的方式的話
可以一開始就放幾個隱形物件,需要的時候再變成可顯示
這樣靈活度很低,但也簡單很多
無名氏17/07/27(四)21:11:35 ID:t/wx/pUENo.12302
QT我不懂C++也忘光
但你的問題其實很簡單,卻會讓聽的人想太複雜
因為你想要的根本不是去搞破解
其實你只是要dynamic objects
你的說法會讓人誤會~
所以你只要google時都多加一個dynamic的關鍵字上去就好了
例如: "QT" dynamic objects
或 "QT" dynamic add button to xxx

dynamic的概念就是
將新的控制項加入某個現有容器中
例如要在視窗呈現(下面是假代碼)
就是
1.建立新控制 c=>new Control()
2.將其加入視窗 window.add(c)
3.確認或運作它 c.runIt() or window.runIt()
4.畫面更新後保持它

>>我想要在程式關掉之後下次再開還能保有上次原來的一些資料可以怎麼做?

如果你找不到好方法,就土法煉鋼先試著自己定義一個檔案去寫入,格式自訂,例如古早的遊戲都是用csv格式存成一個文字檔然後改名叫做.dat
ex:a,b,c,d,xxx,ddd,ttt
然後程式開啟時去讀取它再看你要做什麼動作
好讀一點的格式就存成json格式
高級一點就是存資料庫
不過我不知道你說的QT能不能存資料庫或解析json

>>下次再開還能保有上次原來的一些資料可以怎麼做?
當你懂得怎麼使用dynamic objects的概念
以及懂得怎麼透過某個方法存取資料後
就是在程式開啟,以及畫面更新之類的時候,要保持它,或者重新產生它,如果你用的QT這個東西,有好的方式可以達成dynamic機制,那是最好,否則就是每次都重新產生
如:
main()
{
if(hasData)
loadDataAndReCreateObject();

//做些事情...
}

loadDataAndReCreateObject()
{
//取得資料解析並回傳
}


這只是概念,看你能理解多少,然後再去google
無名氏17/07/30(日)17:13:28 ID:X7RTpk9QNo.12316
檔名:1501406008706.jpg-(57 KB, 500x412)
57 KB
可以再問問題嗎
我大概想做一個提醒器然後時間到就跳出視窗說該做什麼事了
要是我想把資料存到一個叫"schedule.dat"的檔案上
那麼我可以讓schedule.dat跟exe執行檔合為一體嗎
就是存檔就在執行檔裡面
不要存到外面來給人看
無名氏17/07/30(日)21:21:33 ID:xLMwRwu.No.12320
>>12316
理論上可以
不過我沒玩過,不知道怎麼弄
編譯器應該有參數能調,這可能要等別人來回答或自己估狗
或是無腦一點自己寫一個程式把外部檔案轉成變數宣告

但如果你的外部檔案是會變更的,就更麻煩一點
因為這等於你的exe要把自己的exe檔拿來改寫
我會建議你先把dat放外部,等整個程式順了再來想怎麼併進exe
如果不想放外部是為了美觀問題的話,可以塞到比較冷僻的路徑裡
無名氏17/07/31(一)02:43:44 ID:SA21fHMENo.12322
>>12316
1.windows系統的話可以放登錄檔
2.外部檔案善用加密即可(aes 3des...等)
無名氏17/07/31(一)08:21:45 ID:xHgO6Ki2No.12326
檔名:1501460505579.jpg-(154 KB, 1075x494)
154 KB
剛剛發現有"資源"這個東西可以把想用的檔案嵌入到程式裡面
也可以供讀寫
只是不知道為什麼看別人的程式碼用resource需要在加:變成:/而我的不用

>>No.12320
是為了美觀也特地弄出靜態編譯
是希望整團東西只需要包在一個執行檔裡面就好了不要生出什麼存檔文件看起來很煩躁又占空間
無名氏17/08/02(三)03:07:38 ID:BIHI0h0ENo.12332
>>12326
1. Resource是用來方便開發者管理靜態檔案,沒有能將靜態檔案包裝到執行檔的效果。
2. 路徑加上冒號是讓Qt知道你指定的檔案是被Resource管理的,沒加冒號就是用系統路徑
3. 進行windeployqt後,也會拉一堆dll檔跟你的執行檔放一起,只有一個執行檔是無法運作的(除非你只想在自己的開發環境上執行)。

【刪除文章】[]
刪除用密碼: