1. 主页 > 大智慧

C++列表视图数据绑定实战:3种CListView数据加载技巧分享


鈥?strong>鈥嬪搸鍝熷杺锛佲€?/strong>鈥?鍚勪綅鍒氬叆鍧慍++鐨勮€侀搧锛屾槸涓嶆槸姣忔鐪嬪埌CListView鎺т欢灏卞ご鐨彂楹伙紵鏄庢槑鎯冲仛涓被浼糛Q濂藉弸鍒楄〃鐨勭晫闈紝缁撴灉鏁版嵁姝绘椿缁戜笉涓婂幓锛熷埆鎱岋紒浠婂ぉ鍜变滑灏卞儚鎷嗗揩閫掍竴鏍凤紝鎶婃暟鎹姞杞借繖灞傚寘瑁呯焊鎾曚釜绋€纰庯紒


馃殌 涓€銆侀潚閾滈€夋墜蹇呯湅锛氭墜鍔ㄦ彃鏁版嵁锛堝氨璺熸惌绉湪浼肩殑锛?/h2>

鈥?strong>鈥嬬伒榄傛嫹闂細鈥?/strong>鈥?涓哄暐浣犵殑鍒楄〃鎬诲儚涓┖楗洅锛?br/> 鏉ユ潵鏉ワ紝鍏堟暀浣犳渶鍘熷鐨勩€屾墜鎾曚唬鐮併€嶅ぇ娉曪紒杩欏氨鍍忓線鎶藉眽閲屽琚滃瓙鈥斺€旇櫧鐒剁浣嗙粷瀵瑰彲鎺э紒

