锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍐嶈繘琛屽疄闄呮搷浣滀箣鍓嶏紝鍏堟潵鎼炴竻妤氬嚑涓熀紜鐭ヨ瘑銆? 鍐呮牳瑁呰澆鍣↙oader錛屽畠鐨勪綔鐢ㄦ槸鎶婂唴鏍鎬粠澶栭儴瀛樺偍鍣紝縐誨姩鍒板唴瀛樹腑銆傚畠鍙綔榪欎釜浜嬫儏錛屼竴鏃﹀畬鎴愪簡璋冨叆鍐呮牳鐨勫伐浣滐紝Loader灝辮煩杞埌鍐呮牳浣嶇疆寮濮嬫墽琛屻備笉鍚屾灦鏋勬湁涓嶅悓鐨?Loader錛屽湪x86緇撴瀯鐨凱C涓婏紝閫氬父浣跨敤鐨刲oader鏈塋ILO,GRUB,syslinux,syslinux鍦ㄥ祵鍏ュ紡linux涓篃鍚屾牱宸?浣溿傚叾浠栭潪x86鏋舵瀯鐨勫簲鐢ㄤ腑錛屼綘蹇呴』浣跨敤涓撻棬鐨刲oader錛屾垨鑰呰嚜宸辯紪鍐檒oader鏉ヨ鍏ュ唴鏍搞備篃鏈変笉浣跨敤loader鐨勬儏鍐碉紝緋葷粺鍔犵數浠ュ悗錛屽唴鏍?鐩存帴浠庣儳褰曟湁鏄犺薄鐨凢lash涓婂紑濮嬫墽琛屻? 鍐呮牳錛屼竴鏃﹀唴鏍稿紑濮嬫墽琛岋紝瀹冨皢閫氳繃椹卞姩紼嬪簭鍒濆鍖栨墍鏈夌‖浠訛紝榪欏彲浠ヤ粠鎴戜滑鐨刾c鏈虹洃瑙嗗櫒鐨勮緭鍑虹湅鍑?鏉ワ紝姣忎釜椹卞姩紼嬪簭閮芥墦鍗頒竴浜涙湁鍏沖畠鐨勪俊鎭傚垵濮嬪寲瀹屾垚鍚庯紝璁$畻鏈哄氨鍑嗗榪愯宓屽叆寮忓簲鐢ㄣ備篃璁鎬竴涓紝涔熻鏄涓簲鐢ㄧ▼搴忕粍鎴愪簡宓屽叆寮忓簲鐢紝浣嗛氬父棣栧厛璋冪敤鐨?鏄痠nit(閫氳繃loader 鍚戞牳蹇冧紶鍏nit=/program 鍙互瀹氬埗棣栧厛榪愯鐨勭▼搴?銆傛闈inux涓紝init浼氳鍙?etc/inittab鏂囦歡錛屾潵鍐沖畾鎵ц綰у埆鍜屽摢浜涜剼鏈拰鍛戒護銆傚祵鍏ュ紡搴旂敤涓紝鍙互鏍規嵁瀹?闄呯殑鎯呭喌鍐沖畾鏄惁浣跨敤鏍囧噯鐨刬nit鎵ц鏂瑰紡錛屼篃璁歌繖涓猧nit鏄釜闈欐佺▼搴忥紝瀹冭兘澶熷畬鎴愭垜浠殑宓屽叆搴旂敤鐨勭壒瀹氫換鍔★紝閭e畬鍏ㄤ笉鐢ㄨ冭檻inittab浜嗐? initrd 鏂囦歡緋葷粺錛宨nitrd浠ヤ竴縐嶆妸鍐呮牳浠庡瓨鍌ㄤ粙璐ㄨ鍏ュ埌鍐呭瓨鐨勭浉鍚岀殑鏈哄埗鏉ヨ鍏ヤ竴涓皬鍨嬫枃浠剁郴緇熴傝繖涓枃浠剁郴緇熸渶濂芥槸浠ュ帇緙╃殑鏂瑰紡瀛樺偍鍦ㄤ粙璐ㄤ笂鐨勶紝瑙e帇緙╁埌 RAM鐩樹笂銆傞氳繃浣跨敤initrd,鍖呭惈鏈夋牳蹇冮┍鍔ㄥ拰鍚姩鑴氭湰鐨勫皬鏂囦歡緋葷粺錛屽氨鍙互鐩存帴浠庝粙璐ㄤ笂鍜屽唴鏍鎬竴璧峰惎鍔ㄨ搗鏉ワ紝鍐呮牳灞婂帇緙╄繖涓枃浠剁郴緇燂紝騫舵墽琛岃繖涓?鏂囦歡緋葷粺涓婂彨鍋?linuxrc鐨勮剼鏈枃浠訛紝榪欎釜鑴氭湰閫氬父浼氭妸鍚姩榪囩▼涓墍闇瑕佺殑椹卞姩紼嬪簭瑁呭叆銆傝剼鏈鍑轟互鍚庯紝initrd鏂囦歡緋葷粺涔熷嵏涓嬩簡錛屽惎鍔ㄨ繃紼嬭繘 鍏ョ湡姝e垵濮嬪寲榪囩▼銆傚浜庡祵鍏ュ紡鏉ヨ錛屽彲浠ュ皢闇瑕佺殑搴旂敤杞歡閮借繍琛屽湪榪欎釜initrd鏂囦歡緋葷粺涓婏紝鍙/linxrc鏂囦歡涓嶇粨鏉燂紝鍐呮牳鍚姩榪囩▼鐨勫叾浠栭儴鍒嗗氨涓嶄細緇х畫銆?nbsp; 鍙傝冭祫鏂欙細http://support.microsoft.com/kb/886348/zh-cn
鍦ㄨ璁″祵鍏ュ紡搴旂敤鐨勬椂鍊欙紝鍙互涓嶆寜鐓ц繖縐嶅眰嬈★紝搴旂敤紼嬪簭瓚婅繃C搴撶洿鎺ュ拰鍐呮牳浼氳瘽錛屾垨鑰呮妸搴旂敤鍜屽唴鏍告崋緇戝湪涓璧鳳紝鐢氳嚦鍙互鎶婂簲鐢ㄥ啓涓哄唴鏍哥殑涓涓嚎紼嬶紝鍦ㄥ唴鏍鎬腑榪愯錛岃櫧鐒惰繖鏍峰湪縐繪涓婂甫鏉ヤ簡鍥伴毦錛屼絾鑰冭檻宓屽叆寮忕郴緇熷灝哄瑕佹眰灝忕殑鐗圭偣錛屾槸瀹屽叏鍙鐨勩備笉榪囨垜浠嬌鐢ㄤ笁灞傝蔣浠剁粨鏋勭殑妯″紡鏉ュ涔犲祵鍏ュ紡linux灝嗕細鏄垜浠璇嗘洿娓呮櫚錛岀畝鍗曞彲琛屽茍浣垮簲鐢ㄥ叿鏈夊脊鎬с?
蹇熷叆闂?/strong>
鏈綆鍗曠殑寤虹珛宓屽叆寮廘inux搴旂敤鐨勬柟娉曞氨鏄粠鎴戜滑浣跨敤鐨勬闈inux鍏ユ墜錛屽畨瑁呬竴涓枩鐖辯殑鐗堟湰錛屾妸鎴戜滑鐨勬煇涓簲鐢ㄤ綔涓哄垵濮嬪寲鐨勪竴閮ㄥ垎錛屾鏋跺氨綆楀畬鎴愪簡銆?/span>
褰撶劧錛屽祵鍏ュ紡linux搴旂敤榪滄瘮鎴戜滑鐨勬闈㈢増鏈姛鑳界畝鍗曚笓涓錛屽畠涔熻灝辨槸涓涓敤浜庤凍褰╃殑緇堢鏈猴紝鎴栨槸涓涓暟鐮侀煶棰戞挱鏀懼櫒錛岃繖浜涚郴緇熼櫎浜嗕嬌鐢ㄥ祵鍏ュ紡CPU澶栵紝浠呬粎鍐嶉渶瑕佷竴涓覆鍙o紝緗戝彛絳夊皯閲忕殑杈撳叆杈撳嚭鎺ュ彛灝卞彲浠ュ畬鎴愬畠浠壒瀹氱殑搴旂敤浜嗐?
鍦ㄨ蔣浠朵笂錛屽畠鍙互鎸夌収涓夊眰鐨勬蹇電敱鍐呮牳瑁呰澆鍣紝瀹氬埗鐨勫唴鏍稿拰杈冨皯鐨勪負鐗瑰畾浠誨姟璁捐鐨勯潤鎬佽繛鎺ョ殑搴旂敤紼嬪簭緇勬垚銆備箣鎵浠ヤ嬌鐢ㄩ潤鎬佽繛鎺ョ殑搴旂敤紼嬪簭錛屾槸鍥犱負灝戦噺鐨勯潤鎬佽繛鎺ョ▼搴忔墍瑕佺殑瀛樺偍絀洪棿錛屾瘮鍚屾牱鏁伴噺鐨勫姩鎬佽繛鎺ョ殑紼嬪簭鎵鍗犵殑絀洪棿灝忥紝榪欎釜騫寵 鐐歸渶瑕佹垜浠湪瀹為檯寮鍙戜腑鍘昏幏鍙栥備篃璁鎬綘姝e湪璁捐鐨勬槸涓狿DA錛屽畠鐨勫簲鐢ㄧ▼搴忚緝澶氾紝閭d箞浣犲緢鍙兘灝辮浣跨敤鍔ㄦ佽繛鎺ョ▼搴忔潵鍑忓皯瀛樺偍絀洪棿銆傚湪浣犵殑/bin鎴栬?sbin鐩綍涓嬶紝鐢ㄥ巶鍒楄〃鐪嬬湅bash,ifconfig,vi...錛屼篃璁稿彧鐢ㄥ嚑鍗並錛屽綋浣犺繍琛?ldd /bin/bash 鏃訛紝浣犱細鐪嬪埌瀹冧滑閮藉拰濂藉嚑涓簱鏂囦歡鐩歌繛銆傚ソ浜嗭紝榪欐牱鐪嬫潵錛屾垜浠緱鎶奝C鎯沖儚鎴愪竴涓祵鍏ュ紡紜歡騫沖彴錛屽啀閲嶆柊鍒朵綔涓涓壒瀹氬姛鑳界殑宓屽叆寮弆inux銆?
鍩虹鐭ヨ瘑
鍋氫釜璇曢獙錛?
cp /boot/initrd-2.4.20.img /tmp
cd /tmp
mv initrd-2.4.2-.img initrd.img.gz
gunzip initrd.img.gz
mount -o loop initrd.img /mnt
cd /mnt
ls
cat linuxrc 鍙互鐪嬪埌閲岄潰鎵ц浜嗗姞杞戒簡涓や釜妯″潡鐨勬搷浣滐紝浣犲湪鍚姩linxu鐨勬椂鍊欎細鐪嬭灞忓箷鎵撳嵃淇℃伅銆?
鍏ラ棬璇曢獙錛屽埗浣滀竴涓畝鍗曠殑搴旂敤
鎴戜滑浣跨敤涓寮犺蔣鐩樺惎鍔ㄤ竴鍙板亣璞$殑鍙湁涓涓覆鍙o紝閿洏杈撳叆錛屾樉紺鴻緭鍑虹殑x86鏋舵瀯鐨刲inux緋葷粺錛屾墽琛岀殑鐗瑰畾搴旂敤灝辨槸榪愯minicom錛岄氳繃涓插彛鎷ㄥ彿銆傞渶 瑕佽蔣浠? minicom-xx.src.tar.gz 鍜?syslinux-xx.tar.gz錛寈x浠h〃鐗堟湰鍙? 錛屽紑濮嬩箣鍓嶏紝鍦ㄤ富鐩綍寤虹珛涓涓洰褰曪紝鏉ラ噴鏀捐繖涓や釜杞歡鍖咃細
cd
mkdir -p project/minilinux
cd project/minilinux
tar zxvf minicom-xx.src.tar.gz
tar zxvf syslinux-xx.tar.gz
1銆佽鍑弆inux鍐呮牳(闇瑕佺郴緇熷畨瑁呭唴鏍告枃浠跺寘)
閰嶇疆鍐呮牳鐨勬椂鍊欙紝鎴戜滑闇瑕侀夋嫨榪欎簺錛氭懜鍧楃紪鍏ュ唴鏍革紝386澶勭悊鍣ㄣ佺墿鐞嗗唴瀛榦ff銆佹敮鎸丒LF銆佹爣鍑哖C杞洏銆佹敮鎸丷AM鐩?4096)銆佹敮鎸?initial RAM disk (initrd)銆佽櫄浣犵粓绔佽櫄鎷熺粓绔帶鍒跺彴銆佹爣鍑嗕覆鍙c乪xt2鏂囦歡緋葷粺銆佹帶鍒跺彴椹卞姩錛孷GA text console銆丏OS FAT銆丮SDOS鏂囦歡緋葷粺錛屽叾浠栫殑閮藉彲浠ヤ笉瑕侊紝榪欐牱鍐呮牳緙栧嚭鏉ヨ緝灝忋?nbsp;
姝ラ:
cd /usr/src/linux
make mrproper
make xconfig
make dep && make bzImage
寰楀埌 /usr/src/linux/arch/i386/boot/鐩綍鐨勫唴鏍告枃浠禸zIamge銆?
2銆佺紪璇戜竴涓潤鎬佺殑minicom錛屾妸瀹冧綔涓哄皢鏉ョ殑linuxrc
cd minicom-xx/src
vi Makefile
淇敼涓嬮潰榪欒
minicom: $(minicom_OBJECTS) $(minicom_DEPENDENCIES)
rm -f minicom 涓嬮潰鐨勮鍔犱笂 -static錛岃繛鎺ヤ負闈欐佺▼搴?
(LINK) -static $(minicom_LDFLAGS) $(minicom_OBJECTS) $(minicom_LDADD) $(LIBS)
vi minicom.c
鎵懼埌 if (real_uid==0 && dosetup==0 ) 鍒犻櫎榪欎釜鍒ゆ柇鏉′歡璇彞錛屼富瑕佹槸鐢ㄤ簬鏉冮檺鍒ゆ柇鐨勶紝鍥犱負榪欎釜宓屽叆搴旂敤涓嶅叧娉ㄦ潈闄愰棶棰橈紝鍚﹀垯浼氬嚭閿欍?
make
寰楀埌鍙墽琛岀▼搴忥紝鐢╨dd 媯鏌ヤ竴涓嬫槸涓嶆槸闈欐佺▼搴忋?
3銆佸噯澶噄nitrd鍘嬬緝鏂囦歡image.gz
dd if=/dev/zero of=image bs=1k count=4096
losetup /dev/loop0 image
mke2fs -m 0 /dev/loop0
mounmt -t ext2 /dev/loop0 /mnt/
mkdir -p /mnt/dev
mkdir -p /mnt/usr/share/terminfo/l/
cd /dev
cp -a consle null tty tty0 zero mem /mnt/dev
cp -P /usr/share/terminfo/l/linux /mnt/usr/share/terminfo/l/linux
cp ~/project/minilinux/mincom/src/minicom /mnt/linuxrc
umount /mnt
losetup -d /dev/loop0
sync
gzip -9 image
4銆佸埗浣滆蔣鐩樺紩瀵鹼紝騫舵嫹璐濇枃浠?bzimage image.gz 鍒拌蔣鐩?
A.浣跨敤grub
fdformat /dev/fd0
mke2fs /dev/fd0
mount /mnt/fd0 /mnt/floppy
mkdir -p /mnt/floppy/boot/grub
cp /boot/grub/stage1 /boot/grub/stage2 /mnt/floppy/boot/grub
鎵ц grub錛屽湪杞洏涓婂垱寤哄紩瀵?
grub > root (fd0)
grub > setup (fd0)
grub > quit
cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy
緙栬緫 /mnt/floppy/boot/grub/grub.conf
default =0
timeout-=10
title minilinux
root (fd0)
kernel /bzImage
initrd /image.gz
鍗鎬笅杞洏
umount /mnt/floppy
B. 浣跨敤syslinux
fdformat /dev/fd0
mkfs.msdos /dev/fd0
mount -t msdos /dev/fd0 /mnt/floppy
cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy
cp syslinux-xx/ldlinxu.sys /mnt/floppy
cat > /mnt/floppy/syslinux.cfg
LABEL linux
KERNEL bzimage
APPEND initrd=image.gz
umont /mnt/floppy
syslinux-xx/syslinux /dev/fd0
sync
5銆佺敤杞洏鍚姩璁$畻鏈猴紝濡傛灉騫歌繍錛宮inicom鐨勮繍琛岀敾闈㈠嚭鐜板湪灞忓箷涓娿?
鍒版錛屾垜浠殑鍗曞簲鐢ㄥ祵鍏ュ紡linux鍋氬ソ浜嗭紝浣嗗畠榪樺緢綆闄嬶紝娌℃湁浠涔堝疄闄呯敤閫旓紝浣嗛氳繃榪欎釜瀹為獙錛屽彲浠ヤ簡瑙e祵鍏ュ紡緋葷粺鐨勫ぇ鑷寸粨鏋勫拰寮鍙戣繃紼嬨傚湪榪涜瀹為檯鐨勫祵鍏?寮忓紑鍙戞椂錛岄氬父瑕佸湪PC鏈轟笂鍊熷姪宓屽叆寮弆inux寮鍙戝伐鍏峰寘錛屽錛歶clinux,bluecat絳夛紝瀵圭浉搴旂殑紜歡騫沖彴(鐩爣鏈?榪涜杞歡緙栧啓緙栬瘧錛岃皟璇曟垚鍔熷悗錛屽皢鍐呮牳鍙婂簲鐢ㄧ▼搴忓啓鍏ュ埌鐩爣鏈虹殑瀛樺偍鍣ㄤ腑錛屼粠鑰屽畬鎴愭暣涓簲鐢ㄣ?/p>
]]>
0x000000FC (ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY)
緇忔煡鎵懼彂鐜版闂鏄敱浜庤澶囬┍鍔?鍦ㄦ涓篈ctiveSync)涓庢暟鎹墽琛屼繚鎶?(DEP) 鍔熻兘涓嶅吋瀹歸犳垚鐨勶紝瑙e喅鍔炴硶鏄叧闂?DEP 鍔熻兘錛屾楠ゅ涓嬶細
娉ㄦ剰錛氬湪閰嶇疆涓哄惎鍔ㄥ涓搷浣滅郴緇熺殑璁$畻鏈轟笂錛岃鍦ㄦ樉紺?#8220;鍚姩”鑿滃崟鏃舵寜 F8銆?
bootcfg /raw “/noexecute=alwaysoff /fastdetect” /id 1
]]>
#include <vcl.h>
#include <dir.h>
#include <setupapi.h>
#include "C:/WINDDK/3790/inc/ddk/w2k/usbdi.h"
#include "C:/WINDDK/3790/inc/ddk/w2k/devioctl.h"
#include <initguid.h>
//---------------------------------------------------------------------------
// 涓嬮潰蹇呴』涓洪┍鍔ㄧ▼搴忕殑 GUID 鍊? 榪欓噷鎴戜貢鍐欑殑鏁?/span>
DEFINE_GUID(USB_DRIVER_GUID, 0x12345678,0xabcd,0x1122,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00);
//---------------------------------------------------------------------------
HANDLE OpenOneDevice(HDEVINFO hDvcInfo, PSP_INTERFACE_DEVICE_DATA DvcInfoData, char *sDevNameBuf)

