嗯,
說到最近,
說實在的,時間還蠻多的(因為,我感覺到我浪費很多時間)~
每每看到新聞還是網路上,
有人都非常認真到時間不夠~
就覺得實在非常心虛,
有時候今天讀不完,但是,常拿要保持作習正常來當藉口,
明天再把要讀的讀完~
常常這樣就沒有應有的進度~
另外,fuzzy的課,應該不會去上了~
因為,單單做一個模擬器不加上fuzzy的功能,就要非常多的時間,
我想這一個功能,若有學弟的話,就留給他們做吧~
人不是萬能的,不需要每一件事情都要自己做~
不過,我發現,我花很多時間在雜事上,每三十分鐘會開網頁或是bbs來看~
我現在實在很想早上到晚上六點之前在圖書館,然後,晚上六點之後才來實驗室~
說實在的,沒有電腦在的環境,我的讀書效率比較高~
想到準備研究所的那一段時間,其實我也是可以把時間利用的很好的~
加油!!
感覺是因為沒有給自己進度的壓力,所以,才會一直拖,由現在開始,要給自己明確的進度~
2008年12月29日 星期一
時間利用率非常低落
2008年12月28日 星期日
Qt - 在座標不動,放大縮小
為了要顯示無線網路的無線波,必需要知道如何讓空心圓在原地放大縮小。
因此,透過scale可以放大縮小整個圖的某一個元件。
在每一個GraphicsItem都有一個自己的座標系統,而放大縮小與旋轉都是依自己的座標系統的原點來決定的。
例如以下的程式碼:
QGraphicsEllipseItem *ball = new QGraphicsEllipseItem(0,0,30,30);
就是建立一個直徑為30pixel的圓,且其左上角剛好在自已的座標系統的(0,0)
若這個時候用放大的話,會依原點放大,所有,它會往右下角放大
QGraphicsEllipseItem *ball = new QGraphicsEllipseItem(-15,-15,30,30);
這個因為設定圖的左上角是在此小座標系統的(-15,-15),所以,(0,0)剛好是在圖的球心,這個時候放大,就會根據原點放大~
而把這一個放到QGraphicsScene的(0,0),則要在QGraphicsScene的函數中
MyScene::MyScene(qreal x,qreal y,qreal width,qreal height,QObject *parent):QGraphicsScene(x,y,width,height,parent) {
QGraphicsEllipseItem *ball = new QGraphicsEllipseItem(-15,-15,30,30);
addItem(ball); // 把這一個圓加入此QGraphicsScene中
ball->setPos(this->width()/2,this->height()/2); // 設定球的小座標系統的左上角落在QGraphicsScene的(width()/2,this->height()/2)這一個位置
}
安裝Qt for XP and Ubuntu
在Ubuntu下安裝Qt有兩個方法:
1. 透過apt-get
[user@host ~]$ sudo apt-get install qt4-designer qt4-doc qt4-dev-tools qt4-qtconfig
不過透過上面的方法,得到的版本是Qt4.3.2的版本
2. 到官方網站下載原始碼,自己編譯,這裡下載的是qt-x11-opensource-src-4.4.3.tar.gz
不過,若用此方法的話,要執行demo程式,直接打指令列qtdemo就可以啦
先解壓縮檔案吧~
[user@host ~]$ sudo tar -zxvf qt-x11-opensource-src-4.4.3.tar.gz
進入資料夾後
[user@host ~]$ ./configure -help
這樣會列出幾頁參數,可以調整一堆雜七雜八的安裝內容 ( 其實預設就差不多了 )。比較重要的是預設 -shared 會讓之後編譯 Qt 專案時產生較小 binary file,需要使用 shared library,沒有 library 的系統不能跑。
而 -static 則會包 runtime library 進去,不過檔案大小會增加很多。
-shared 和 -static 可以並存,但是需要個別 configure & make 在不同的資料夾 ( 用 -prefix 來設定安裝路徑 )。
確定後開始 configure
為了保持相容性,我基本上不會加上-no-qt3support
[user@host ~]$ ./configure -no-qt3support -optimized-qmake
[user@host ~]$ make
若出現X11/Xlib.h: No such file or directory
則要安裝libx11-dev
出現cannot find -lXext
則要安裝libxext-dev
(其實,這裡有一個偷吃步,先用sudo apt-get install qt4-designer qt4-doc qt4-dev-tools qt4-qtconfig,它會幫你安裝所有相依的套件,到時候再移除以上四個檔案,再用手動安裝目前這一個步驟)
[user@host ~]$ sudo apt-get install libx11-dev libxext-dev
[user@host ~]$ sudo make install
預設是用 -shared 裝在 /usr/local/Trolltech/Qt-4.3.1,編譯完之後大約為 410MB。-static 則約 1.2GB ( 因為每個 example application / demonstration 都會包 runtime library 進去... )。
安裝完成了,就要調校 $PATH 變數啦!免得 compile 時啥 header 都找無。
到.bashrc下加入這一行
PATH=/usr/local/Trolltech/Qt-4.4.3/bin:$PATH
完成啦~
在Windows XP安裝Qt:
1. 在 http://www.bloodshed.net/devcpp.html 下載最新版的 Dev C++,直接下載含 MinGW 的版本
2. 在 http://trolltech.com/products/qt 下載 Qt 4.x Open Source (MinGW) for Windows
3. 安裝 Dev C++
4. 安裝 Qt 4.x,在 Previously installed MinGW 中設定 Dev C++ 的安裝位置
5. 開啟主控台,切換到 Qt 安裝目錄的 bin 目錄下,執行 qtvars.bat compile_debug 建置 Debug library,這要一些時間,去作些別的事吧!(這兩個選項可以在程式集下的Qt找到喔)
6. 要 make 寫好的程式,執行 qtvars.bat 可以幫你設好一些 Qt 所需的環境變數,以後要執行qmake,或make都必需要透過此qtvars.bar去執行
7. 另外,跑完之後,要把編譯過程中的檔案刪掉,就請到qtvars.bat執行make clean
參考資料:
在Ubuntu下安裝Qt
在Windows XP下安裝Qt
2008年12月27日 星期六
讓Qt程試碼可以在windows xp下執行
Qt是一個跨平台的函式庫,
然後,我希望我寫的程式可以在windows和linux下都可以跑~
在windows下安裝Qt請參考良葛格學習筆記
在linux下,寫好程式碼之後,
用qmake -project指定產生.pro檔,
再用qmake依.pro產生Makefile檔
再make編譯程式,就這樣,非常簡單
但是,在windows下,依上面的步驟,確出現錯誤,找不到檔案,
決解方法就是到Makefile.Debug在INCPATH的最後面加入所有我們自己所建立的header file的目錄…
例:
INCPATH = -I"c:\Qt\4.4.3\include\QtCore" -I"c:\Qt\4.4.3\include\QtCore" -I"c:\Qt\4.4.3\include\QtGui" -I"c:\Qt\4.4.3\include\QtGui" -I"c:\Qt\4.4.3\include" -I"." -I"c:\Qt\4.4.3\include\ActiveQt" -I"debug" -I"." -I"c:\Qt\4.4.3\mkspecs\win32-g++" -I"src\widget" -I"src\items"
後面藍色的部分就是我新增的部分~
解決!!
[2009.02.06] 補充
在觀查完linux與windows下的*.pro檔之後,知道為什麼會出現這一個問題了。
可能是windows下運行qmake -project的程式沒有寫好吧~
在windows下qmake -project下的*.pro的INCLUDEPATH的欄位只有 .
所以當然就找不到我所需要的header file啦~
只要在後面加上所有的header file的路徑即可,此問題只有在windows下用qmake -project會出現
TEMPLATE = app
CONFIG = qt warn_on release
DESTDIR = ./ # 執行檔被建立後,擺放的位置
HEADERS = miniwin.h # 我們建立的class header
SOURCES = miniwin.cpp \ # 我們建立的class主程式
main.cpp
INCLUDEPATH += ./ # 指定include的路徑,例如/usr/local/xxx.h,則要加入/usr/local
DEPENDPATH += ./ # 所有cpp檔案的路徑
LIBS += # 指定要使用到的Library,應該是.so之類的動態library
INTERFACES =
TARGET = miniwin # 被建立的執行檔名稱
[2013.01.05 補充]
今天嘗試在Windows XP安裝Qt 4.8.4的流程如下:
先去下載MinGW Compiler for Windows,
因為,我們要下載的Qt 4.8.4是指定要MinGW 4.4 Compiler,
若用比較新的MinGW反而會有一些不預期的問題,
所以,要先去尋找MinGW 4.4,
不過,現在大部分官方網站都找不到MinGW 4.4,
我是直接用MinGW-gcc440_1.zip關鍵字在網路上尋找,
一下子就找到了。
下載頁面
下載之後,把它解壓縮到C:\MinGW
再來是安裝Qt,
Qt的下載頁面
下載完後,裡面就已經有編譯好的Demo的application,
如果要重新compiler成Open source的license的話,則必需要重新Compiler,則在
「開始」→「所有程式」→「Qt by Digia v4.6.4 (MinGW OpenSource)」→「Qt 4.6.4 (Build Debug Libraries)」
這樣會重新開始編譯所有demo的source code。
Build完之後,直接打qtdemo就可以執行demo的application了。
若一般的compiler自己的程式的話,則使用
「開始」→「所有程式」→「Qt by Digia v4.6.4 (MinGW OpenSource)」→「Qt 4.6.4 Command Prompt」
會把Qt的環境設定好。
Build code的流程請參考如何build出不需要另外建置環境的QT exe檔
QtCreator則是用Qt Creator 2.6.1的版本
可以完整編譯完qtdemo的組合
因為不像windows其它IDE一樣,全部都是包好的情況下,
所以,記錄一下整合的版本
[MinGW-gcc440_1.zip]
[qt-creator-windows-opensource-2.6.1.exe]
[qt-win-opensource-4.6.4-mingw.exe]
參考資料:
用QT建立一個基本視窗
windows上安装MinGW 4.4、Qt library 4.8.4和Qt Creator
2008年12月26日 星期五
Qt 資源系統
在qt4中,可以透過資源系統,把圖片嵌入到程式碼中。這樣圖片不見,也沒有關係啦~
Qt 資源系統(Resource System)可以提供與平台無關的機制,讓您把應用程式的圖檔、語系檔、資料等儲存於可執行檔之中,避免相關的資源檔案遺失的問題,Qt資源系統是基於 qmake、rcc(resource compiler),並搭配QFile來使用,您必須在產生的.pro檔之中,告知資源群集檔(Resource Collection File)的位置與名稱。
資源群集檔的副檔名為.qrc,實際的內容為XML格式的檔案,當中告知了這個應用程式所要使用到的資源檔案,例如您想要將QListWidget 與 QListWidgetItem 中所使用到的圖檔儲存在可執行檔案之中,則可以撰寫一個resourcefile.qrc:
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>images/bee_head.jpg</file>
<file>images/bush_head.jpg</file>
<file>images/cat_head.jpg</file>
<file>images/caterpillar_head.jpg</file>
<file>images/momor_head.jpg</file>
</qresource>
</RCC>
檔案的路徑是相對於.qrc檔案的位置。接著您要在產生的.pro檔案中,增加一行,告知.qrc檔案的位置,例如:
RESOURCES = resourcefile.qrc
qmake會產生出製造qrc_resourcefile.cpp的規則,之後使用rcc產生.cpp檔案,當中會將想要嵌入的相關檔案,壓縮並轉換為代表二進位資料的C++靜態無號字元陣列,如果您的.qrc檔案內容有變動,在編譯時.cpp檔案也會重新產生。
如果要使用嵌入的資源,則要在路徑的前端放置:/,例如:
QListWidget *listWidget = new QListWidget;
listWidget->insertItem(0, new QListWidgetItem(QIcon(":/images/caterpillar_head.jpg"), "caterpillar"));
listWidget->insertItem(1, new QListWidgetItem(QIcon(":/images/momor_head.jpg"), "momor"));
listWidget->insertItem(2, new QListWidgetItem(QIcon(":/images/bush_head.jpg"), "bush"));
listWidget->insertItem(3, new QListWidgetItem(QIcon(":/images/bee_head.jpg"), "bee"));
listWidget->insertItem(4, new QListWidgetItem(QIcon(":/images/cat_head.jpg"), "cat"));
您也可以為資源檔案的路徑設置別名(Alias),例如:
<file alias="caterpillar_head.jpg">images/caterpillar_head.jpg</file>
之後在程式中指定路徑時,就可以直接使用別名,例如:
listWidget->insertItem(0, new QListWidgetItem(QIcon(":/caterpillar_head.jpg"), "caterpillar"));
您也可以為別名設置前置(Prefix),例如:
<qresource prefix="/resources">
<file alias="caterpillar_head.jpg">images/caterpillar_head.jpg</file>
</qresource>
之後每個別名都會自動加上前置,使用時如下:
listWidget->insertItem(0, new QListWidgetItem(QIcon(":/resources/caterpillar_head.jpg"), "caterpillar"));
您也可以搭配語系來使用嵌入的資源檔,例如若這麼設定:
<qresource>
<file>caterpillar_head.jpg</file>
</qresource>
<qresource lang="zh_TW">
<file alias="caterpillar_head.jpg">caterpillar_head_zh_TW.jpg</file>
</qresource>
當路徑指定為:/caterpillar_head.jpg,如果使用者是使用zh_TW語系,則會自動對應使用caterpillar_head_zh_TW.jpg,此一方法也可以用來載入.qm檔案,以實現多國語系支援,可參考 翻譯應用程式 與 多國語系選擇與切換。
參考資料:
Qt資源系統
全域變數
區域變數就是只能在一個區塊中被使用
例:
void foo1(){
int x=4;
cout << x << endl;
}
void foo2(){
cout << x << endl; // 出現錯誤
}
以上這一個例子的x就是區域變數,只能在foo1()內使用而不能在foo2()內使用。
而全域變數的例子呢
int x=4;
void foo1(){
cout << x << endl;
}
void foo2(){
cout << x << endl;
}
而以上的例子的x可以在foo1()與foo2()使用,而這就是全域變數。
#include <iostream>
#include <string>
using namespace std;
string color("red");
void local();
int main()
{
extern string color; // 告知這一個變數宣告在別處,這裡是可以省略的,因為是在同一個檔案,若string color("red");是在其它檔案,而且我們沒有include進來,則這一行就是必要的
cout << "Global color: " << color << endl;
local();
return 0;
}
void local()
{
string color("blue");
cout << "Local color: " << color << endl;
cout << "Global color: " << ::color << endl;
}
透過::運算子告知,我要全域變數的color,而沒有加::的表示,選擇宣告比較近的那一個
2008年12月25日 星期四
exit()與return()的差別
在main函數中我們通常使用return (0);這樣的方式返回一個值。
但這是限定在非void情況下的也就是void main()這樣的形式。
exit()通常是用在例程中用來終結程式用的,使用後程式自動結束跳會作業系統。
但在如果把exit用在main內的時候無論main是否定義成void返回的值都是有效的,並且exit不需要考慮類型,exit(1)等價於return (1)
參考來源:
exit()與return()的差別