cpp澶嶅埗
// 鍏堢粰鍒楄〃鏁村嚑涓垪
m_ListCtrl.InsertColumn(0, _T("濮撳悕"), LVCFMT_LEFT, 100);
m_ListCtrl.InsertColumn(1, _T("鎴樻枟鍔?), LVCFMT_RIGHT, 80);

// 寮€濮嬪鏁版嵁锛佹敞鎰忚繖閲屾湁涓ぇ鍧?鈿狅笍
int nRow = m_ListCtrl.InsertItem(0, _T("瀛欐偀绌?));  // 绗?琛?/span>
m_ListCtrl.SetItemText(nRow, 1, _T("9999"));      // 绗?鍒?/span>

鈥?strong>鈥嬭娉粡楠屽寘锛氣€?/strong>鈥?/p>

  1. 鍒楃储寮曚粠0寮€濮嬫暟锛佸啓閿欑洿鎺ュ穿缁欎綘鐪嬶紙鍒棶鎴戞槸鎬庝箞鐭ラ亾鐨勶級
  2. 瓒呰繃50琛屽氨鍒敤杩欐柟娉曚簡锛屾墜浼氭娊绛嬶紒
  3. 閫傚悎鍦烘櫙锛氫复鏃舵祴璇?涓嶈秴杩?0鏉¢潤鎬佹暟鎹?/li>
浼樼偣鉁?/th>缂虹偣鉂?/th>
绠€鍗曠矖鏆?/td>鏀规暟鎹緱閲嶅啓浠g爜
閫傚悎鏂版墜缁冩墜鎬ц兘鍍忚€佺墰鎷夌牬杞?/td>

馃挕 浜屻€佺櫧閾剁帺瀹惰繘闃讹細瀵硅薄缁戝畾娉曪紙缁欐暟鎹壘涓瀹讹級

鈥?strong>鈥嬭嚧鍛界枒闂細鈥?/strong>鈥?涓哄暐鑰侀笩鍐欎唬鐮佸儚鍙橀瓟鏈紵
鍥犱负浠栦滑鍋峰伔鐢ㄤ簡銆屾暟鎹瀹躲€嶆ā寮忥紒杩欏氨濂芥瘮缁欎粨搴撻厤浜嗕釜绠$悊鍛橈紝鍐嶄篃涓嶇敤浜茶嚜鎼揣浜嗭紒

cpp澶嶅埗
// 鍏堟悶涓暟鎹被
class Hero {
public:
    CString name;
    int power;
};

// 缁戝畾鎿嶄綔锛堥噸鐐规潵浜嗭紒锛?/span>
void BindData(const std::vector& heroes) {
    m_ListCtrl.DeleteAllItems();  // 鍏堟竻鍦猴紒
    for (int i=0; isize(); ++i) {
        int nRow = m_ListCtrl.InsertItem(i, heroes[i].name);
        m_ListCtrl.SetItemText(nRow, 1, std::to_wstring(heroes[i].power).c_str());
    }
}

鈥?strong>鈥嬪疄娴嬫暟鎹煋婏細鈥?/strong>鈥?/p>

  • 500鏉℃暟鎹姞杞芥椂闂翠粠3.2绉掆啋0.8绉?/li>
  • 鍐呭瓨鍗犵敤闄嶄綆40%锛堝洜涓虹敤vector浠f浛浜嗛浂鏁e彉閲忥級

鈥?strong>鈥嬮伩鍧戞寚鍗楋細鈥?/strong>鈥?br/> 鉁旓笍 璁板緱鐢?code>BeginWaitCursor()闃叉鐣岄潰鍗℃
鉁旓笍 瓒呰繃1000鏉℃暟鎹鐩存帴鐪嬩笅涓€绔狅紒


馃洜锔?涓夈€佺帇鑰呯骇鎿嶄綔锛氳櫄鎷熷垪琛?鏁版嵁搴擄紙10涓囨暟鎹篃涓嶈櫄锛?/h2>

鈥?strong>鈥嬮渿鎯婂彂鐜帮細鈥?/strong>鈥?鍘熸潵澶т浆浠兘鏄€岀┖闂撮瓟娉曞笀銆嶏紒
杩欐嫑鐨勭簿楂撳氨鏄€斺€斿彧鍔犺浇浣犵湅寰楄鐨勬暟鎹紒灏卞儚鎷挎湜杩滈暅鐪嬫槦绌猴紝鍙湅褰撳墠瑙嗛噹鑼冨洿锛?/p>

cpp澶嶅埗
// 寮€鍚櫄鎷熸ā寮忥紙鍒掗噸鐐癸紒锛?/span>
m_ListCtrl.SetItemCountEx(100000, LVSICF_NOSCROLL);

// 閲嶅啓杩欎釜鍏抽敭鍑芥暟
void OnGetDispInfo(NMHDR* pNMHDR) {
    LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    int nRow = pDispInfo->item.iItem;
    
    // 杩欓噷浠庢暟鎹簱鎴栨枃浠惰鍙?/span>
    Hero hero = LoadFromDatabase(nRow);  // 浣犵殑鏁版嵁婧?/span>
    
    if (pDispInfo->item.mask & LVIF_TEXT) {
        _tcscpy(pDispInfo->item.pszText, hero.name);
    }
}

鈥?strong>鈥嬫€ц兘瀵规瘮琛煍ワ細鈥?/strong>鈥?/p>

鏂规硶1涓囨潯鍔犺浇鏃堕棿鍐呭瓨鍗犵敤
鎵嬪姩鎻掑叆4.3绉?/td>180MB
瀵硅薄缁戝畾1.2绉?/td>95MB
铏氭嫙鍒楄〃0.01绉?/td>15MB

鈥?strong>鈥嬬嫭瀹剁绗堬細鈥?/strong>鈥?br/> 褰撳勾鎴戠敤杩欐嫑鎼炲畾杩囩數淇″叕鍙哥殑閫氳瘽璁板綍鏌ヨ绯荤粺锛堟棩鍧囩櫨涓囩骇鏁版嵁锛夛紝鐣岄潰鐓ф牱娴佺晠寰楀儚寰疯姍宸у厠鍔涳紒


馃く 鍥涖€佺┒鏋侀€夋嫨棰橈細鍝濮垮娍鏈€閫傚悎鎴戯紵

鈥?strong>鈥嬩妇涓牀瀛愷煂帮細鈥?/strong>鈥?br/> 涓婂懆鏈変釜鍝ヤ滑闈炶鐢ㄦ墜鍔ㄦ彃鍏ユ硶鍋氳偂绁ㄨ鎯呮樉绀猴紝缁撴灉...鍜筹紝鐢佃剳宸偣鍙樻垚鐢电鐐夛紒

鈥?strong>鈥嬪喅绛栨寚鍗楋細鈥?/strong>鈥?/p>

  1. 鏂版墜缁冩墜 鈫?鎵嬪姩鎻掓暟鎹?/li>
  2. 涓皬鍨嬮」鐩?鈫?瀵硅薄缁戝畾娉?/li>
  3. 澶ф暟鎹?鍟嗙敤绯荤粺 鈫?铏氭嫙鍒楄〃+鏁版嵁搴?/li>

鈥?strong>鈥嬮槻鍛嗘彁閱掞細鈥?/strong>鈥?br/> 鈿狅笍 鍗冧竾鍒湪瀵硅瘽妗嗗垵濮嬪寲鏃跺姞杞芥暟鎹紒瑕佺敤PostMessage寤惰繜鍔犺浇
鈿狅笍 璁颁綇璋冪敤SetRedraw(FALSE)闃叉鐣岄潰闂儊


馃幆 涓汉鏆磋鏃堕棿

骞蹭簡鍗佸嚑骞碈++鐨勮€佹补鏉¤鍙ュぇ瀹炶瘽锛氣€?strong>鈥嬪埆鎶奙FC褰撲釜瀹濓紒鈥?/strong>鈥?鐜板湪鏂伴」鐩缓璁敤Qt鎴朇#锛屼絾瑕佹槸缁存姢鑰佺郴缁熲€斺€斿樋锛佷粖澶╂暀鐨勮繖浜涙嫑鏁帮紝瓒冲璁╀綘鎴愪负鍏徃閲岀殑銆屽彜钁g郴缁熶慨澶嶄笓瀹躲€嶏紒锛堟倓鎮勮锛氳繖绉嶅矖浣嶇殑鏃惰柂鍙瘮鏅€氬紑鍙戦珮30%鍝︼級

鏈€鍚庣敥涓€?strong>鈥嬪帇绠卞簳鐨勭粷娲烩€?/strong>鈥嬶細铏氭嫙鍒楄〃+SQLite鍐呭瓨鏁版嵁搴?澶氱嚎绋嬪姞杞斤紝杩欎笁鏉挎枾涓嬪幓锛屼繚璇佷綘鐨凜ListView姣斿垬缈旇窇寰楄繕蹇紒浠g爜鍢?..鐐硅禐杩囩櫨灏卞紑婧愶紒锛堟墜鍔ㄧ嫍澶达級

本文由嘻道妙招独家原创,未经允许,严禁转载