{
HANDLE hOut = INVALID_HANDLE_VALUE;
ULONG iReqLen = 0;
SetupDiGetInterfaceDeviceDetail(hDvcInfo, DvcInfoData, NULL, 0, &iReqLen, NULL);
ULONG iDevDataLen = iReqLen; //sizeof(SP_FNCLASS_DEVICE_DATA) + 512;
PSP_INTERFACE_DEVICE_DETAIL_DATA pDevData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(iDevDataLen);
pDevData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if(SetupDiGetInterfaceDeviceDetail(hDvcInfo, DvcInfoData, pDevData, iDevDataLen, &iReqLen, NULL))
{
strcpy(sDevNameBuf, pDevData->DevicePath);
hOut = CreateFile(pDevData->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
}
free(pDevData);
return hOut;
}
//---------------------------------------------------------------------------
HANDLE OpenUsbDevice(const GUID *pGuid, char *sDevNameBuf)

{
HANDLE hOut = INVALID_HANDLE_VALUE;
HDEVINFO hDevInfo = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);
SP_INTERFACE_DEVICE_DATA deviceInfoData;
deviceInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);
ULONG nGuessCount = MAXLONG;
for(ULONG iDevIndex=0; iDevIndex<nGuessCount; iDevIndex++)
{
if(SetupDiEnumDeviceInterfaces(hDevInfo, 0, pGuid, iDevIndex, &deviceInfoData))
{
if((hOut=OpenOneDevice(hDevInfo, &deviceInfoData, sDevNameBuf)) != INVALID_HANDLE_VALUE)
break;
}
else if(GetLastError() == ERROR_NO_MORE_ITEMS) //No more items
{
break;
}
}
SetupDiDestroyDeviceInfoList(hDevInfo);
return hOut;
}
//---------------------------------------------------------------------------
bool GetUsbDeviceFileName(const GUID *pGuid, char *sDevNameBuf)

{
HANDLE hDev = OpenUsbDevice(pGuid, sDevNameBuf);
if(hDev != INVALID_HANDLE_VALUE)
{
CloseHandle(hDev);
return true;
}
return false;
}
//---------------------------------------------------------------------------
HANDLE OpenMyDevice()

{
char DeviceName[MAXPATH] = "";
return OpenUsbDevice(&USB_DRIVER_GUID, DeviceName);
}
//---------------------------------------------------------------------------
HANDLE OpenMyDevPipe(const char *PipeName)

