2010年6月8日 星期二

Qt 的SIGNAL & SLOT

以下示範 將多個Object的SIGNAL導向到同一個SLOT
在SLOT的函數中藉由Sender()轉型取得Button的Text來判斷
是哪一個Button被按下

#include
#include "dialog.h"
#include "ui_dialog.h"
static QString DialButtonText[]={"1","2","3","4","5","6","7","8","9","*","0","#"};
#define ARRAYSIZE(x) sizeof(x)/sizeof(x[0])

Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog)
{
ui->setupUi(this);
QGridLayout *layout = new QGridLayout;
layout->setColumnStretch(1, 1);
layout->setColumnMinimumWidth(1, 80);
m_Label=new QLabel("Hello");
layout->addWidget(m_Label,0,0,1,1);
int Index=0;
for(int IndexRow=0;IndexRow<4;IndexRow++)
{
for(int IndexCol=0;IndexCol<3;IndexCol++,Index++)
{
QPushButton *Button=new QPushButton(DialButtonText[Index]);

layout->addWidget(Button, IndexRow+3, IndexCol,1,1);
connect(Button,SIGNAL(clicked()),this,SLOT(DoDigitClick()));
}
}
setLayout(layout);
}

Dialog::~Dialog()
{
delete ui;
delete m_Label;
}
void Dialog::changeEvent(QEvent *e)
{
QDialog::changeEvent(e);
switch (e->type())
{
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}

void Dialog::DoDigitClick()
{
QPushButton *button = qobject_cast(sender());
for(int nIndex=0;nIndex {
if(button->text().compare(DialButtonText[nIndex])) continue;
m_Label->setText(m_Label->text()+DialButtonText[nIndex]);
switch(nIndex)
{
case 0://1 break;
case 1://2 break;
case 2://3 break;
case 3://4 break;
case 4://5 break;
case 5://6 break;
case 6://7 break;
case 7://8 break;
case 8://9 break;
case 9://* break;
case 10://0 break;
case 11://# break;
}
}
}

2010年6月4日 星期五

Qt Windows Mobild on Qt Creator

Qt Windows XP Path [C:\Qt\2010.02.1]
Qt Windows Mobile Path [C:\Qt_embedded\wince4.5.3]

以Qt Windows XP下的範例[C:\Qt\2010.02.1\qt\examples\widgets\digitalclock]示範
將digitalclock.cpp,digitalclock.h,main.cpp,digitalclock.pro
複製到C:\Qt_embedded\wince4.5.3\workspace\digitalclock\

C:\Qt_embedded\wince4.5.3\workspace\digitalclock>qmake -tp vc -o digitalclock.vcproj
使用Visual studio 2005開啟剛剛建立的digitalclock.vcproj即可

qmake -tp vc的錯誤

在做.pro轉換到Visual studio project的轉換中如果target路徑不在Qt的路徑下,則可能會出現如下錯誤

D:\workspace\spinboxes>qmake -tp vc
WARNING: Unable to generate output for: D:/workspace/spinboxes//Makefile.Debug [TEMPLATE vcapp]
WARNING: Unable to generate output for: D:/workspace/spinboxes//Makefile.Release [TEMPLATE vcapp]
如果要解決如下問題,設定下列環境變數,便可解決
D:\workspace\spinboxes>set QMAKESPEC=win32-msvc2005

2010年6月2日 星期三

QT for windows Mobile6+visual studio 2005

step 1 .軟體準備
1.Visual studio 2005 Professional
2.ActiveSync 4.5
3.Windows Mobile Professional 6.0 SDK
4.Qt for Windows Mobiles此處所使用的版本為 qt-embedded-wince-opensource-src-4.5.3.zip
關於Qt的各個平台版本 可以到下列網址去下載
http://ftp3.ie.freebsd.org/pub/trolltech/pub/qt/source/
詳細的官方說明 http://doc.trolltech.com/4.5/install-wince.html

Step 2. 安裝
1.將上述軟(1,2,3)安裝完後,並將qt-embedded-wince-opensource-src-4.5.3.zip解壓到 C:\Qt_embedded\wince4.5.3
2.將路徑"C:\Qt_embedded\wince4.5.3\bin"加到windows XP的環境變數PATH中 "ControlPanel->System->Advanced->Environment variables"
3.執行Configure C:\Qt_embedded\wince4.5.3\configure -platform win32-msvc2005 -xplatform wincewm60professional-msvc2005 其中的-xplatform選項可以參考C:\Qt_embedded\wince4.5.3\README,此版本共有下列選項可選,此處約花10min

wince50standard-x86-msvc2005
wince50standard-armv4i-msvc2005
wince60standard-armv4i-msvc2005
wincewm50pocket-msvc2005
wincewm50smart-msvc2005
wincewm60professional-msvc2005
wincewm60standard-msvc2005
4.設定環境變數,可以用setcepaths這個script來完成
C:\Qt_embedded\wince4.5.3\setcepaths wincewm50pocket-msvc2005

5.nmake ...這邊大概要花2 Hour以上...

2008年1月24日 星期四

Member Initialization List

Member Initialization List

常常有人搞不清楚example 1 & example 2的效果有何差異,在大多數的情況下,此兩方法的結果相等,
然而在某些情況下,變不一樣.因此往往也會有暗藏陷阱存在.
對於example 1而言,此方法稱之為在建構式中賦予值(assignment),此時對Class data member來說早已
執行過其construct,因此此時不過是在付予值而已,所以對_name=""變顯得沒必要.
對於example 2而言,此時期Data member尚未逕行Initialization,所以此時寫在:之後的都是指定
成員函數所使用的construct


1.在進行member initialization,其initialiation的順序是根據Class內的member順序而來,而非在
Initialization所指定的順序
2.每一個data member只能Initialization 一次
3.另外,對於兩種資料型態const ,reference 兩種值,因為要在事先必須付予值,所以就必須要採用
member initialization的方式指定值,而不是在事後的construct中賦予值


參考:C++ primer 3/e

Template