// API callback
related_results_labels_thumbs({"version":"1.0","encoding":"UTF-8","feed":{"xmlns":"http://www.w3.org/2005/Atom","xmlns$openSearch":"http://a9.com/-/spec/opensearchrss/1.0/","xmlns$blogger":"http://schemas.google.com/blogger/2008","xmlns$georss":"http://www.georss.org/georss","xmlns$gd":"http://schemas.google.com/g/2005","xmlns$thr":"http://purl.org/syndication/thread/1.0","id":{"$t":"tag:blogger.com,1999:blog-7905389674158671872"},"updated":{"$t":"2025-09-18T07:02:56.138+08:00"},"category":[{"term":"Programming"},{"term":"Culture"},{"term":"Testing"},{"term":"scrum"},{"term":"Agile"},{"term":"performance tuning"},{"term":"Book"},{"term":"Code Quality"},{"term":"Qt"},{"term":"Event Storming"},{"term":"database"},{"term":"file system"},{"term":"virtual machine"}],"title":{"type":"text","$t":"VIVOTEK Digest"},"subtitle":{"type":"html","$t":"Journey of Software Development"},"link":[{"rel":"http://schemas.google.com/g/2005#feed","type":"application/atom+xml","href":"https:\/\/blog.rd.vivotek.com\/feeds\/posts\/default"},{"rel":"self","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/-\/Qt?alt=json-in-script\u0026max-results=8"},{"rel":"alternate","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/search\/label\/Qt"},{"rel":"hub","href":"http://pubsubhubbub.appspot.com/"}],"author":[{"name":{"$t":"diro"},"uri":{"$t":"http:\/\/www.blogger.com\/profile\/13292247339970268280"},"email":{"$t":"noreply@blogger.com"},"gd$image":{"rel":"http://schemas.google.com/g/2005#thumbnail","width":"16","height":"16","src":"https:\/\/img1.blogblog.com\/img\/b16-rounded.gif"}}],"generator":{"version":"7.00","uri":"http://www.blogger.com","$t":"Blogger"},"openSearch$totalResults":{"$t":"2"},"openSearch$startIndex":{"$t":"1"},"openSearch$itemsPerPage":{"$t":"8"},"entry":[{"id":{"$t":"tag:blogger.com,1999:blog-7905389674158671872.post-411755838046896127"},"published":{"$t":"2019-04-22T09:36:00.000+08:00"},"updated":{"$t":"2019-04-25T17:28:13.954+08:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"performance tuning"},{"scheme":"http://www.blogger.com/atom/ns#","term":"Qt"}],"title":{"type":"text","$t":"如何提升 QAbstractItemModel::match 的效能"},"content":{"type":"html","$t":"\u003Cscript src=\"https:\/\/cdn.jsdelivr.net\/gh\/google\/code-prettify@master\/loader\/run_prettify.js?lang=css\u0026amp;skin=Desert\"\u003E\u003C\/script\u003E\u003Cbr \/\u003E\n\u003Cdiv class=\"separator\" style=\"clear: both; text-align: center;\"\u003E\n\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgU0XRXe7fW8biqt1P1qRx2TjA_TuviJOVuhgiJD7ak6vIov3U8scBoc4bylzAlMx_X0aifDLSkWc-H_L7zlH_3jrg0FLK0obQIc1x9JhRHqYUznnENlUstybSnrQgNK8W0Cz6j_5XecNyB\/s1600\/computer-3293875_1920.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"\u003E\u003Cimg border=\"0\" data-original-height=\"1066\" data-original-width=\"1600\" height=\"266\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgU0XRXe7fW8biqt1P1qRx2TjA_TuviJOVuhgiJD7ak6vIov3U8scBoc4bylzAlMx_X0aifDLSkWc-H_L7zlH_3jrg0FLK0obQIc1x9JhRHqYUznnENlUstybSnrQgNK8W0Cz6j_5XecNyB\/s400\/computer-3293875_1920.jpg\" width=\"400\" \/\u003E\u003C\/a\u003E\u003C\/div\u003E\n\u003Ch2\u003E\n\u003Cspan style=\"color: red;\"\u003E\u003Cspan style=\"font-size: small;\"\u003E\u003Cbr \/\u003E\u003C\/span\u003E\u003C\/span\u003E\u003C\/h2\u003E\n\u003Cblockquote class=\"tr_bq\"\u003E\n\u003Cspan style=\"color: red;\"\u003E\u003Cspan style=\"font-size: small;\"\u003E針對常用的match role, 可利用QHash (or QMap) 多存一份, 來加快 search 效率\u003C\/span\u003E\u003C\/span\u003E\u003C\/blockquote\u003E\n我們在設計model通常都會定義一個存unique string value的IdRole當作model item的索引, 且會很頻繁對這個role作match, 從\"\u003Ca class=\"confluence-link\" data-base-url=\"https:\/\/confluence.vivotek.com\" data-linked-resource-default-alias=\"flags對QAbstractItemModel::match的效能影響\" data-linked-resource-id=\"225149110\" data-linked-resource-type=\"page\" data-linked-resource-version=\"6\" href=\"https:\/\/vvtk-digest.blogspot.com\/2019\/04\/flagsqabstractitemmodelmatch.html\"\u003Eflags對QAbstractItemModel::match的效能影響\u003C\/a\u003E\"中的實驗中可知,\u003Cbr \/\u003E\n針對string value去作match在效率上是很糟的, 所以只要model數量大到一個程度, 就會很容易使UI thread hang住. 針對這部分的參考解法大致如下,\u003Cbr \/\u003E\n\u003Col\u003E\n\u003Cli\u003Emaintain一個QHash把每個model item的IdRole value跟相對應的model index存起來\u003C\/li\u003E\n\u003Cli\u003E複寫match, 如果是是要查IdRole, 就直接從QHash找以提升效率\u003C\/li\u003E\n\u003Cli\u003E\u003Cspan style=\"color: red;\"\u003E由於QStandardItemModel::clear本身不會觸發rowsAboutToBeRemoved, 所以即使呼叫clear, 還是要主動去清掉hash\u003C\/span\u003E\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Ccode class=\"prettyprint\"\u003E#include \u0026lt;QHash\u0026gt;\u003Cbr \/\u003E\n#include \u0026lt;QModelIndex\u0026gt;\u003Cbr \/\u003E\n#include \u0026lt;QPersistentModelIndex\u0026gt;\u003Cbr \/\u003E\n#include \u0026lt;QStandardItemModel\u0026gt;\u003Cbr \/\u003E\n#include \u0026lt;QVariant\u0026gt;\u003Cbr \/\u003E\n\u003Cbr \/\u003E\nclass MyListModel : public QStandardItemModel\u003Cbr \/\u003E\n{\u003Cbr \/\u003E\n\u0026nbsp; Q_OBJECT\u003Cbr \/\u003E\n\u003Cbr \/\u003E\npublic:\u003Cbr \/\u003E\n\u0026nbsp; enum Roles\u003Cbr \/\u003E\n\u0026nbsp; {\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; IdRole = Qt::UserRole + 1,\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; DataRole\u003Cbr \/\u003E\n\u0026nbsp; };\u003Cbr \/\u003E\n\u0026nbsp; MyListModel(QObject *parent = nullptr)\u003Cbr \/\u003E\n\u0026nbsp; {\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \/\/ 把每個model item的IdRole value存到QHash裡, key是id, value就是model index (必須用QPersistentModelIndex)\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \/\/ 如果是tree model記得要recursive把childrn也加進來, \u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \/\/ 主要是如果使用者是先把model item的children都append好, 再append本身進來的話, 只會觸發一次rowsInserted.\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; QObject::connect(this, \u0026amp;QAbstractItemModel::rowsInserted, [=](const QModelIndex \u0026amp;parent, int start, int end) {\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; for (int row = start; row \u0026lt;= end; row++)\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; {\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; auto mdIndex = index(row, 0, parent);\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; auto id = data(mdIndex, MyListModel::IdRole);\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; m_idModelIndexHash.insert(id, QPersistentModelIndex(mdIndex));\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; }\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; });\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; QObject::connect(this, \u0026amp;QAbstractItemModel::rowsAboutToBeRemoved, this, [=](const QModelIndex \u0026amp;parent, int start, int end) {\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; for (int row = start; row \u0026lt;= end; row++)\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; {\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp; auto mdIndex = index(row, 0, parent);\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp;\u0026nbsp;auto id = data(mdIndex, MyListModel::IdRole);\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp;\u0026nbsp;m_idModelIndexHash.remove(id);\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; }\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; });\u003Cbr \/\u003E\n\u0026nbsp; }\u003Cbr \/\u003E\n\u0026nbsp; virtual ~MyListModel() = default;\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n\u0026nbsp; \/\/ 覆寫match function, 如果針對IdRole就去QHash以提升效率\u003Cbr \/\u003E\n\u0026nbsp; virtual QModelIndexList match(const QModelIndex \u0026amp;start, int role, const QVariant \u0026amp;value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags(Qt::MatchStartsWith | Qt::MatchWrap)) const override\u003Cbr \/\u003E\n\u0026nbsp; {\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; if (role != MyListModel::IdRole)\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; {\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; return QStandardItemModel::match(start, role, value, hits, flags);\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; }\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \/\/ todo, !m_idModelIndexHash.contains just return empty can enhance performance, but m_idModelIndexHash must be 100% correct\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; if (!m_idModelIndexHash.contains(value))\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; {\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; \u0026nbsp; return QModelIndexList();\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; }\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; return QModelIndexList() \u0026lt;\u0026lt; m_idModelIndexHash.value(value);\u003Cbr \/\u003E\n\u0026nbsp; }\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n\u0026nbsp; \/\/ 由於QStandardItemModel::clear本身不會觸發rowsAboutToBeRemoved, 所以clear記得要主動清掉hash\u003Cbr \/\u003E\n\u0026nbsp; void clearIdHash()\u003Cbr \/\u003E\n\u0026nbsp; {\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; m_idModelIndexMap.clear();\u003Cbr \/\u003E\n\u0026nbsp; }\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n\u0026nbsp; QHash\u0026lt;int, QByteArray\u0026gt; roleNames() const override\u003Cbr \/\u003E\n\u0026nbsp; {\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp; QHash\u0026lt;int, QByteArray\u0026gt; hash;\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp;\u0026nbsp;hash[MyListModel::DataRole] = \"dataRole\";\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp;\u0026nbsp;hash[MyListModel::IdRole] = \"idRole\";\u003Cbr \/\u003E\n\u0026nbsp; \u0026nbsp;\u0026nbsp;return hash;\u003Cbr \/\u003E\n\u0026nbsp; }\u003Cbr \/\u003E\n\u003Cbr \/\u003E\nprotected:\u003Cbr \/\u003E\n\u0026nbsp; QHash\u0026lt;QVariant, QPersistentModelIndex\u0026gt; m_idModelIndexHash;\u003Cbr \/\u003E\n};\u003C\/code\u003E\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n延續\"\u003Ca class=\"confluence-link\" data-base-url=\"https:\/\/confluence.vivotek.com\" data-linked-resource-default-alias=\"flags對QAbstractItemModel::match的效能影響\" data-linked-resource-id=\"225149110\" data-linked-resource-type=\"page\" data-linked-resource-version=\"6\" href=\"https:\/\/vvtk-digest.blogspot.com\/2019\/04\/flagsqabstractitemmodelmatch.html\"\u003Eflags對QAbstractItemModel::match的效能影響\u003C\/a\u003E\"中的實驗方法,\u003Cbr \/\u003E\n如果利用QHash得到的結果如下,\u003Cbr \/\u003E\n\u003Ctable class=\"wrapped confluenceTable\"\u003E\u003Ccolgroup\u003E\u003Ccol\u003E\u003C\/col\u003E\u003Ccol\u003E\u003C\/col\u003E\u003C\/colgroup\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Cth class=\"confluenceTh\"\u003Ematch from\u003C\/th\u003E\u003Cth class=\"confluenceTh\"\u003Eelapsed (ms)\u003C\/th\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"confluenceTd\"\u003EQStandardItemModel::match\u003C\/td\u003E\u003Ctd class=\"confluenceTd\"\u003E55194\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"confluenceTd\" colspan=\"1\"\u003EQHash\u003C\/td\u003E\u003Ctd class=\"confluenceTd\" colspan=\"1\"\u003E63\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n由此可見效率是大大大大提升的,\u0026nbsp;\u003Cstrong style=\"color: red;\"\u003E缺點就是你要好好管理m_idModelIndexHash,\u0026nbsp;\u003C\/strong\u003E一有差錯都會導致model行為不正確."},"link":[{"rel":"replies","type":"application/atom+xml","href":"https:\/\/blog.rd.vivotek.com\/feeds\/411755838046896127\/comments\/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2019\/04\/match-role-qhash-or-qmap-search.html#comment-form","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/411755838046896127"},{"rel":"self","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/411755838046896127"},{"rel":"alternate","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2019\/04\/match-role-qhash-or-qmap-search.html","title":"如何提升 QAbstractItemModel::match 的效能"}],"author":[{"name":{"$t":"Sam"},"uri":{"$t":"http:\/\/www.blogger.com\/profile\/08875986043772937726"},"email":{"$t":"noreply@blogger.com"},"gd$image":{"rel":"http://schemas.google.com/g/2005#thumbnail","width":"32","height":"32","src":"\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEh6b6igC9c9GOkfMpoXNsMMdlVBd65oi90a2wApPWHh6MuHRhFcaxWl4zV99lcqjw0_ZcPFF1sPcqVuhMeylZOg4cKjjVpMmo4ZXjYzzfMx_TH5yxI5CpMXsi-3vDlXOQ\/s220\/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG"}}],"media$thumbnail":{"xmlns$media":"http://search.yahoo.com/mrss/","url":"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgU0XRXe7fW8biqt1P1qRx2TjA_TuviJOVuhgiJD7ak6vIov3U8scBoc4bylzAlMx_X0aifDLSkWc-H_L7zlH_3jrg0FLK0obQIc1x9JhRHqYUznnENlUstybSnrQgNK8W0Cz6j_5XecNyB\/s72-c\/computer-3293875_1920.jpg","height":"72","width":"72"},"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-7905389674158671872.post-1986176200472376831"},"published":{"$t":"2019-04-22T09:18:00.000+08:00"},"updated":{"$t":"2019-04-25T17:28:05.889+08:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"performance tuning"},{"scheme":"http://www.blogger.com/atom/ns#","term":"Qt"}],"title":{"type":"text","$t":"flags 對 QAbstractItemModel::match 的效能影響"},"content":{"type":"html","$t":"\u003Cscript src=\"https:\/\/cdn.jsdelivr.net\/gh\/google\/code-prettify@master\/loader\/run_prettify.js?lang=css\u0026amp;skin=Desert\"\u003E\u003C\/script\u003E\u003Cbr \/\u003E\n\u003Cdiv class=\"separator\" style=\"clear: both; text-align: center;\"\u003E\n\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjwUXAiG3PrFGgJrpoAGe7BqTS9kSu6q_V2QIcuwCxhw5VYhN5SM8wGUYAAcU1Emutg5dLIV8Pjrj1mnQU9AJjt-OVKUMljDK4fd3O4mzDCC7xBP4nqtSOD5JDJxmBrQ0-Z_uisLMx7EOAR\/s1600\/joan-of-arc-206939_1920.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"\u003E\u003Cimg border=\"0\" data-original-height=\"1197\" data-original-width=\"1600\" height=\"298\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjwUXAiG3PrFGgJrpoAGe7BqTS9kSu6q_V2QIcuwCxhw5VYhN5SM8wGUYAAcU1Emutg5dLIV8Pjrj1mnQU9AJjt-OVKUMljDK4fd3O4mzDCC7xBP4nqtSOD5JDJxmBrQ0-Z_uisLMx7EOAR\/s400\/joan-of-arc-206939_1920.jpg\" width=\"400\" \/\u003E\u003C\/a\u003E\u003C\/div\u003E\n\u003Ch2\u003E\n\u003Cspan style=\"color: red;\"\u003E\u003Cspan style=\"font-size: small;\"\u003E\u003Cbr \/\u003E\u003C\/span\u003E\u003C\/span\u003E\u003C\/h2\u003E\n\u003Cblockquote class=\"tr_bq\"\u003E\n\u003Cspan style=\"color: red;\"\u003E\u003Cspan style=\"font-size: small;\"\u003E秘訣: flags 只要用 Qt::MatchExactly 即可, 如果是 tree model 則再加上Qt::MatchRecursive\u003C\/span\u003E\u003C\/span\u003E\u003C\/blockquote\u003E\n\u003Cbr \/\u003E\n\u003Ccode class=\"prettyprint\"\u003E\nQModelIndexList QAbstractItemModel::match(const QModelIndex \u0026amp;start, int role, const QVariant \u0026amp;value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) const\u003Cbr \/\u003E\n\u003C\/code\u003E\u003Cbr \/\u003E\n\u003Cbr \/\u003E\nQAbstractItemModel::match中 flags 參數其實是蠻巨大的.\u003Cbr \/\u003E\n一般我們在輸入這個 flags 通常都是 copy \/ paste 舊有的 code , 所以最常看到的組合就是\"\u003Cspan style=\"color: #339966;\"\u003E\u003Cstrong\u003EQt::MatchFixedString | Qt::MatchCaseSensitive | Qt::MatchRecursive\u003C\/strong\u003E\u003C\/span\u003E\"如以下所示,\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n\u003Ccode class=\"prettyprint\"\u003E\u003Cbr \/\u003E\nmodel.match(model.index(0,0), IDRole, value, 1, Qt::MatchFixedString | Qt::MatchCaseSensitive | Qt::MatchRecursive);\u003Cbr \/\u003E\n\u003C\/code\u003E\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n\u003Cdiv class=\"auto-cursor-target\"\u003E\n這用法如果遇到value(QVariant)原本的型別是非字串, 例如int, 會導致所有比對都會先轉型成字串再作字串比對,\u003C\/div\u003E\n這是很沒有效率的, 例如對100000筆資料的\u003Cspan style=\"color: #339966;\"\u003E\u003Cstrong\u003Elist model\u003C\/strong\u003E\u003C\/span\u003E中針對int value作match得到以下的結果,\u003Cbr \/\u003E\n\u003Ctable class=\"wrapped confluenceTable\"\u003E\u003Ccolgroup\u003E\u003Ccol\u003E\u003C\/col\u003E\u003Ccol\u003E\u003C\/col\u003E\u003C\/colgroup\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Cth class=\"confluenceTh\"\u003Ematch for int value flags\u003C\/th\u003E\u003Cth class=\"confluenceTh\"\u003Eelapsed (ms)\u003C\/th\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"confluenceTd\" colspan=\"1\"\u003EQt::MatchFixedString | Qt::MatchCaseSensitive | Qt::MatchRecursive\u003C\/td\u003E\u003Ctd class=\"confluenceTd\" colspan=\"1\"\u003E125593\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"confluenceTd\"\u003EQt::MatchFixedString | Qt::MatchCaseSensitive\u003C\/td\u003E\u003Ctd class=\"confluenceTd\"\u003E120216\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"confluenceTd\"\u003EQt::\u003Cspan style=\"color: #404244;\"\u003EMatchExactly\u003C\/span\u003E\u003C\/td\u003E\u003Ctd class=\"confluenceTd\"\u003E22162\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n由此可見型別搞錯會造成的影響有多嚴重,\u003Cbr \/\u003E\n還有一點就是如果是list model的話, 就不必要下Qt::MatchRecursive, 這樣又可增進一點效能.\u003Cbr \/\u003E\n另外對string value作match得到的結果如下,\u003Cbr \/\u003E\n\u003Ctable class=\"wrapped confluenceTable\"\u003E\u003Ccolgroup\u003E\u003Ccol\u003E\u003C\/col\u003E\u003Ccol\u003E\u003C\/col\u003E\u003C\/colgroup\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Cth class=\"confluenceTh\"\u003Ematch for string value flags\u003C\/th\u003E\u003Cth class=\"confluenceTh\"\u003Eelapsed (ms)\u003C\/th\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"confluenceTd\"\u003EQt::MatchFixedString | Qt::MatchCaseSensitive\u003C\/td\u003E\u003Ctd class=\"confluenceTd\"\u003E56188\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"confluenceTd\"\u003EQt::\u003Cspan style=\"color: #404244;\"\u003EMatchExactly\u003C\/span\u003E\u003C\/td\u003E\u003Ctd class=\"confluenceTd\"\u003E55194\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n於此可見, 如果match要compare的value是要完全一致的, 其實只要使用Qt::\u003Cspan style=\"color: #404244;\"\u003EMatchExactly就萬無一失了.\u003C\/span\u003E"},"link":[{"rel":"replies","type":"application/atom+xml","href":"https:\/\/blog.rd.vivotek.com\/feeds\/1986176200472376831\/comments\/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2019\/04\/flagsqabstractitemmodelmatch.html#comment-form","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/1986176200472376831"},{"rel":"self","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/1986176200472376831"},{"rel":"alternate","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2019\/04\/flagsqabstractitemmodelmatch.html","title":"flags 對 QAbstractItemModel::match 的效能影響"}],"author":[{"name":{"$t":"Sam"},"uri":{"$t":"http:\/\/www.blogger.com\/profile\/08875986043772937726"},"email":{"$t":"noreply@blogger.com"},"gd$image":{"rel":"http://schemas.google.com/g/2005#thumbnail","width":"32","height":"32","src":"\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEh6b6igC9c9GOkfMpoXNsMMdlVBd65oi90a2wApPWHh6MuHRhFcaxWl4zV99lcqjw0_ZcPFF1sPcqVuhMeylZOg4cKjjVpMmo4ZXjYzzfMx_TH5yxI5CpMXsi-3vDlXOQ\/s220\/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG"}}],"media$thumbnail":{"xmlns$media":"http://search.yahoo.com/mrss/","url":"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjwUXAiG3PrFGgJrpoAGe7BqTS9kSu6q_V2QIcuwCxhw5VYhN5SM8wGUYAAcU1Emutg5dLIV8Pjrj1mnQU9AJjt-OVKUMljDK4fd3O4mzDCC7xBP4nqtSOD5JDJxmBrQ0-Z_uisLMx7EOAR\/s72-c\/joan-of-arc-206939_1920.jpg","height":"72","width":"72"},"thr$total":{"$t":"0"}}]}});