{
char DeviceName[MAXPATH] = "";
if(GetUsbDeviceFileName(&USB_DRIVER_GUID, DeviceName))
{
strcat(DeviceName,"\\");
strcat(DeviceName,PipeName);
return CreateFile(DeviceName, GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
}
return INVALID_HANDLE_VALUE;
}
//---------------------------------------------------------------------------

//鏈変簡涓婇潰鐨勫嚱鏁板氨鍙互璁塊棶 USB 鍙d簡:
//鎵撳紑 USB 鍙h鍐? 鐢遍┍鍔ㄧ▼搴忕殑 Pipe 鍚嶇‘瀹?nbsp;
HANDLE hPipe = OpenMyDevPipe("MyPipe1"); //椹卞姩紼嬪簭閲岄潰鐨?nbsp;Pipe 鍚? 瀵瑰簲璁塊棶鏌愪釜绔偣鐨?nbsp;I/O, 榪欓噷鎴戜貢鍐欑殑, 闇瑕佷笌椹卞姩涓鑷?/span>
if(hPipe != INVALID_HANDLE_VALUE) //鎵撳紑 Pipe 鎴愬姛
{
ReadFile(hPipe, Buffer, BufSize, &nBytesRead, NULL); //浠?nbsp;hPipe 閲岃鍙栨暟鎹埌 Buffer 閲?br>
//WriteFile(hPipe, Buffer, BytesToWrite, &nBytesWritten, NULL); //鎶?nbsp;Buffer 閲岄潰鐨?nbsp;BytesToWrite 瀛楄妭鍐欏叆 hPipe
CloseHandle(hPipe);
}
//浣跨敤 DeviceIoControl 璁塊棶 USB 璁懼
HANDLE hDevice = OpenMyDevice();
if(hDevice != INVALID_HANDLE_VALUE) //鎵撳紑璁懼鎴愬姛
{
//榪欎簺 DeviceIoControl 鍔熻兘閮芥槸鐢辮澶囧畾涔夌殑, 鍏蜂綋鐪嬭澶囧拰椹卞姩鐨勮祫鏂?/span>
if(DeviceIoControl(hDevice, IOCTL_READ_xxxx, &IOBlock, sizeof(IOBLOCK), &c, 1, &nBytes, NULL))
{
//鎴愬姛
}
CloseHandle(hDevice);
} 

USB 璁懼銆乁SB 椹卞姩銆乁SB 搴旂敤紼嬪簭
1.USB 璁懼紜歡閮ㄥ垎
a.榪欎釜紜歡鐨勬爣璇嗘槸鐢ㄧ殑 Vender ID 鍜?Product ID, 鍗?#8220;鍘傚鏍囪瘑”鍜?#8220;浜у搧鏍囪瘑”
b.榪欎釜紜歡瑙勫畾浜嗗悇涓?End Point (绔偣) 鐨勬ц川, 璇?鍐?鍙?綾誨瀷 (Control/Interrupt/Bulk/Isochronous)
c.榪欎釜紜歡鐨勫浐浠墮噷闈㈡湁 DeviceIoControl 鐨勫疄鐜伴儴鍒? 瑙勫畾浜嗚繖涓嚱鏁扮殑鍏蜂綋鍙傛暟鍜屽姩浣?
2.USB 璁懼椹卞姩
鈶犵‖浠舵帴鍙?br> a.闇瑕佽瘑鍒?Vender ID 鍜?Product ID
b.瀵規瘡涓?EndPoint 鐨勬瘡涓?I/O 鍒嗛厤涓涓?Pipe, 騫朵笖璧蜂竴涓悕瀛椾綔涓鴻蔣浠舵帴鍙?br> c.鍋?DeviceIoControl 鐨勬帴鍙?br> 鈶¤蔣浠舵帴鍙?br> a.GUID, 椹卞姩紼嬪簭鐨勬爣璇? 姣忎釜椹卞姩紼嬪簭浣跨敤涓嶅悓鐨?GUID, GUID 鏄瘑鍒┍鍔ㄧ殑, 涓庣‖浠舵棤鍏?(椹卞姩紼嬪簭鍗囩駭鐗堟湰 GUID 涓嶈兘淇敼)
b.紜歡鎺ュ彛閲岄潰鐨?b: Pipe 鍚嶅瓧鏄蔣浠舵帴鍙? 榪欎釜 Pipe 鍚嶅瓧綰補鐢遍┍鍔ㄥ畾涔夌殑, 鍜岀‖浠舵棤鍏? 鍗囩駭椹卞姩涓嶈兘鏀?Pipe 鐨勫悕瀛?br> c.紜歡鎺ュ彛閲岄潰鐨?c 鐨勫悇涓弬鏁頒篃鏄蔣浠剁殑鎺ュ彛, 榪欎簺鍙傛暟鏄敱紜歡甯︽潵鐨? 涓嶆槸椹卞姩瑙勫畾鐨? 褰撶劧涔熷彲浠ュ湪椹卞姩閲岄潰杞箟, 闅愯棌璁懼鐨勭湡瀹炴儏鍐?br> 鈶㈣繖涓┍鍔ㄧ▼搴忔槸鐢?WinDDK 緙栬瘧鐨? 鍙互鐢ㄦ枃鏈紪杈戝櫒鎴栧叾浠栧紑鍙戝伐鍏風殑緙栬緫鍣ㄧ紪紼嬪簭浠g爜, 鐒跺悗璋冪敤 WinDDK 緙栬瘧
3.璇誨啓 USB 鍙g殑紼嬪簭
鈶犱笌椹卞姩鐨勬帴鍙?br> a.鍒╃敤椹卞姩紼嬪簭閲岄潰鐨?GUID 鎵懼嚭璁懼鐨勬枃浠跺悕, 鐢?CreateFile 鍑芥暟鎵撳紑璁懼銆傛垜鍓嶉潰鐨勭▼搴忛噷闈㈢殑 OpenUsbDevice 灝辨槸榪欎釜浣滅敤
b.閫氳繃 a.寰楀埌鐨勮澶囨枃浠跺悕鍜岄┍鍔ㄧ▼搴忛噷闈㈢殑 Pipe 鍚嶆墦寮 Pipe, 璁塊棶榪欎釜 Pipe 瀵瑰簲鐨?USB 绔偣 (璇誨啓鏁版嵁)
c.浣跨敤 a.鐨?CreateFile 寰楀埌鐨勫彞鏌? 閫氳繃 DeviceIoControl 瀹炵幇璁懼瑙勫畾鐨勫姩浣?br> 鈶℃湁鍏抽渶瑕佺殑璧勬枡
a.Vender ID, Product ID 鍜?GUID 涓鑸湪椹卞姩紼嬪簭鐨?.inf 鏂囦歡閲岄潰鑳界湅鍒? 濡傛灉鎵句笉鍒板氨闇瑕佸拰鍘傚鑱旂郴
b.Pipe 鐨勫悕瀛楁槸椹卞姩紼嬪簭瑙勫畾鐨? 闇瑕佹湁椹卞姩紼嬪簭鐨勮祫鏂欐墠鑳界煡閬?br> c.DeviceIoControl 鐨勫弬鏁伴渶瑕佹湁椹卞姩紼嬪簭鐨勮祫鏂欐垨鑰呯‖浠惰祫鏂欐墠鑳界煡閬?br> 鈶㈣繖涓▼搴忎竴鑸敤 C/C++ 鐩存帴緙栧啓, 濡傛灉浣跨敤鍏朵粬璇█(VB/PB絳?闇瑕佽皟鐢?C/C++ 緙栫殑 DLL
鍏朵粬鐩稿叧鍐呭:
USB 椹卞姩紼嬪簭鍙互鍒版敞鍐岃〃閲岄潰鎵懼埌錛?
"HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Enum\\USB\\Vid_鍘傚鏍囪瘑&Pid_浜у搧鏍囪瘑\\椹卞姩紼嬪簭"
閲岄潰鐨?ClassGUID 灝辨槸椹卞姩紼嬪簭鐨?GUID 鏍囪瘑, 渚嬪 {36FC9E60-C465-11CF-8056-444553540000}
鐩稿綋浜庣▼搴忕殑: DEFINE_GUID(USB_DRIVER_GUID, 0x36FC9E60,0xC465,0x11CF,0x80,0x56,0x44,0x45,0x53,0x54,0x00,0x00);
鍙﹀鍦ㄨ繖涓敞鍐岃〃閿噷闈㈣繕鍙壘鍒版湁鍏寵澶囩殑鍏朵粬鎻忚堪, 渚嬪 DeviceDesc = "USB Mass Storage Device" 絳?/p>
浜屻佽璇哘t/Embedded 寮鍙戠幆澧?br>Qt/Embedded 鐨勫紑鍙戠幆澧冨彲浠ュ彇浠i偅浜涙垜浠啛鐭ョ殑UNIX 鍜學INDOWS 寮鍙戝伐鍏楓傚畠鎻愪緵浜嗗嚑涓法騫沖彴鐨勫伐鍏蜂嬌寰楀紑鍙戝彉寰楄繀閫熷拰鏂逛究錛屽挨鍏舵槸瀹冪殑鍥懼艦璁捐鍣ㄣ俇nix 涓嬬殑寮鍙戣呭彲浠ュ湪PC 鏈烘垨鑰呭伐浣滅珯浣跨敤铏氭嫙緙撳啿甯э紝浠庤屽彲浠ヤ豢鐪熶竴涓拰宓屽叆寮忚澶囩殑鏄劇ず緇堢澶у皬錛岃薄绱犵浉鍚岀殑鏄劇ず鐜銆傚祵鍏ュ紡璁懼鐨勫簲鐢ㄥ彲浠ュ湪瀹夎浜嗕竴涓法騫沖彴寮鍙戝伐鍏烽摼鐨勪笉鍚岀殑騫沖彴涓婄紪璇戙傛渶閫氬父鐨勫仛娉曟槸鍦ㄤ竴涓猆NIX緋葷粺涓婂畨瑁呰法騫沖彴鐨勫甫鏈塴ibc搴撶殑GNU c++緙栬瘧鍣ㄥ拰浜岃繘鍒跺伐鍏楓傚湪寮鍙戠殑璁稿闃舵錛屼竴涓彲鏇夸唬鐨勫仛娉曟槸浣跨敤Qt鐨勬闈㈢増鏈紝渚嬪Qt/X11鎴栨槸Qt/Windows鏉ヨ繘琛屽紑鍙戙傝繖鏍峰紑鍙戜漢鍛樺氨鍙互浣跨敤浠栦滑鐔熸倝鐨勫紑鍙戠幆澧冿紝渚嬪寰蔣鐨刅isual C++ 鎴栬?Borland C++錛涘湪UNIX鎿嶄綔緋葷粺涓嬶紝璁稿鐜涔熸槸鍙敤鐨勶紝渚嬪Kdevelop錛屽畠涔熸敮鎸佷氦浜掑紡寮鍙戙傚鏋淨t/Embedded 鐨勫簲鐢ㄦ槸鍦║NIX 騫沖彴涓嬪紑鍙戠殑璇濓紝閭d箞瀹冨氨鍙互鍦ㄥ紑鍙戠殑鏈哄櫒涓婁互涓涓嫭绔嬬殑鎺у埗鍙版垨鑰呰櫄鎷熺紦鍐插撫鐨勬柟寮忔潵榪愯錛屽浜庡悗鑰呮潵璇達紝鍏跺疄鏄湁涓涓猉11鐨勫簲鐢ㄧ▼搴忚櫄鎷熶簡涓涓紦鍐插撫銆傞氳繃鎸囧畾鏄劇ず璁懼鐨勫搴︼紝楂樺害鍜岄鑹叉繁搴︼紝铏氭嫙鍑烘潵鐨勭紦鍐插撫灝嗗拰鐗╃悊鐨勬樉紺鴻澶囧湪姣忎釜鍍忕礌涓婁繚鎸佷竴鑷淬傝繖鏍鋒瘡嬈¤皟璇曞簲鐢ㄦ椂寮鍙戜漢鍛樺氨涓嶇敤鎬繪槸鍒鋒柊宓屽叆寮忚澶囩殑FLASH 瀛樺偍絀洪棿錛屼粠鑰屽姞閫熶簡搴旂敤鐨勭紪璇戙侀摼鎺ュ拰榪愯鍛ㄦ湡銆傝繍琛孮t 鐨勮櫄鎷熺紦鍐插撫宸ュ叿鐨勬柟娉曟槸錛氬湪Linux 鐨勫浘褰㈡ā寮忎笅榪愯鍛戒護錛?br>qvfb (鍥炶濺)
褰換t 宓屽叆寮忕殑搴旂敤紼嬪簭瑕佹妸鏄劇ず緇撴灉杈撳嚭鍒拌櫄鎷熺紦鍐插撫鏃訛紝鎴戜滑鍦ㄥ懡浠よ榪愯榪欎釜紼嬪簭鏃訛紝鍦ㄧ▼搴忓悕鍚庡姞涓?qws 鐨勯夐」銆備緥濡傦細 $> hello -qws
2錛? QT 鐨勬敮鎾戝伐鍏?br>Qt 鍖呭惈浜嗚澶氭敮鎸佸祵鍏ュ紡緋葷粺寮鍙戠殑宸ュ叿錛屽叾涓竴浜涘伐鍏鋒垜浠細鍦ㄥ埆鐨勫湴鏂逛粙緇嶃傛湁涓や釜鏈瀹炵敤鐨勫伐鍏鳳紙闄や簡涓婇潰鎴戜滑鎻愬埌鐨勮櫄鎷熺紦鍐插撫錛夋槸 qmake 鍜孮t designer(鍥懼艦璁捐鍣?銆俼make 鏄竴涓負緙栬瘧Qt/Embedded 搴撳拰搴旂敤鑰屾彁渚涚殑Makefile 鐢熸垚鍣ㄣ傚畠鑳藉鏍規嵁涓涓伐紼嬫枃浠訛紙.pro錛変駭鐢熶笉鍚屽鉤鍙頒笅鐨凪akefile 鏂囦歡銆俼make 鏀寔璺ㄥ鉤鍙板紑鍙戝拰褰卞瓙鐢熸垚錛坰hadow builds錛夛紝褰卞瓙鐢熸垚鏄寚褰撳伐紼嬬殑婧愪唬鐮佸叡浜粰緗戠粶涓婄殑澶氬彴鏈哄櫒鏃訛紝姣忓彴鏈哄櫒緙栬瘧閾炬帴榪欎釜宸ョ▼鐨勪唬鐮佸皢鍦ㄤ笉鍚岀殑瀛愯礬寰勪笅瀹屾垚錛岃繖鏍峰氨涓嶄細瑕嗙洊鍒漢鐨勭紪璇戦摼鎺ョ敓鎴愮殑鏂囦歡銆俼make 榪樻槗浜庡湪涓嶅悓鐨勯厤緗箣闂村垏鎹€傚紑鍙戣呭彲浠ヤ嬌鐢≦t 鍥懼艦璁捐鍣ㄥ彲瑙嗗寲鍦拌璁″璇濇鑰屼笉闇緙栧啓涓琛屼唬鐮併備嬌鐢≦t鍥懼艦璁捐鍣ㄧ殑甯冨眬綆$悊鍙互鐢熸垚鍏鋒湁騫蟲粦鏀瑰彉灝哄鐨勫璇濇錛宷make 鍜孮t 鍥懼艦璁捐鍣ㄦ槸瀹屽叏闆嗘垚鍦ㄤ竴璧風殑銆?/p>
2錛? 淇″彿涓庢彃妲?br>淇″彿涓庢彃妲芥満鍒舵彁渚涗簡瀵硅薄闂寸殑閫氫俊鏈哄埗錛屽畠鏄撲簬鐞嗚В鍜屼嬌鐢紝騫跺畬鍏ㄨQt 鍥懼艦璁捐鍣ㄦ墍鏀寔銆傚浘褰㈢敤鎴鋒帴鍙g殑搴旂敤闇瑕佸鐢ㄦ埛鐨勫姩浣滃仛鍑哄搷搴斻備緥濡傦紝褰撶敤鎴風偣鍑諱簡涓涓彍鍗曢」鎴栨槸宸ュ叿鏍忕殑鎸夐挳鏃訛紝搴旂敤紼嬪簭浼氭墽琛屾煇浜涗唬鐮併傚ぇ閮ㄥ垎鎯呭喌涓嬶紝鎴戜滑甯屾湜涓嶅悓綾誨瀷鐨勫璞′箣闂磋兘澶熻繘琛岄氫俊銆傜▼搴忓憳蹇呴』鎶婁簨浠跺拰鐩稿叧浠g爜鑱旂郴璧鋒潵錛岃繖鏍鋒墠鑳藉浜嬩歡鍋氬嚭鍝嶅簲銆備互鍓嶇殑宸ュ叿寮鍙戝寘浣跨敤鐨勪簨浠跺搷搴旀満鍒舵槸鏄撳穿婧冪殑錛屼笉澶熷仴澹殑錛屽悓鏃朵篃涓嶆槸闈㈠悜瀵硅薄鐨勩俆rolltech 宸茬粡鍒涚珛浜嗕竴縐嶆柊鐨勬満鍒訛紝鍙仛“淇″彿涓庢彃妲?#8221;銆備俊鍙蜂笌鎻掓Ы鏄竴縐嶅己鏈夊姏鐨勫璞¢棿閫氫俊鏈哄埗錛屽畠瀹屽叏鍙互鍙栦唬鍘熷鐨勫洖璋冨拰娑堟伅鏄犲皠鏈哄埗錛涗俊鍙蜂笌鎻掓Ы鏄繀閫熺殑錛岀被鍨嬪畨鍏ㄧ殑錛屽仴澹殑錛屽畬鍏ㄩ潰鍚戝璞″茍鐢–++鏉ュ疄鐜扮殑涓縐嶆満鍒躲?br>鍦ㄤ互鍓嶏紝褰撴垜浠嬌鐢ㄥ洖璋冨嚱鏁版満鍒舵潵鎶婃煇孌靛搷搴斾唬鐮佸拰涓涓寜閽殑鍔ㄤ綔鐩稿叧鑱旀椂錛屾垜浠氬父鎶婇偅孌靛搷搴斾唬鐮佸啓鎴愪竴涓嚱鏁幫紝鐒跺悗鎶婅繖涓嚱鏁扮殑鍦板潃鎸囬拡浼犵粰鎸夐挳錛屽綋閭d釜鎸夐挳琚寜涓嬫椂錛岃繖涓嚱鏁板氨浼氳鎵ц銆傚浜庤繖縐嶆柟寮忥紝浠ュ墠鐨勫紑鍙戝寘涓嶈兘澶熺‘淇濆洖璋冨嚱鏁拌鎵ц鏃舵墍浼犻掕繘鏉ョ殑鍑芥暟鍙傛暟灝辨槸姝g‘鐨勭被鍨嬶紝鍥犳瀹規槗閫犳垚榪涚▼宕╂簝錛屽彟澶栦竴涓棶棰樻槸錛屽洖璋冭繖縐嶆柟寮忕揣绱х殑緇戝畾浜嗗浘褰㈢敤鎴鋒帴鍙g殑鍔熻兘鍏冪礌錛屽洜鑰屽緢闅炬妸寮鍙戣繘琛岀嫭绔嬬殑鍒嗙被銆俀t鐨勪俊鍙蜂笌鎻掓Ы鏈哄埗鏄笉鍚岀殑銆俀t鐨勭獥鍙e湪浜嬩歡鍙戠敓鍚庝細嬋鍙戜俊鍙楓備緥濡備竴涓寜閽鐐瑰嚮鏃朵細嬋鍙戜竴涓?#8220;clicked”淇″彿銆傜▼搴忓憳閫氳繃寤虹珛涓涓嚱鏁幫紙縐頒綔涓涓彃妲斤級錛屽璞?鍥句竴涓浜涗俊鍙蜂笌鎻掓Ы榪炴帴鐨勬娊璞″浘鐒跺悗璋冪敤connect()鍑芥暟鎶婅繖涓彃妲藉拰涓涓俊鍙瘋繛鎺ヨ搗鏉ワ紝榪欐牱灝卞畬鎴愪簡涓涓簨浠跺拰鍝嶅簲浠g爜鐨勮繛鎺ャ備俊鍙蜂笌鎻掓Ы鏈哄埗騫朵笉瑕佹眰綾諱箣闂翠簰鐩哥煡閬撶粏鑺傦紝榪欐牱灝卞彲浠ョ浉瀵瑰鏄撶殑寮鍙戝嚭浠g爜鍙珮閲嶇敤鐨勭被銆備俊鍙蜂笌鎻掓Ы鏈哄埗鏄被鍨嬪畨鍏ㄧ殑錛屽畠浠ヨ鍛婄殑鏂瑰紡鎶ュ憡綾誨瀷閿欒錛岃屼笉浼氫嬌緋葷粺浜х敓宕╂簝銆?br>渚嬪錛屽鏋滀竴涓鍑烘寜閽殑clicked() 淇″彿琚繛鎺ュ埌浜嗕竴涓簲鐢ㄧ殑閫鍑哄嚱鏁幫紞
淇″彿1
淇″彿2
鎻掓Ы1
鎻掓Ы2
鎻掓Ы1
鎻掓Ы2
鎻掓Ы3
鎻掓Ы1
淇″彿1
淇″彿1
瀵硅薄3
瀵硅薄4
connect( 瀵硅薄1, 淇″彿1, 瀵硅薄2, 鎻掓Ы1 )
connect( 瀵硅薄1, 淇″彿1, 瀵硅薄2, 鎻掓Ы2 )
connect( 瀵硅薄1, 淇″彿2, 瀵硅薄4, 鎻掓Ы1 )
connect( 瀵硅薄3, 淇″彿1, 瀵硅薄4, 鎻掓Ы3 )
瀵硅薄2
quit() 鎻掓Ы銆傞偅涔堜竴涓敤鎴風偣鍑婚鍑洪敭灝嗕嬌搴旂敤紼嬪簭緇堟榪愯銆備笂榪扮殑榪炴帴榪囩▼鐢ㄤ唬鐮佸啓鍑烘潵灝辨槸榪欐牱connect( button, SIGNAL(clicked()), qApp, SLOT(quit()) );鎴戜滑鍙互鍦≦t搴旂敤紼嬪簭鐨勬墽琛岃繃紼嬩腑澧炲姞鎴栨槸鍑忓皯淇″彿涓庢彃妲界殑榪炴帴銆備俊鍙蜂笌鎻掓Ы鐨勫疄鐜版墿灞曚簡C++鐨勮娉曪紝鍚屾椂涔熷畬鍏ㄥ埄鐢ㄤ簡C++闈㈠悜瀵硅薄鐨勭壒寰併備俊鍙蜂笌鎻掓Ы鍙互琚噸杞芥垨鑰呴噸鏂板疄鐜幫紝瀹冧滑鍙互瀹氫箟涓虹被鐨勫叕鏈夛紝縐佹湁鎴栨槸淇濇姢鎴愬憳銆?/p>
2錛?錛? 淇″彿涓庢彃妲界殑渚嬪瓙
濡傛灉涓涓被瑕佷嬌鐢ㄤ俊鍙蜂笌鎻掓Ы鏈哄埗錛屽畠灝卞繀欏繪槸浠嶲Object鎴栬匭Object鐨勫瓙綾葷戶鎵匡紝鑰屼笖鍦ㄧ被鐨勫畾涔変腑蹇呴』鍔犱笂Q_OBJECT瀹忋備俊鍙瘋瀹氫箟鍦ㄧ被鐨勪俊鍙烽儴鍒嗭紝鑰屾彃妲藉垯瀹氫箟鍦╬ublic slots, protected slots 鎴栬?private slots 閮ㄥ垎銆?br>涓嬮潰瀹氫箟涓涓嬌鐢ㄥ埌淇″彿涓庢彃妲芥満鍒剁殑綾匯?br>class BankAccount : public QObject
{
Q_OBJECT
public:
BankAccount() { curBalance = 0; }
int balance() const { return curBalance; }
public slots:
void setBalance( int newBalance );
signals:
void balanceChanged( int newBalance );
private:
int curBalance;
};
鍜屽ぇ閮ㄥ垎鐨凜++鐨勭被涓鏍鳳紝BankAccount綾繪湁涓涓瀯閫犲嚱鏁幫紝榪樻湁涓涓彇鍊肩殑鍑芥暟balance()錛屼竴涓緗肩殑鍑芥暟setBalance( int newBalance )銆傝繖涓被鏈変竴涓俊鍙穊alanceChanged(),榪欎釜淇″彿澹版槑浜嗗畠鍦˙ankAccount綾葷殑鎴愬憳curBalance鐨勫艱鏀瑰彉鏃朵駭鐢熴備俊鍙蜂笉闇瑕佽瀹炵幇錛屽綋淇″彿琚縺鍙戞椂錛屽拰璇ヤ俊鍙瘋繛鎺ョ殑鎻掓Ы灝嗚鎵ц銆備笂闈㈢敤鏉ヨ緗肩殑鍑芥暟setBalance( int newBalance )瀹氫箟鍦ㄧ被鐨?#8220;public slots”閮ㄥ垎錛屽洜姝ゅ畠鏄竴涓彃妲姐傛彃妲芥槸涓涓渶瑕佸疄鐜扮殑鏍囧噯鐨勬垚鍛樺嚱鏁幫紝瀹冨彲浠ュ儚鍏跺畠鍑芥暟涓鏍瘋璋冪敤錛屼篃鍙互鍜屼俊鍙風浉榪炴帴銆?br>涓嬮潰灝辨槸璇ユ彃妲藉嚱鏁皊etBalance( int newBalance )鐨勫疄鐜頒唬鐮侊細
void BankAccount::setBalance( int newBalance )
{
if ( newBalance != curBalance )
{
curBalance = newBalance;
emit balanceChanged( curBalance );
}
}
鍏朵腑鐨勪竴孌典唬鐮?br>emit balanceChanged( curBalance );
瀹冪殑浣滅敤鏄綋curBalance 鐨勫艱鏀瑰彉鍚庯紝灝嗘柊鐨刢urBalance 鐨勫間綔涓哄弬鏁板幓嬋媧籦alanceChanged錛堬級淇″彿銆傚浜庡叧閿瘝“emit”錛屽畠鍜屼俊鍙楓佹彃妲戒竴鏍鋒槸鐢盦t 鎻愪緵鐨勶紝榪欎簺鍏抽敭璇嶉兘浼氳c錛嬶紜鐨勯澶勭悊鏈哄埗杞崲涓篶錛嬶紜浠g爜銆備竴涓璞$殑淇″彿鍙互琚涓笉鍚岀殑鎻掓Ы榪炴帴錛岃屽涓俊鍙蜂篃鍙互琚繛鎺ュ埌鐩稿悓鐨勬彃妲姐傚綋淇″彿鍜屾彃妲借榪炴帴璧鋒潵鏃訛紝搴斿綋紜繚瀹冧滑鐨勫弬鏁扮被鍨嬫槸鐩稿悓鐨勶紝濡傛灉鎻掓Ы鐨勫弬鏁頒釜鏁板皬浜庡拰瀹冭繛鎺ュ湪涓璧風殑淇″彿鐨勫弬鏁頒釜鏁幫紝閭d箞浠庝俊鍙蜂紶閫掓彃妲界殑澶氫綑鐨勫弬鏁板皢琚拷鐣ャ?/p>
2錛?錛? 鍏冨璞$紪璇戝櫒
淇″彿涓庢彃妲芥満鍒舵槸浠ョ函C++浠g爜鏉ュ疄鐜扮殑錛屽疄鐜扮殑榪囩▼浣跨敤鍒頒簡Qt 寮鍙戝伐鍏峰寘鎻愪緵鐨勯澶勭悊鍣ㄥ拰鍏冨璞$紪璇戝櫒錛坢oc錛夈俶oc 璇誨彇搴旂敤紼嬪簭鐨勫ご鏂囦歡錛屽茍浜х敓鏀寔淇″彿涓庢彃妲界殑蹇呰鐨勪唬鐮併傚紑鍙戣呮病蹇呰緙栬緫鎴栨槸嫻忚榪欎簺鑷姩浜х敓鐨勪唬鐮侊紝褰撴湁闇瑕佹椂錛宷make 鐢熸垚鐨凪akefile 鏂囦歡閲屼細鏄懼紡鐨勫寘鍚簡榪愯moc 鐨勮鍒欍傞櫎浜嗗彲浠ュ鐞嗕俊鍙蜂笌鎻掓Ы鏈哄埗涔嬪錛宮oc 榪樻敮鎸佺炕璇戞満鍒訛紝灞炴х郴緇熷拰榪愯鏃剁殑淇℃伅銆?/p>
2錛? 紿椾綋
Qt 鎷ユ湁涓板瘜鐨勬弧瓚充笉鍚岄渶姹傜殑紿椾綋錛堟寜閽紝婊氬姩鏉$瓑絳夛級錛孮t 鐨勭獥浣撲嬌鐢ㄨ搗鏉ュ緢鐏墊椿錛屼負浜嗘弧瓚崇壒鍒殑瑕佹眰錛屽畠寰堝鏄撳氨鍙互琚瓙綾誨寲銆傜獥浣撴槸Qwidget綾繪垨瀹冨瓙綾葷殑瀹炰緥錛屽鎴瘋嚜宸辯殑紿椾綋綾婚渶瑕佷粠Qwidget瀹冪殑瀛愮被緇ф壙銆?br>鍥句簩 鎽樺綍鐨凲widget 綾葷殑緇ф壙鍥?br>涓涓獥浣撳彲浠ュ寘鍚換鎰忔暟閲忕殑瀛愮獥浣擄紝瀛愮獥浣撳彲浠ユ樉紺哄湪鐖剁獥浣撶殑瀹㈡埛鍖猴紝涓涓病鐖剁獥浣撶殑紿椾綋鎴戜滑縐頒箣涓洪《綰х獥浣擄紙涓涓?#8220;紿楀彛”錛夛紝涓涓獥浣撻氬父鏈変竴涓竟妗嗗拰鏍囬鏍忎綔涓鴻楗般俀t 騫舵湭瀵逛竴涓獥浣撴湁浠涔堥檺鍒訛紝浠諱綍綾誨瀷鐨勭獥浣撳彲浠ユ槸欏剁駭紿椾綋錛屼換浣曠被鍨嬬殑紿椾綋鍙互鏄埆鐨勭獥浣撶殑瀛愮獥浣撱傚湪鐖剁獥浣撴樉紺哄尯鍩熺殑瀛愮獥浣撶殑浣嶇疆鍙互閫氳繃甯冨眬綆$悊鑷姩鐨勮繘琛岃緗紝涔熷彲浠ヤ漢涓虹殑鎸囧畾銆傚綋鐖剁獥浣撴棤鏁堬紝闅愯棌鎴栬鍒犻櫎鍚庯紝瀹冪殑瀛愮獥浣撻兘浼氳繘琛屽悓鏍風殑鍔ㄤ綔銆傛爣絳撅紝娑堟伅妗嗭紝宸ュ叿鏍忕瓑絳夌瓑錛屽茍鏈闄愬埗浣跨敤浠涔堥鑹詫紝瀛椾綋鍜岃璦銆俀t鐨勬枃鏈憟鐜扮獥浣撳彲浠ヤ嬌鐢℉TML瀛愰泦鏄劇ず涓涓璇█鐨勫鏂囨湰銆?/p>
2錛?錛? 涓涓狧ello 鐨勪緥瀛?br>涓嬮潰鏄竴涓樉紺?#8220;Hello Qt/Embedded!”鐨勭▼搴忕殑瀹屾暣鐨勬簮浠g爜錛?br>鍥句笁 Hello Qt/Embedded
錛僫 nclude <qapplication.h>
錛僫 nclude <qlabel.h>
int main( int argc, char **argv )
{
QApplication app( argc, argv );
QLabel *hello = new QLabel( "<font color=blue>Hello"
" <i>Qt/Embedded!</i></font>", 0 );
app.setMainWidget( hello );
hello->show();
return app.exec();
}
2錛?錛? 閫氱敤紿椾綋
涓嬮潰鏄竴浜涗富瑕佺殑Qt 紿椾綋鐨勬埅灞忓浘錛岃繖浜涚獥浣撲嬌鐢ㄤ簡紿楀彛鏍峰紡銆?br>鍥懼洓 浣跨敤浜哘HBox 榪涜鎺掑垪涓涓爣絳懼拰涓涓寜閽?br>鍥句簲 浣跨敤浜哘buttonGroup鐨勪袱涓崟閫夋鍜屼袱涓閫夋
鍥懼叚 浣跨敤浜哘groupBox榪涜鎺掑垪鐨勭殑鏃ユ湡綾籕DateTimeEdit, 涓涓緙栬緫妗嗙被QLineEdit, 涓涓枃鏈紪杈戠被QTextEdit 鍜屼竴涓粍鍚堟綾籕ComboBox
鍥句竷 浠Grid鎺掑垪鐨勪竴涓?QDial, 涓涓猀ProgressBar, 涓涓猀SpinBox, 涓涓猀ScrollBar, 涓涓猀LCDNumber鍜屼竴涓猀Slider
鍥懼叓 浠Grid鎺掑垪鐨勪竴涓猀IconView, 涓涓?QListView, 涓涓?QListBox 鍜屼竴涓?QTable鏈変簺鏃跺欏湪榪涜瀛楃杈撳叆鏃訛紝鎴戜滑甯屾湜杈撳叆鐨勫瓧絎︽弧瓚充簡鏌愮瑙勫垯鎵嶈兘浣胯緭鍏ヨ紜銆俀t鎻愪緵浜嗚В鍐崇殑鍔炴硶錛屼緥濡俀ComboBox, QLineEdit 鍜?QspinBox 鐨勫瓧絎﹁緭鍏ュ彲浠ラ氳繃Qvalidator鐨勫瓙綾繪潵榪涜綰︽潫鍜屾湁鏁堟ф鏌ャ傞氳繃緇ф壙QScrollView 錛孮Table, QListView, QTextEdit 鍜屽叾瀹冪獥浣撳氨鑳藉鏄劇ず澶ч噺鐨勬暟鎹紝騫朵笖鑷姩鐨勬嫢鏈変簡涓涓粴鍔ㄦ潯銆傝澶歈t鍒涘緩鐨勭獥浣撹兘澶熸樉紺哄浘鍍忥紝渚嬪鎸夐挳錛屾爣絳撅紝鑿滃崟欏圭瓑絳夈俀image綾繪敮鎸佸嚑縐嶅浘褰㈡牸寮忕殑杈撳叆銆佽緭鍑哄拰鎿嶄綔錛屽畠鐩墠鏀寔鐨勫浘褰㈡牸寮忔湁BMP, GIF*, JPEG, MNG, PNG, PNM, XBM鍜?XPM銆?/p>
2錛?錛? 鐢誨竷
QCanvas 綾繪彁渚涗簡涓涓珮綰х殑騫抽潰鍥懼艦緙栫▼鎺ュ彛錛屽畠鍙互澶勭悊澶ч噺鐨勫儚綰挎潯銆佺煩褰€佹き鍦嗐佹枃鏈佷綅鍥俱佸姩鐢葷瓑榪欎簺鐢誨竷欏癸紝鐢誨竷欏瑰彲浠ヨ緝瀹規槗鐨勫仛鎴愪氦浜掑紡鐨勶紙渚嬪鍋氭垚鏀寔鐢ㄦ埛縐誨姩鐨勶級銆傜敾甯冮」鏄疩canvasItem瀛愮被鐨勫疄渚嬶紝瀹冧滑姣旂獥浣撶被Qwidget鏇存樉寰楄交閲忕駭錛屽畠浠兘澶熻蹇熺殑縐誨姩錛岄殣钘忓拰鏄劇ず銆?Qcanvas鍙互鏇存湁鏁堢殑鏀寔鍐茬獊媯嫻嬶紝瀹冭兘澶熷垪鍑轟竴涓寚瀹氬尯鍩熼噷闈㈢殑鎵鏈夌殑鐢誨竷欏廣俀canvasItem鍙互琚瓙綾誨寲錛屼粠鑰屽彲浠ユ彁渚涙洿澶氱殑瀹㈡埛鐢誨竷欏圭被鍨嬶紝鎴栬呮墿灞曞凡鏈夌殑鐢誨竷欏圭殑鍔熻兘銆俀canvas瀵硅薄鏄敱QcanvasView榪涜緇樺埗鐨勶紝QcanvasView瀵硅薄鍙互浠ヤ笉鍚岀殑璇戞枃銆佹瘮渚嬨佹棆杞搴︼紝鍓垏鏂瑰紡鍘繪樉紺哄悓涓涓敾甯冦俀canvas 瀵硅薄鏄悊鎯崇殑鏁版嵁琛ㄧ幇鏂瑰紡錛屽畠宸茬粡琚秷璐硅呯敤浜庣粯鍒跺湴鍥懼拰鏄劇ず緗戠粶鎷撴墤緇撴瀯銆傚畠涔熷彲鐢ㄤ簬鍒朵綔蹇妭濂忕殑涓旀湁澶ч噺瑙掕壊鐨勫鉤闈㈡父鎴忋傚浘涔?鍦≦topia 涓敤QCanvas 瀹炵幇鐨勫皬琛屾槦娓告垙
2錛?錛? 瀹㈡埛紿椾綋
閫氳繃瀵筈widget鎴栬呭畠鐨勫瓙綾昏繘琛屽瓙綾誨寲錛屾垜浠彲浠ュ緩绔嬭嚜宸辯殑瀹㈡埛紿椾綋鎴栬呭璇濇銆備笅闈㈡槸涓涓畬鏁寸殑婧愪唬鐮佷緥瀛愶紝瀹冪ず渚嬩簡濡備綍閫氳繃瀛愮被鍖栫獥浣擄紝緇樺埗涓涓ā鎷熺殑鏃墮挓銆侫nalogClock 紿椾綋綾繪槸Qwidget鐨勫瓙綾伙紝瀹冩樉紺哄綋鍓嶆椂闂達紝騫朵笖鍙互鑷姩鍦版洿鏂版椂闂淬?br>鍥懼崄 妯℃嫙閽熺獥浣?br>鍦?analogclock.h澶存枃浠朵腑, AnalogClock 浠ヨ繖鏍峰湴褰㈠紡瀹氫箟錛?
錛僫 nclude <qwidget.h>
class AnalogClock : public QWidget
{
public:
AnalogClock( QWidget *parent = 0, const char *name = 0 );
protected:
virtual void timerEvent( QTimerEvent *event );
virtual void paintEvent( QPaintEvent *event );
};
AnalogClock 綾葷戶鎵夸簡Qwidget, 瀹冩湁涓涓吀鍨嬬殑紿椾綋綾繪瀯閫犲嚱鏁幫紝榪欎釜鍑芥暟鏈夌埗紿楀彛瀵硅薄鎸囬拡鍜屽悕瀛楁寚閽堜袱涓弬鏁般?濡傛灉璁劇疆浜嗗悕瀛楃殑璇濓紝嫻嬭瘯鍜岃皟璇曡搗鏉ュ氨浼氬鏄撲簺) timerEvent() 鍑芥暟鏄粠QObject 錛圦widget鐨勭埗綾伙級瀵硅薄緇ф壙鑰屾潵鐨勶紝榪欎釜鍑芥暟浼氳緋葷粺瀹氭湡璋冪敤銆俻aintEvent() 鍑芥暟鏄粠QWidget 緇ф壙鑰屾潵鐨勫茍涓斿綋紿椾綋闇瑕侀噸鐢繪椂榪欎釜鍑芥暟灝變細琚皟鐢ㄣ倀imerEvent() 鍜?paintEvent() 鍑芥暟鏄?#8220;浜嬩歡鍙ユ焺”鐨勪袱涓緥瀛愩傚簲鐢ㄥ璞′互閲嶈澆鐖剁被瀵硅薄鐨勮櫄鎷熷嚱鏁癳vents (QEvent objects) 鐨勫艦寮忔帴鏀剁郴緇熺殑浜嬩歡銆傚ぇ綰︽湁瓚呰繃50涓殑緋葷粺浜嬩歡鏄緝甯哥敤鐨勶紝渚嬪 MouseButtonPress, MouseButtonRelease, KeyPress, KeyRelease, Paint, Resize 鍜孋lose. 瀵硅薄鍙互瀵瑰彂緇欏畠浠殑浜嬩歡鍋氬嚭鍝嶅簲鎴栬呯瓫閫変竴浜涗簨浠跺悗鍐嶅彂閫佺粰鍒殑瀵硅薄銆俛nalogclock.cpp 鏂囦歡鏄畾涔夊湪analogclock.h涓殑鍑芥暟鐨勫疄鐜版簮鏂囦歡
錛僫 nclude <qdatetime.h>
錛僫 nclude <qpainter.h>
錛僫 nclude "analogclock.h"
AnalogClock::AnalogClock( QWidget *parent, const char *name )
: QWidget( parent, name )
{
startTimer( 12000 );
resize( 100, 100 );
}
void AnalogClock::timerEvent( QTimerEvent * )
{
update();
}
void AnalogClock::paintEvent( QPaintEvent * )
{
QCOORD hourHand[8] = { 2, 0, 0, 2, -2, 0, 0, -25 };
QCOORD minuteHand[8] = { 1, 0, 0, 1, -1, 0, 0, -40 };
QTime time = QTime::currentTime();
QPainter painter( this );
painter.setWindow( -50, -50, 100, 100 );
painter.setBrush( black );
for ( int i = 0; i < 12; i++ )
{
painter.drawLine( 44, 0, 46, 0 );
painter.rotate( 30 );
}
painter.save();
painter.rotate( 30 * (time.hour() % 12) + time.minute() / 2 );
painter.drawConvexPolygon( QPointArray(4, hourHand) );
painter.restore();
painter.save();
painter.rotate( 6 * time.minute() );
painter.drawConvexPolygon( QPointArray(4, minuteHand) );
painter.restore();
}
鏋勯犲嚱鏁拌緗獥鍙g殑灝哄澶у皬涓?00 x 100錛屽茍涓斿憡璇夌郴緇熸瘡闅?2縐掕皟鐢ㄤ竴嬈imerEvent()鍑芥暟錛屼粠鑰屽妯℃嫙閽熺殑紿椾綋榪涜鍒鋒柊銆傚湪 timerEvent()鍑芥暟涓? 閫氳繃璋冪敤QWidget鐨勫嚱鏁?update()灝卞彲浠ュ憡璇塓t錛岀獥浣撻渶瑕佺珛鍗抽噸鐢伙紝绱ф帴鐫Qt灝變細浜х敓涓涓粯鍒朵簨浠跺茍涓旇皟鐢╬aintEvent()鍑芥暟銆傚湪paintEvent() 鍑芥暟涓紝涓涓猀painter瀵硅薄鐢ㄤ簬鍦ㄧ獥浣撲笂緇樺埗12涓埢搴︿互鍙婂垎閽堬紝鏃墮拡銆俀painter綾繪彁渚涗簡涓縐嶇粺涓鐨勬柟寮忕敤浜庣粯鍒剁獥浣擄紝浣嶅浘錛岀煝閲忓浘絳夛紝瀹冩彁渚涗簡緇樺埗鐐癸紝綰匡紝妞渾錛屽杈瑰艦錛屽姬錛岃礉濉炲皵鏇茬嚎絳夊姛鑳斤紝涓涓猀painter鐨勫潗鏍囩郴鍙互琚漿鍙橈紝緙╂斁錛屾棆杞紝鍜屽壀鍒囷紝榪欐牱瀵硅薄灝卞彲浠ユ牴鎹畠鍦ㄧ獥鍙f垨鑰呯獥浣撲笂鐨勪綅緗粯鍒跺嚭涓涓壀鍒囩殑瑙嗗浘銆傚壀鍒囧彲浠ヤ嬌紿椾綋緇樺埗鏃跺噺灝戦棯鐑併備嬌鐢≦Painter 鐨勫瓙綾籕directPainter鍙互閿佸畾鍜岀洿鎺ヨ闂撫緙撳啿鍖哄煙銆?br>鏂囦歡 analogclock.h 鍜?analogclock.cpp 瀹屽叏鐨勫畾涔夊拰瀹炵幇浜咥nalogClock 瀹㈡埛紿椾綋綾伙紝榪欎釜紿椾綋鏄幇鍦ㄥ氨鍙互浣跨敤鐨勩?br>錛僫 nclude <qapplication.h>
錛僫 nclude "analogclock.h"
int main( int argc, char **argv )
{
QApplication app( argc, argv );
AnalogClock *clock = new AnalogClock;
app.setMainWidget( clock );
clock->show();
return app.exec();
}
2錛?錛? 涓葷獥鍙?br>QMainWindow 綾繪槸涓哄簲鐢ㄧ殑涓葷獥鍙f彁渚涗竴涓憜鏀劇浉鍏崇獥浣撶殑妗嗘灦銆備竴涓富紿楀彛鍖呭惈浜嗕竴緇勬爣鍑嗙獥浣撶殑闆嗗悎銆備富紿楀彛鐨勯《閮ㄥ寘鍚竴涓彍鍗曟爮錛屽畠鐨勪笅鏂規斁緗潃涓涓伐鍏鋒爮錛屽伐鍏鋒爮鍙互縐誨姩鍒板叾瀹冪殑鍋滈潬鍖哄煙銆備富紿楀彛鍏佽鍋滈潬鐨勪綅緗湁欏墮儴錛屽乏杈癸紝鍙寵竟鍜屽簳閮ㄣ傚伐鍏鋒爮鍙互琚嫋鏀懼埌涓涓仠闈犵殑浣嶇疆錛屼粠鑰屽艦鎴愪竴涓誕鍔ㄧ殑宸ュ叿闈㈡澘銆備富紿楀彛鐨勪笅鏂癸紝涔熷氨鏄湪搴曢儴鐨勫仠闈犱綅緗箣涓嬫湁涓涓姸鎬佹爮銆備富紿楀彛鐨勪腑闂村尯鍩熷彲浠ュ寘鍚叾瀹冪殑紿椾綋銆傛彁紺哄伐鍏峰拰“榪欐槸浠涔?#8221;甯姪鎸夐挳浠ユ梺榪扮殑鏂瑰紡闃愯堪浜嗙敤鎴鋒帴鍙g殑浣跨敤鏂規硶銆傚浜庡皬灞忓箷鐨勮澶囷紝浣跨敤Qt鍥懼艦璁捐鍣ㄥ畾涔夌殑鏍囧噯鐨凲widget妯℃澘姣斾嬌鐢ㄤ富紿楀彛綾繪洿濂戒竴浜涖傚吀鍨嬬殑妯℃澘鍖呭惈鏈夎彍鍗曟爮錛屽伐鍏鋒爮錛屽彲鑳芥病鏈夌姸鎬佹爮錛堝湪蹇呰鐨勬儏鍐典笅錛屽彲浠ョ敤浠誨姟鏍忥紝鏍囬鏍忔潵鏄劇ず鐘舵侊級
2錛?錛? 鑿滃崟
寮瑰嚭寮忚彍鍗昋popupMenu綾諱互鍨傜洿鍒楄〃鐨勬柟寮忔樉紺鴻彍鍗曢」錛屽畠鍙互鏄崟涓殑錛堜緥濡備笂涓嬫枃鐩稿叧鑿滃崟錛夛紝鍙互浠ヨ彍鍗曟爮鐨勬柟寮忓嚭鐜幫紝鎴栬呮槸鍒殑寮瑰嚭寮忚彍鍗曠殑瀛愯彍鍗曞嚭鐜般傛瘡涓彍鍗曢」鍙互鏈変竴涓浘鏍囷紝涓涓閫夋鍜屼竴涓姞閫熷櫒錛堝揩鎹烽敭錛夛紝鑿滃崟欏歸氬父瀵瑰簲涓涓姩浣滐紙渚嬪瀛樼洏錛夛紝鍒嗛殧鍣ㄩ氬父鏄劇ず鎴愪竴鏉$珫綰匡紝瀹冪敤浜庢妸涓緇勭浉鍏寵仈鐨勫姩浣滆彍鍗曞垎绔嬫垚緇勩?br>涓嬮潰鏄竴涓緩绔嬪寘鍚湁New錛孫pen 鍜孍xit 鑿滃崟欏圭殑鏂囦歡鑿滃崟鐨勪緥瀛愩?br>QPopupMenu *fileMenu = new QPopupMenu( this );
fileMenu->insertItem( "&New", this, SLOT(newFile()), CTRL+Key_N );
fileMenu->insertItem( "&Open...", this, SLOT(open()), CTRL+Key_O );
fileMenu->insertSeparator();
fileMenu->insertItem( "E&xit", qApp, SLOT(quit()), CTRL+Key_Q );
褰撲竴涓彍鍗曢」琚変腑錛屽拰瀹冪浉鍏崇殑鎻掓Ы灝嗚鎵ц銆傚姞閫熷櫒(蹇嵎閿?寰堝皯鍦ㄤ竴涓病鏈夐敭鐩樿緭鍏ョ殑璁懼涓婁嬌鐢紝Qt/Embedded 鐨勫吀鍨嬮厤緗茍鏈寘鍚鍔犻熷櫒鐨勬敮鎸併備笂闈㈠嚭鐜扮殑浠g爜 “&New”鎰忔濇槸鍦ㄦ闈㈡満鍣ㄤ笂浠?#8220;New”鐨勬柟寮忔樉紺哄嚭鏉ワ紝浣嗘槸鍦ㄥ祵鍏ュ紡璁懼涓婏紝瀹冨彧浼氭樉紺轟負“New”銆?QmenuBar綾誨疄鐜頒簡涓涓彍鍗曟爮錛屽畠浼氳嚜鍔ㄧ殑璁劇疆鍑犱綍灝哄騫跺湪瀹冪殑鐖剁獥浣撶殑欏墮儴鏄劇ず鍑烘潵錛屽鏋滅埗紿椾綋鐨勫搴︿笉澶熷浠ヨ嚧涓嶈兘鏄劇ず涓涓畬鏁寸殑鑿滃崟鏍忥紝閭d箞鑿滃崟鏍忓皢浼氬垎涓哄琛屾樉紺哄嚭鏉ャ俀t鍐呯疆鐨勫竷灞綆$悊鑳藉鑷姩鐨勮皟鏁磋彍鍗曟爮銆俀t鐨勮彍鍗曠郴緇熸槸闈炲父鐏墊椿鐨勶紝鑿滃崟欏瑰彲浠ヨ鍔ㄦ佺殑浣胯兘錛屽け鏁堬紝娣誨姞鎴栬呭垹闄ゃ傞氳繃瀛愮被鍖朡customMenuItem錛屾垜浠彲浠ュ緩绔嬪鎴峰寲澶栬鍜屽姛鑳界殑鑿滃崟欏廣?/p>
2錛?錛? 宸ュ叿鏍?br>QtoolButton 綾誨疄鐜頒簡涓涓甫鏈夊浘鏍囷紝3緇磋竟妗嗗拰鍙夋爣絳劇殑宸ュ叿鏍忔寜閽傚垏鎹㈠伐鍏鋒爮鎸夐挳鍏鋒湁寮銆佸叧鐨勭壒寰侊紝鍏跺畠鐨勬寜閽垯鎵ц涓涓懡浠ゃ備笉鍚岀殑鍥炬爣鐢ㄦ潵琛ㄧず鎸夐挳鐨勬椿鍔紝鏃犳晥銆佷嬌鑳芥ā寮忥紝鎴栬呮槸寮鎴栧叧鐨勭姸鎬併傚鏋滀綘浠呬負鎸夐挳鎸囧畾浜嗕竴涓浘鏍囷紝閭d箞Qt浼氫嬌鐢ㄥ彲瑙嗘彁紺烘潵琛ㄧ幇鎸夐挳涓嶅悓鐨勭姸鎬侊紝渚嬪鎸夐挳澶辨晥鏃舵樉紺虹伆鑹層傚伐鍏鋒爮鎸夐挳閫氬父浠ヤ竴鎺掔殑褰㈠紡鏄劇ず鍦ㄥ伐鍏鋒爮涓婏紝瀵逛簬涓涓湁鍑犵粍宸ュ叿鏍忕殑搴旂敤錛岀敤鎴峰彲浠ラ殢渚跨殑鍒板縐誨姩榪欎簺宸ュ叿鏍忥紝宸ュ叿鏍忓樊涓嶅鍙互鍖呭惈鎵鏈夌殑紿椾綋錛屼緥濡?QComboBoxes 鍜?QspinBoxes銆?/p>
2錛?錛? 鏃佽堪
鐜頒唬鐨勫簲鐢ㄤ富瑕佷嬌鐢ㄦ梺榪扮殑鏂瑰紡鍘昏В閲婄敤鎴鋒帴鍙g殑鐢ㄦ硶銆俀t 鎻愪緵浜嗕袱縐嶆梺榪扮殑鏂瑰紡錛?“鎻愮ず鏍?#8221;鍜?#8220;榪欐槸浠涔?#8221;甯姪鎸夐挳銆?“鎻愮ず鏍?#8221;鏄皬鐨勶紝閫氬父鏄粍鑹茬殑鐭╁艦錛屽綋榧犳爣鍦ㄧ獥浣撶殑涓浜涗綅緗父鍔ㄦ椂瀹冨氨浼氳嚜鍔ㄥ嚭鐜般傚畠涓昏鐢ㄤ簬瑙i噴宸ュ叿鏍忔寜閽紝鐗瑰埆鏄偅浜涚己灝戞枃瀛楁爣絳捐鏄庣殑宸ュ叿鏍忔寜閽殑鐢ㄩ斻備笅闈㈠氨鏄浣曡緗竴涓?#8220;瀛樼洏”鎸夐挳鐨勬彁紺虹殑浠g爜銆?br>QToolTip::add( saveButton, "Save" );
褰撴彁紺哄瓧絎﹀嚭鐜頒箣鍚庯紝浣犺繕鍙互鍦ㄧ姸鎬佹爮鏄劇ず鏇磋緇嗙殑鏂囧瓧璇存槑銆傚浜庝竴浜涙病鏈夐紶鏍囩殑璁懼錛堜緥濡傞偅浜涗嬌鐢ㄨЕ鐐硅緭鍏ョ殑璁懼錛夛紝灝變笉浼氭湁榧犳爣鐨勫厜鏍囧湪紿椾綋涓婅繘琛屾父鍔紝榪欐牱灝變笉鑳芥縺媧繪彁紺烘爮銆傚浜庤繖浜涜澶囦篃璁稿氨闇瑕佷嬌鐢?#8220;榪欐槸浠涔?#8221;甯姪鎸夐挳錛屾垨鑰呬嬌鐢ㄤ竴縐嶅Э鎬佹潵琛ㄧず杈撳叆璁懼姝e湪榪涜娓稿姩錛屼緥濡傜敤鎸変笅鎴栬呮彙浣忕殑濮挎佹潵琛ㄧず鐜板湪姝e湪榪涜娓稿姩銆?“榪欐槸浠涔?#8221;甯姪鎸夐挳鍜屾彁紺烘爮鏈変簺鐩鎬技錛屽彧涓嶈繃鍓嶈呮槸瑕佺敤鎴風偣鍑誨畠鎵嶄細鏄劇ず鏃佽堪銆傚湪灝忓睆騫曡澶囦笂錛岃鎯崇偣鍑?#8220;榪欐槸浠涔?#8221;甯姪鎸夐挳錛屽叿浣撶殑鏂規硶鏄紝鍦ㄩ潬榪戝簲鐢ㄧ殑X 紿楀彛鐨勫叧闂寜閽?#8220;x”闄勮繎浣犱細鐪嬪埌涓涓?#8220;錛?#8221;絎﹀彿鐨勫皬鎸夐挳錛岃繖涓寜閽氨鏄?#8220;榪欐槸浠涔?#8221;甯姪鎸夐挳銆備竴鑸潵璇達紝“榪欐槸浠涔?#8221;甯姪鎸夐挳鎸変笅鍚庤鏄劇ず鐨勬彁紺轟俊鎭簲璇ユ瘮鎻愮ず鏍忚澶氫竴浜涖備笅闈㈡槸璁劇疆涓涓瓨鐩樻寜閽殑“榪欐槸浠涔?#8221;鏂囨湰鎻愮ず淇℃伅鐨勬柟娉?
QWhatsThis::add( saveButton, "Saves the current file." );
QToolTip 鍜?QWhatsThis 綾繪彁渚涗簡铏氭嫙鍑芥暟浠ヤ緵寮鍙戣呴噸鏂板疄鐜版洿澶氱殑鐗瑰畾鐨勭敤閫斻俀topia騫舵湭浣跨敤涓婅堪鎻愬強鐨勪袱縐嶅府鍔╋紙鏃佽堪錛夋満鍒躲傚畠鍦ㄥ簲鐢ㄧ獥鍙g殑鏍囬鏍忎笂鏀劇疆涓涓?#8220;錛?#8221;絎﹀彿鐨勬寜閽潵浠f浛涓婅堪鐨勬梺榪版満鍒訛紝榪欎釜“錛?#8221;鎸夐挳鍙互鍚姩涓涓祻瑙堝櫒鏉ユ樉紺哄拰褰撳墠搴旂敤鐩稿叧鐨凥TML欏甸潰銆俀topia浣跨敤鎸変笅鍜屾彙浣忕殑濮挎佹潵璋冪敤涓婁笅鏂囪彍鍗曪紙鍙沖嚮錛夊拰灞炴у璇濇銆?/p>
2錛?錛? 鍔ㄤ綔
搴旂敤紼嬪簭閫氬父鎻愪緵緇欑敤鎴峰嚑縐嶄笉鍚岀殑鏂瑰紡鍘繪墽琛岀壒鍒殑鍔ㄤ綔銆備緥濡傦紝澶ч儴鍒嗗簲鐢ㄦ彁渚涗簡涓涓?#8220;Save”鍔ㄤ綔緇欑敤浜庡瓨鐩樼殑鑿滃崟(File|Save)浠ュ強宸ュ叿鏍忥紙涓涓?#8220;杞洏”鍥炬爣鐨勫伐鍏鋒爮鎸夐挳錛夊拰蹇嵎閿?Ctrl+S)銆俀action綾誨彲浠ヨ涓婅堪榪囩▼鍙樺緱綆媧侊紝瀹冨厑璁哥▼搴忓憳鍦ㄤ竴涓湴鏂瑰畾涔変竴涓姩浣滐紝鐒跺悗鎶婅繖涓姩浣滃姞鍏ュ埌鑿滃崟鎴栬呭伐鍏鋒爮錛岃繖涓繃紼嬩笌鎶婅彍鍗曢」鍔犲叆鍒拌彍鍗曠殑閬撶悊鏄竴鏍風殑銆?br>涓嬮潰鐨勪唬鐮佸疄鐜頒簡涓涓?#8220;Save”鑿滃崟欏瑰拰涓涓?#8220;Save”宸ュ叿鎸夐挳錛屾梺榪扮郴緇熷拰蹇嵎閿彲
浠ュ緢瀹規槗鐨勬坊鍔犺繘鍘伙紝浣嗘槸鎴戜滑娌℃坊鍔狅紝鍥犱負瀹冧滑寰堝皯鍦ㄥ祵鍏ュ紡璁懼涓婁嬌鐢ㄣ?br>QAction *saveAct = new QAction( this );
saveAct->setText( "Save" );
saveAct->setIconSet( QPixmap("save.png") );
connect( saveAct, SIGNAL(activated()), this, SLOT(save()) );
saveAct->addTo( fileMenu );
saveAct->addTo( toolbar );
闄や簡涓嶇敤澶嶅埗浠g爜錛屼嬌鐢≦action 榪樺彲浠ョ‘淇濊彍鍗曠殑鐘舵佷笌宸ュ叿鏍忔寜閽殑鐘舵佷繚鎸佷竴鑷達紝蹇呰鐨勬椂鍊欒繕鍙樉紺烘彁紺烘爮銆備嬌涓涓姩浣滐紙Action錛夊け鏁堝皢瀵艱嚧鍜岃鍔ㄤ綔鐩稿叧鑱旂殑鑿滃崟欏逛互鍙婂伐鍏鋒寜閽殑澶辨晥銆傚悓鏍風殑錛屽鏋滅敤鎴峰垏鎹竴涓伐鍏鋒寜閽殑鐘舵侊紝閭d箞鐩稿叧鐨勮彍鍗曢」鐨勪篃浼氳窡鐫琚変腑鎴栦笉閫変腑銆?/p>
2錛? 瀵硅瘽妗?br>浣跨敤Qt 鍥懼艦璁捐鍣ㄨ繖涓彲瑙嗗寲璁捐宸ュ叿鐢ㄦ埛鍙互寤虹珛鑷繁鐨勫璇濇銆俀t 浣跨敤甯冨眬綆$悊鑷姩鐨勮緗獥浣撲笌鍒殑紿椾綋涔嬮棿鐩稿鐨勫昂瀵稿拰浣嶇疆錛岃繖鏍峰彲浠ョ‘淇濆璇濇鑳藉鏈濂界殑鍒╃敤灞忓箷涓婄殑鍙敤絀洪棿銆備嬌鐢ㄥ竷灞綆$悊鎰忓懗鐫鎸夐挳鍜屾爣絳懼彲浠ユ牴鎹鏄劇ず鐨勬枃瀛楄嚜鍔ㄧ殑鏀瑰彉鑷韓澶у皬錛岃岀敤鎴峰畬鍏ㄤ笉鐢ㄨ冭檻鏂囧瓧鏄偅涓縐嶈璦銆?/p>
2. 4. 1 甯冨眬
Qt 鐨勫竷灞綆$悊鐢ㄤ簬緇勭粐綆$悊涓涓埗紿椾綋鍖哄煙鍐呯殑瀛愮獥浣撱傚畠鐨勭壒鐐規槸鍙互鑷姩鐨勮緗瓙紿椾綋鐨勪綅緗拰澶у皬錛屽茍鍙垽鏂嚭涓涓《綰х獥浣撶殑鏈灝忓拰緙虹渷鐨勫昂瀵革紝褰撶獥浣撶殑瀛椾綋鎴栧唴瀹瑰彉鍖栧悗錛屽畠鍙互閲嶇疆涓涓獥浣撶殑甯冨眬銆備嬌鐢ㄥ竷灞綆$悊錛屽紑鍙戣呭彲浠ョ紪鍐欑嫭绔嬩簬灞忓箷澶у皬鍜屾柟鍚戜箣澶栫殑紼嬪簭錛屼粠鑰屼笉闇瑕佹氮璐逛唬鐮佺┖闂村拰閲嶅緙栧啓浠g爜銆傚浜庝竴浜涘浗闄呭寲鐨勫簲鐢ㄧ▼搴忥紝浣跨敤甯冨眬綆$悊錛屽彲浠ョ‘淇濇寜閽拰鏍囩鍦ㄤ笉鍚岀殑璇█鐜涓嬫湁瓚沖鐨勭┖闂存樉紺烘枃鏈紝涓嶄細閫犳垚閮ㄥ垎鏂囧瓧琚壀鎺夈傚竷灞綆$悊浣垮緱鎻愪緵閮ㄥ垎鐢ㄦ埛鎺ュ彛緇勪歡錛屼緥濡傝緭鍏ユ硶鍜屼換鍔℃爮鍙樺緱鏇村鏄撱傛垜浠彲浠ラ氳繃涓涓緥瀛愯鏄庤繖涓鐐癸紝褰換topia鐨勭敤鎴鋒鍦ㄨ緭鍏ユ枃瀛楁椂錛岃緭鍏ユ硶浼氬崰鐢ㄤ竴瀹氱殑鏂囧瓧絀洪棿錛屽簲鐢ㄧ▼搴忚繖鏃朵篃浼氭牴鎹彲鐢ㄧ殑灞忓箷灝哄鐨勫彉鍖栬皟鏁磋嚜宸便?br>鍥懼崄 Qtopia 鐨勫竷灞綆$悊
Qt鎻愪緵浜嗕笁縐嶇敤浜庡竷灞綆$悊鐨勭被錛歈HBoxLayout, QVBoxLayout 鍜?QgridLayout銆?br>鍥懼崄涓 QHBoxLayout, QVBoxLayout 鍜?QGridLayout 鐨勫竷灞鏁堟灉
QHBoxLayout 甯冨眬綆$悊鎶婄獥浣撴寜鐓ф按騫蟲柟鍚戜粠宸﹁嚦鍙蟲帓鎴愪竴琛?br>QVBoxLayout 甯冨眬綆$悊鎶婄獥浣撴寜鐓у瀭鐩存柟鍚戜粠涓婅嚦涓嬫帓鎴愪竴鍒?br>QGridLayout 甯冨眬綆$悊浠ョ綉鏍肩殑鏂瑰紡鏉ユ帓鍒楃獥浣擄紝涓涓獥浣撳彲浠ュ崰鎹涓綉鏍箋?br>鍦ㄥ鏁版儏鍐典笅錛屽竷灞綆$悊鍦ㄧ鐞嗙獥浣撴椂鎵ц鏈浼樺寲鐨勫昂瀵革紝榪欐牱紿楀彛鐪嬭搗鏉ュ氨鏇村ソ鐪嬭屼笖鍙互灝哄鍙樺寲浼氭洿騫蟲粦銆備嬌鐢ㄤ互涓嬬殑鏈哄埗鍙互綆鍖栫獥鍙e竷灞鐨勮繃紼嬶細
1銆?涓轟竴浜涘瓙紿楀彛璁劇疆涓涓渶灝忕殑灝哄錛屼竴涓渶澶х殑鎴栬呭浐瀹氱殑灝哄銆?br>2銆?澧炲姞鎷変幾欏癸紙stretch items錛夋垨鑰呴棿闅旈」 (spacer item)銆傛媺浼擱」鍜岄棿闅旈」鍙互濉厖涓涓帓鍒楃殑絀洪棿銆?br>3銆?鏀瑰彉瀛愮獥鍙g殑灝哄絳栫暐錛岀▼搴忓憳鍙互璋冩暣紿椾綋灝哄鏀瑰彉鏃剁殑涓浜涚瓥鐣ャ傚瓙紿椾綋鍙互琚緗負鎵╁睍錛岀揣緙╁拰淇濇寔鐩稿悓灝哄絳夌瓥鐣ャ?br>4銆?鏀瑰彉瀛愮獥鍙g殑灝哄鎻愮ず銆俀Widget::sizeHint() 鍜?QWidget::minimumSize-Hint() 鍑芥暟榪斿洖涓涓獥浣撴牴鎹嚜韜唴瀹硅綆楀嚭鐨勯閫夊昂瀵稿拰棣栭夋渶灝忓昂瀵?鎴戜滑鍦ㄥ緩绔嬬獥浣撴椂鍙冭檻閲嶆柊瀹炵幇榪欎袱涓嚱鏁般?br>5銆佽緗媺浼告瘮渚嬬郴鏁般傝緗媺浼告瘮渚嬬郴鏁版槸鎸囧厑璁稿紑鍙戣呰緗獥浣撲箣闂村崰鎹┖闂村ぇ灝忕殑姣斾緥緋繪暟錛屼緥濡傛垜浠瀹氬彲鐢ㄧ┖闂寸殑2/3 鍒嗛厤緇欑獥浣揂錛屽墿涓嬬殑1/3 鍒欏垎閰嶇粰紿椾綋B銆傚竷灞綆$悊涔熷彲鎸夌収浠庡彸鑷沖乏錛屼粠涓嬪埌涓婄殑鏂瑰紡鏉ヨ繘琛屻傚綋涓浜涘浗闄呭寲鐨勫簲鐢ㄩ渶瑕佹敮鎸佷粠鍙寵嚦宸﹂槄璇諱範鎯殑璇█鏂囧瓧錛堜緥濡傞樋鎷変集鍜屽笇浼潵錛夋椂錛屼嬌鐢ㄤ粠鍙寵嚦宸︾殑甯冨眬鎺掑垪鏄洿鏂逛究鐨勩傚竷灞鏄彲浠ュ祵濂楃殑鍜岄殢鎰忚繘琛岀殑銆備笅闈㈡槸涓涓璇濇鐨勪緥瀛愶紝瀹冧互涓ょ涓嶅悓灝哄澶у皬鏉ユ樉紺猴細
鍥懼崄浜?灝忕殑瀵硅瘽妗嗗拰澶х殑瀵硅瘽妗?br>榪欎釜瀵硅瘽妗嗕嬌鐢ㄤ簡涓夌鎺掑垪鏂瑰紡銆俀VBoxLayout綆$悊涓緇勬寜閽紝QHBoxLayout綆$悊涓涓樉紺哄浗瀹跺悕縐扮殑鍒楄〃妗嗗拰鍙寵竟閭g粍鎸夐挳錛?QVBoxLayout綆$悊紿椾綋涓婂墿涓嬬殑緇勪歡“Now pleaseselect a country”鏍囩銆傚湪“< Prev”鍜?#8220;Help”鎸夐挳涔嬮棿鏀劇疆浜嗕竴涓媺浼擱」錛坰tretch items錛夛紝浣垮緱涓よ呬箣闂翠繚鎸佷簡涓瀹氭瘮渚嬬殑闂撮殧銆?br>寤虹珛榪欎釜瀵硅瘽妗嗙獥浣撳拰甯冨眬綆$悊鐨勫疄鐜頒唬鐮佸涓嬶細
QVBoxLayout *buttonBox = new QVBoxLayout( 6 );
buttonBox->addWidget( new QPushButton("Next >", this) );
buttonBox->addWidget( new QPushButton("< Prev", this) );
buttonBox->addStretch( 1 );
buttonBox->addWidget( new QPushButton("Help", this) );
QListBox *countryList = new QListBox( this );
countryList->insertItem( "Canada" );
/* … */
countryList->insertItem( "United States of America" );
QHBoxLayout *middleBox = new QHBoxLayout( 11 );
middleBox->addWidget( countryList );
middleBox->addLayout( buttonBox );
QVBoxLayout *topLevelBox = new QVBoxLayout( this, 6, 11 );
topLevelBox->addWidget( new QLabel("Now please select a country", this) );
topLevelBox->addLayout( middleBox );
浣跨敤Qt 鍥懼艦璁捐鍣ㄨ璁$殑榪欎釜瀵硅瘽妗嗭紝鏄劇ず濡備笅
鍥懼崄涓?Qt 鍥懼艦璁捐鍣ㄤ腑浣跨敤浜嗗竷灞鐨勫璇濇
2. 4. 2 Qt 鍥懼艦璁捐鍣?br>Qt 鍥懼艦璁捐鍣ㄦ槸涓涓叿鏈夊彲瑙嗗寲鐢ㄦ埛鎺ュ彛鐨勮璁″伐鍏楓俀t 鐨勫簲鐢ㄧ▼搴忓彲浠ュ畬鍏ㄧ敤婧愪唬鐮佹潵緙栧啓錛屾垨鑰呬嬌鐢≦t 鍥懼艦璁捐鍣ㄦ潵鍔犻熷紑鍙戝伐浣溿傚惎鍔≦t 鍥懼艦璁捐鍣ㄧ殑鏂規硶鏄細
鍦↙inux 鍛戒護妯″紡涓嬶紝閿叆浠ヤ笅鍛戒護(鍋囪Qt X11 瀹夎鍦?usr/local 涓?錛?br>cd qt-2.3.2/bin
./designer
榪欐牱灝卞彲浠ュ惎鍔ㄤ竴涓笌Windows 涓嬬殑Delphi 鐩哥被浼肩晫闈€?涓嬪浘鏄嬌鐢≦t 鍥懼艦璁捐鍣ㄨ璁′竴涓〃鍗曠殑鎴睆鍥俱?br>鍥懼崄鍥?Qt 鍥懼艦璁捐鍣?br>寮鍙戣呯偣鍑誨伐鍏鋒爮涓婄殑浠h〃涓嶅悓鍔熻兘鐨勫瓙紿椾綋/緇勪歡鐨勬寜閽紝鐒跺悗鎶婂畠鏀懼埌涓涓〃鍗曚笂闈紝榪欐牱灝卞彲浠ユ妸涓涓瓙紿椾綋/緇勪歡鏀懼埌琛ㄥ崟涓婁簡銆傚紑鍙戣呭彲浠ヤ嬌鐢ㄥ睘鎬у璇濇鏉ヨ緗瓙紿椾綋鐨勫睘鎬с傜簿紜殑璁劇疆瀛愮獥浣撶殑浣嶇疆鍜屽昂瀵稿ぇ灝忔槸娌″繀瑕佺殑銆傚紑鍙戣呭彲浠ラ夋嫨涓緇勭獥浣擄紝鐒跺悗瀵逛粬浠繘琛屾帓鍒椼備緥濡傦紝鎴戜滑閫夊畾浜嗕竴浜涙寜閽獥浣擄紝鐒跺悗浣跨敤“姘村鉤鎺掑垪錛坙ay out horizontally錛?#8221;閫夐」瀵瑰畠浠繘琛屼竴涓帴涓涓殑姘村鉤鎺掑垪銆傝繖鏍峰仛浣垮緱璁捐宸ヤ綔鍙樺緱鏇村揩錛岃屼笖瀹屾垚鍚庣殑紿椾綋灝嗚兘澶熸寜鐓у睘鎬ц緗殑姣斾緥濉厖紿楀彛鐨勫彲鐢ㄥ昂瀵歌寖鍥淬備嬌鐢≦t 鍥懼艦璁捐鍣ㄨ繘琛屽浘褰㈢敤鎴鋒帴鍙g殑璁捐鍙互娑堥櫎搴旂敤鐨勭紪璇戯紝閾炬帴鍜岃繍琛屾椂闂達紝鍚屾椂浣垮緱淇敼鍥懼艦鐢ㄦ埛鎺ュ彛鐨勮璁″彉寰楁洿瀹規槗銆俀t 鍥懼艦璁捐鍣ㄧ殑棰勮鍔熻兘鍙互浣垮紑鍙戣呰兘澶熷湪寮鍙戦樁孌電湅鍒板悇縐嶆牱寮忕殑鍥懼艦鐢ㄦ埛鐣岄潰錛屽寘鎷鎴鋒牱寮忕殑鐢ㄦ埛鐣岄潰銆傞氳繃Qt闆嗘垚鐨勫姛鑳藉己澶х殑鏁版嵁搴撶被錛孮t 鍥懼艦璁捐鍣ㄨ繕鍙彁渚涚敓鍔ㄧ殑鏁版嵁搴撴暟鎹祻瑙堝拰緙栬緫鎿嶄綔銆?br>寮鍙戣呭彲浠ュ緩绔嬪悓鏃跺寘鍚湁瀵硅瘽妗嗗拰涓葷獥鍙g殑搴旂敤錛屽叾涓富紿楀彛鍙互鏀劇疆鑿滃崟錛屽伐鍏鋒爮錛屾梺榪板府鍔╃瓑絳夌殑瀛愮獥鍙i儴浠躲俀t 鍥懼艦璁捐鍣ㄦ彁渚涗簡鍑犵琛ㄥ崟妯℃澘錛屽鏋滅獥浣撲細琚涓笉鍚岀殑搴旂敤鍙嶅浣跨敤錛岄偅涔堝紑鍙戣呬篃鍙緩绔嬭嚜宸辯殑琛ㄥ崟妯℃澘錛屼互紜繚紿椾綋鐨勪竴鑷存с俀t 鍥懼艦璁捐鍣ㄤ嬌鐢ㄥ悜瀵兼潵甯姪浜轟滑鏇村揩鏇存柟渚跨殑寤虹珛鍖呭惈鏈夊伐鍏鋒爮銆佽彍鍗曞拰鏁版嵁搴撶瓑鏂歸潰鐨勫簲鐢ㄣ傜▼搴忓憳鍙互寤虹珛鑷繁鐨勫鎴風獥浣擄紝騫舵妸瀹冮泦鎴愬埌Qt 鍥懼艦璁捐鍣ㄤ腑銆俀t 鍥懼艦璁捐鍣ㄨ璁$殑鍥懼艦鐣岄潰浠ユ墿灞曞悕“ui”鐨勬枃浠惰繘琛屼繚瀛橈紝榪欎釜鏂囦歡鏈夎壇濂界殑鍙鎬э紝榪欎釜鏂囦歡鍙uic錛圦t 鎻愪緵鐨勭敤鎴鋒帴鍙g紪璇戝伐鍏鳳級緙栬瘧鎴愪負C錛嬶紜鐨勫ご鏂囦歡鍜屾簮鏂囦歡銆俀make 宸ュ叿鍦ㄥ畠涓哄伐紼嬬敓鎴愮殑Makefile 鏂囦歡涓嚜鍔ㄧ殑鍖呭惈浜唘ic 鐢熸垚澶存枃浠跺拰婧愭枃浠剁殑瑙勫垯銆傚彟涓縐嶅彲閫夌殑鍋氭硶鏄紝鍦ㄥ簲鐢ㄧ▼搴忚繍琛屾湡闂磋澆鍏i 鏂囦歡錛岀劧鍚庢妸瀹冭漿鍙樹負鍏峰鍘熷厛鍏ㄩ儴鍔熻兘鐨勮〃鍗曘傝繖鏍峰紑鍙戣呭氨鍙互鍦ㄧ▼搴忚繍琛屾湡闂村姩鎬佷慨鏀瑰簲鐢ㄧ殑鐣岄潰錛岃屼笉闇閲嶆柊緙栬瘧搴旂敤錛屽彟涓鏂歸潰錛屼篃浣垮緱搴旂敤鐨勬枃浠跺昂瀵稿噺灝忎簡銆?/p>
2. 4. 3 寤虹珛瀵硅瘽妗?br>Qt 涓鴻澶氶氱敤鐨勪換鍔℃彁渚涗簡鐜版垚鐨勫寘鍚簡瀹炵敤鐨勯潤鎬佸嚱鏁扮殑瀵硅瘽妗嗙被錛屼笅杈規槸涓浜決t 鐨勬爣鍑嗙殑瀵硅瘽妗嗙殑鎴睆鍥俱俀messageBox綾繪槸涓涓敤浜庡悜鐢ㄦ埛鎻愪緵淇℃伅鎴栨槸緇欑敤鎴瘋繘琛屼竴浜涚畝鍗曢夋嫨錛堜緥濡?“yes”鎴?#8220;no”錛夌殑瀵硅瘽妗嗙被銆?br>鍥懼崄浜?涓涓猀MessageBox 瀵硅瘽妗?br>progressDialog瀵硅瘽妗嗗寘鍚簡涓涓繘搴︽爮鍜屼竴涓?#8220;Cancel”鎸夐挳鍥懼崄鍏?涓涓猀progressDialog 瀵硅瘽妗哘wizard綾繪彁渚涗簡涓涓悜瀵煎璇濇鐨勬鏋?br>鍥懼崄涓?涓涓悜瀵肩被
Qt鎻愪緵鐨勫璇濇榪樺寘鎷琎ColorDialog, QFileDialog, QFontDialog 鍜孮printDialog銆傝繖浜涚被閫氬父閫傜敤浜庢闈㈠簲鐢紝涓鑸笉浼氬湪Qt/Embedded涓紪璇戜嬌鐢ㄥ畠浠?/p>
2錛? 澶栧艦涓庢劅瑙?br>Qt 妗岄潰搴旂敤闅忕潃鎵ц鐜錛堜緥濡俉indows XP, Mac OS X, Linux錛夌殑涓嶅悓鑰屽叿鏈変笉鍚岀殑鏍峰紡錛屾垨鑰呭彨鍋氬褰笌鎰熻銆俀t/Embedded 鐨勫簲鐢ㄥ彲浠ヤ嬌鐢ㄤ笉鍚屾搷浣滅幆澧冩彁渚涚殑鏍峰紡錛屼篃鍙互浠ラ潤鎬佹垨鎻掍歡鐨勬柟寮忎嬌鐢ㄥ鎴鋒牱寮忋傚紑鍙戣呭彲浠ヨ璁¤嚜宸辯獥浣撶殑鏍峰紡鍜岀獥鍙h楗般?/p>
2錛?錛? 紿椾綋鏍峰紡
涓涓牱寮忔槸涓涓疄鐜癚t紿椾綋澶栧艦涓庤瑙夋晥鏋滅殑綾籕style鐨勫瓙綾匯俀t/Embedded 紼嬪簭鍛樺彲浠ヨ嚜鐢辯殑浣跨敤鍜屼慨鏀圭洰鍓嶅瓨鍦ㄧ殑鏍峰紡錛屼篃鍙互浣跨敤Qt鏍峰紡璁捐寮曟搸瀹炵幇鑷繁鐨勬牱寮忋傜洰鍓峇t/Embedded鎻愪緵鐨勬牱寮忕被鍨嬫湁 EmbeddedareWindows, Motif, MotifPlus,CDE, Platinum 鍜?SGI銆傛牱寮忓彲浠ヨ鍔ㄦ佺殑璁劇疆鍒頒竴涓簲鐢ㄤ腑錛岀敋鑷沖彲浠ヨ緗埌鐗瑰畾鐨勭獥浣撲笂銆?br>鍥懼崄鍏?浠ヤ笉鍚屾牱寮忓緩绔嬬殑涓嬫媺妗?br>閫氳繃緇欎竴緇勭浉鍏崇殑搴旂敤緙栧啓涓涓鎴鋒牱寮忥紝鍙互璁╄繖浜涘簲鐢ㄧ殑澶栬鍏鋒湁涓庝紬涓嶅悓鐨勬劅瑙夈傚緩绔嬪鎴鋒牱寮忓彲浠ラ氳繃瀛愮被鍖朡Style錛孮commonStyle鎴栬?QcommonStyle鐨勬淳鐢熺被鏉ュ疄鐜般傞氳繃閲嶆柊瀹炵幇鐜版湁鏍峰紡鍩虹被鐨勪竴涓や釜铏氬嚱鏁板彲浠ュ緢瀹規槗瀵圭幇鏈夋牱寮忓仛涓浜涘皬鐨勪慨鏀廣備竴涓牱寮忓彲浠ョ紪璇戞垚涓轟竴涓彃浠訛紝鍦≦t 鍥懼艦璁捐鍣ㄤ腑錛屾妸鏍峰紡鍋氭垚鎻掍歡鐨勮瘽錛屽紑鍙戣呭氨鍙互浠ヨ澶囩殑瀹㈡埛鏍峰紡鏉ラ瑙堣璁″嚭鏉ョ殑琛ㄥ崟銆傛牱寮忔彃浠朵嬌寰楀紑鍙戣呬笉闇閲嶆柊緙栬瘧灝卞彲鏀瑰彉璁懼鐨勫瑙傘?br>鍥懼崄涔?Qstyle 鐨勭戶鎵垮浘
Qt 鍙戝竷鐨勭獥浣撻兘鏄牱寮忓凡鐭ョ殑錛屽綋瀹冧滑鐨勬牱寮忔敼鍙樺悗錛岀獥浣撲細鑷姩閲嶇粯銆傚鎴風獥浣撳拰瀵硅瘽妗嗗ぇ澶氭暟閮芥槸Qt鍘熷厛鍙戝竷鐨勭獥浣撳拰甯冨眬鐨勯噸鏂版暣鍚堛傚畠浠篃鏄嚜鍔ㄧ殑鑾峰緱鍘熷厛鐨勬牱寮忋傚湪灝戞暟鍦哄悎錛屽綋鏈夊繀瑕佸啓涓涓瑙備笂寰堥殢鎰忕殑紿椾綋鏃訛紝寮鍙戣呭彲浠ヤ嬌鐢≦Style鍘誨啓涓浜涚敤鎴鋒帴鍙e厓绱狅紝鑰屼笉鏄洿鎺ョ殑緇樺埗鍥烘湁鐨勭煩褰€?/p>
2錛?錛? 紿楀彛瑁呴グ
欏剁駭紿楀彛鐨勮楗版槸鐢變竴涓爣棰樻爮鍜屼竴涓鏋剁粍鎴愮殑銆俀t/Embedded 鍖呮嫭浜嗚繖浜涚獥鍙f牱寮忥細BeOS, Hydro, KDE 鍜?Windows銆?br>鍥句簩鍗?涓嶅悓鐨勫鉤鍙頒笂鐨勭獥鍙i鏍?br>濡傛灉闇瑕佺殑璇濓紝鎴戜滑鍙互閰嶇疆涓嶅悓鐨勭獥鍙d嬌鐢ㄤ笉鍚岀殑紿楀彛瑁呴グ銆傞氳繃瀛愮被鍖朡WSDecoration,鎴戜滑鍙互寤虹珛瀹㈡埛鐨勮楗版牱寮忥紝騫朵笖鎶婂畠浠互鎻掍歡鐨勫艦寮忚繘琛屽彂甯冦備負浜嗗湪紿楀彛綆$悊鍣ㄤ箣澶栬繘琛屾洿澶氱殑鎺у埗琛屼負錛屽紑鍙戣呴渶瑕佸瓙綾誨寲QWSManager銆?/p>
2錛? 鍥介檯鍖?br>Qt/Embedded 瀹屽叏鏀寔Unicode錛屼竴涓浗闄呮爣鍑嗙殑瀛楃闆嗐傚紑鍙戣呭湪浠栦滑鐨勫簲鐢ㄤ腑鍙互鑷敱鐨勬販鍚堜嬌鐢ㄨUnicode瀛楃闆嗘敮鎸佺殑璇█錛屼緥濡傞樋鎷変集鏂囷紝鑻辨枃錛屼腑鏂囷紝甯屼集鏉ユ枃錛屾棩鏂囧拰淇勬枃絳夈備負浜嗘湁鍔╀簬鍏徃灝嗕駭鍝佹帹鍚戝浗闄呭競鍦猴紝Qt榪樻彁渚涗簡灝嗗簲鐢ㄧ炕璇戞垚鏀寔澶氱璇█鐜鐨勫伐鍏楓?/p>
2錛?錛? Unicode
Qt 浣跨敤QString 瀛樺偍Unicode 緙栫爜鐨勫瓧絎︿覆錛孮string 鍙栦唬浜嗙矖緋欑殑const char *錛涘畠鎻愪緵浜嗙敤浜庡鐞哘string 鍜宑onst char *涔嬮棿鐩鎬簰杞崲鐨勬瀯閫犲嚱鏁板拰鎿嶄綔絎︺傚洜涓篞t 浣跨敤浜嗛殣寮忓叡浜?鍐欐椂澶嶅埗)鎶鏈潵鍑忓皯鍐呭瓨鐨勪嬌鐢?鎵浠ョ洿鎺ュ鍒禥string 鐨勫兼槸涓嶄細浜х敓闂鐨勩備負鏈夋晥鐜囩殑瀛樺偍ASII 鐮佸瓧絎︿覆錛孮t 榪樻彁渚涗簡QCString 綾匯俀t 涓烘墍鏈夎鏄劇ず鍦ㄥ睆騫曚笂鐨勬枃鏈紝鍖呮嫭鏈綆鍗曠殑鏂囧瓧鏍囩鍒版渶澶嶆潅鐨勫鏂囨湰緙栬緫鍣紝鎻愪緵浜嗕竴涓己澶х殑Unicode 鏂囨湰鍛堢幇寮曟搸銆傝繖涓紩鎿庢敮鎸佷竴浜涘厛榪涚殑鐗瑰緛錛屼緥濡傜壒孌婄殑闂撮殧綰褲佸弻鍚戝啓鍜屽尯鍒爣璁般傚畠鍑犱箮鏀寔涓栫晫涓婃墍鏈夌殑涔﹀啓緋葷粺錛屽寘鎷樋鎷変集鏂囷紝涓枃錛屽彜鏂媺澶枃錛岃嫳鏂囷紝甯岃厞鏂囷紝甯屼集鏉ユ枃錛屾棩鏂囷紝闊╂枃錛屾媺涓佸拰瓚婂崡鏂囥備綋鐜拌繖涓紩鎿庣殑鏈浼樺寲鎬ц兘鐨勫父鐢ㄧ殑渚嬪瓙灝辨槸錛氬湪甯︽湁鍔犻熷姛鑳界殑鏂囧瓧鐨勪笅鏂規樉紺轟竴鏉′笅鍒掔嚎錛堜緥濡?File錛夈俀textCodec 鐨勫瓙綾葷敤浜庡鐞嗕笉鍚岀紪鐮佺被鍨嬬殑瀛楃闆嗕箣闂寸殑杞崲銆俀t 3.0 鏀寔37 縐嶄笉鍚岀殑緙栫爜鏂瑰紡錛屽寘鎷腑鏂囩殑Big5 鍜孏BK,鏃ユ枃鐨凟UC-JP銆丣IS 鍜孲hift-JIS錛屼縿緗楁柉鐨凨OI8-R鍜孖SO 8859 緋誨垪銆傚畠浠彲浠ヤ互搴撶殑涓閮ㄥ垎鎴栬呮彃浠剁殑褰㈠紡緙栬瘧錛屾垨鑰呬嬌鐢?#8220;feature”鏈哄埗鍘婚櫎榪欎簺緙栬瘧銆?/p>
2錛?錛? 搴旂敤鐨勭炕璇?br>Qt 鎻愪緵浜嗙浉搴旂殑宸ュ叿鍜屽嚱鏁扮敤浜庡府鍔╁紑鍙戣呬互浠栦滑鐨勬湰鍦拌璦鎺ㄥ嚭搴旂敤銆傝浣夸竴涓瓧絎︿覆鍙互琚炕璇戯紝浣犻渶瑕佹妸榪欎釜瀛楃涓蹭綔涓轟竴涓弬鏁版斁鍒皌r錛堬級鍑芥暟涓皟鐢ㄣ備緥濡傦細
saveButton->setText( tr("Save") );
Qt 灝濊瘯瀵繪壘瀛楃涓?Save"鐨勮瘧鏂囷紝濡傛灉鎵懼埌鐨勮瘽錛屽氨浼氭妸瀹冪殑璇戞枃鏄劇ず鍑烘潵錛屽鏋滄壘涓嶅埌錛屽氨鐢ㄥ師鏉ョ殑瀛楃涓?Save"榪涜鏄劇ず銆備緥濡傛垜浠妸鑻辨枃浣滀負婧愯璦錛岀幇鍦ㄦ垜浠鎶婅繖涓簮璇█緲昏瘧鎴愪腑鏂囷紝鍗充腑鏂囦負緲昏瘧鐨勭洰鏍囪璦錛屼互姝ょ被鎺ㄣ傝繖鏍峰綋鎴戜滑璋冪敤tr錛堬級鍑芥暟鍚庯紝鍑芥暟鐨勫弬鏁扮殑鍘熷厛鐨勭己鐪佺紪鐮佸氨浼氳漿鍙樹負 Unicode 緙栫爜銆俆r()鍑芥暟鐨勯氬父鐢ㄦ硶涓猴細
Context::tr("source text", "comment")
涓婇潰鐨?“Context” 鏄寚涓涓猀Object 瀵硅薄鐨勫瓙綾葷殑鍚嶇О銆傚鏋滃湪涓涓寘鍚簡tr錛堬級鎴愬憳鍑芥暟鐨勭被鐨勪笂涓嬫枃鐜涓嬌鐢╰r錛堬級鍑芥暟鏃訛紝“Context”閫氬父鍙互鐪佺暐鎺夈備緥濡傦細
Context錛氾細func1錛堬級
{
setText( tr("Save") );
}
“source text”鏄寚瑕佺炕璇戠殑鏂囨湰鐨勫唴瀹?“comment”鏄竴涓彲閫夐」錛屽畠鐢ㄤ簬緇欐墜宸ョ炕璇戣呮彁渚涗竴浜涢澶栫殑淇℃伅銆傝浜嗗崐澶╋紝榪樻湁涓涓噸瑕佺殑鍐呭鎴戜滑娌¤皥錛屽氨鏄痶r錛堬級鍑芥暟濡備綍瀵繪壘鍒拌瘧鏂囥傛垜浠鎶婁竴涓簮瀛楃涓茬炕璇戜負鍜屽畠瀵瑰簲鐨勮瘧鏂囷紙鐩爣璇█鐨勫瓧絎︿覆錛夋椂錛屾垜浠渶瑕佽Qt 鐭ラ亾榪欎簺璇戞枃鏀懼湪鍝噷銆俀t 瑙勫畾浜嗚瘧鏂囧瓨鍌ㄥ湪QTranslator 瀵硅薄涓紝榪欎釜瀵硅薄鏄粠涓涓唴瀛樻槧灝勬枃浠訛紙鎵╁睍鍚嶄負pm錛変腑璇誨彇璇戞枃銆傛瘡涓猵m 鏂囦歡鍖呭惈浜嗘煇縐嶈璦鐨勮瘧鏂囦俊鎭傛墍浠ュ紑鍙戣呴渶瑕佸緩绔嬩竴涓猵m 鏂囦歡鏉ュ瓨鍌ㄥ簲鐢ㄤ腑闇瑕佺炕璇戠殑瀛楃涓茬殑璇戞枃銆俀t 鎻愪緵浜? 縐嶅伐鍏峰府鍔╀漢浠緩绔嬭瘧鏂囧瓨鍌ㄦ枃浠訛紙.pm 鏂囦歡錛夛紝榪? 涓伐鍏鋒槸lupdate, QtLinguist 鍜?lrelease.
1銆乴update 鑷姩鍦頒粠婧愪唬鐮佹枃浠訛紙.cpp錛夊拰鐣岄潰鎺ュ彛鏂囦歡錛?ui錛変腑鑾峰彇鎵鏈夐渶瑕佺炕璇戠殑瀵硅薄錛屽嵆涓婅堪鐨勶紙“Context”錛夛紱鍚屾椂榪樿幏鍙栬緲昏瘧鐨勬墍鏈夌殑瀛楃涓詫紙婧愯璦鐨勫瓧絎︿覆錛夛紝鍗充笂榪扮殑“source text”;“comment”閫夐」濡傛灉琚嬌鐢ㄧ殑璇濓紝涔熶細琚撼鍏ユ敹闆嗙殑鑼冨洿銆傚綋榪欎簺淇℃伅鏀墮泦瀹屾瘯鍚庯紝lupdate 鏈鍚庝細鐢熸垚涓涓?ts 鏂囦歡錛堢炕璇戞簮鏂囦歡錛夛紝榪欎釜鏂囦歡鏄洿鎺ュ彲闃呰鐨勩?br>2銆佸紑鍙戣呬嬌鐢≦t Linguist 宸ュ叿鎻愪緵鐨勮壇濂界殑浜烘満鐣岄潰鎵撳紑涓涓?ts 鏂囦歡錛堢炕璇戞簮鏂囦歡錛夛紝鐒跺悗寮鍙戣呮牴鎹瘡涓涓猻ource text 濉啓涓婄浉瀵瑰簲鐨勮瘧鏂囷紝榪欐牱涓涓?ts 鏂囦歡錛堢炕璇戞簮鏂囦歡錛夊氨鍖呭惈浜嗗畬鏁寸殑“Context”錛?#8220;source text”鍜岃瘧鏂囦俊鎭?br>3銆佹渶鍚庨氳繃榪愯lrelease 鍘繪妸涓涓?ts 鏂囦歡錛堢炕璇戞簮鏂囦歡錛夊帇緙╀負涓涓?pm 鏂囦歡錛堣瘧鏂囧瓨鍌ㄦ枃浠訛級錛岀敓鎴愮殑.pm 鏂囦歡鍙敤鍦ㄥ祵鍏ュ紡璁懼涓娿?br>鍦ㄤ竴涓簲鐢ㄧ殑鐢熷瓨鏈熼棿閲岋紝涓婅堪鐨勬楠ゆ湁鍙兘鏍規嵁闇瑕佷細琚弽澶嶆墽琛屻傚嬈¤繍琛宭update 鏄緢瀹夊叏鐨勶紝浣犲彲浠ラ噸澶嶄嬌鐢ㄥ凡緇忓瓨鍦ㄧ殑璇戞枃錛?pm錛夋枃浠訛紝鎴栬呭綋浣犱笉鎯充嬌鐢ㄦ煇浜涚炕璇戞枃浠舵椂浣犲彲浠ユ爣璁拌繖浜涚炕璇戞簮鏂囦歡涓烘棫鏂囦歡錛岃屼笉闇瑕佸垹闄ゅ畠浠?/p>