2008-10-30 21 views
7

के साथ QSortFilterProxyModel का उपयोग करना मेरे पास QDirModel है जिसका वर्तमान निर्देशिका सेट है। तब मेरे पास QListView है जो उस निर्देशिका में फ़ाइलों को दिखाना है। यह ठीक काम करता है।एक पेड़ मॉडल

अब मैं दिखाए गए फाइलों को सीमित करना चाहता हूं, इसलिए यह केवल पीएनजी फ़ाइलों (फ़ाइल नाम .png के साथ समाप्त होता है) दिखाता है। समस्या यह है कि QSortFilterProxyModel का उपयोग करके और फ़िल्टर regexp सेट करने से फ़ाइलों के हर माता-पिता से मिलान करने का प्रयास किया जाएगा। प्रलेखन के अनुसार:

पदानुक्रमित मॉडल के लिए, फ़िल्टर सभी बच्चों के लिए पुनरावर्ती रूप से लागू होता है। यदि कोई मूल आइटम फ़िल्टर से मेल नहीं खाता है, तो उसके कोई भी बच्चे दिखाएगा।

तो, मैं निर्देशिका में फ़ाइलों को केवल फ़िल्टर करने के लिए QSortFilterProxyModel कैसे प्राप्त करूं, न कि निर्देशिका में यह मौजूद है?

उत्तर

7

हम कुछ ऐसा करते हैं जहां मैं काम करता हूं, और हमारे फ़िल्टरिंग करने के लिए अपना खुद का प्रॉक्सी मॉडल बना देता हूं। हालांकि, आप जो चाहते हैं उसके लिए प्रलेखन को देख रहे हैं (ऐसा लगता है कि यह एक और आम मामला होगा), मैं दो संभावनाओं में आया था।

  1. आप QDirModel पर एक नाम फ़िल्टर सेट करने और इस तरह से फ़िल्टर करने में सक्षम हो सकते हैं। मुझे नहीं पता कि यह आपके जैसा काम करेगा, या यदि नाम फ़िल्टर निर्देशिकाओं पर भी लागू होते हैं। दस्तावेज इन पर तरह का विचित्र है।
  2. QSortFilterProxyModel Subclass और filterAcceptsRow फ़ंक्शन को ओवरराइड करें। प्रलेखन से:

कस्टम छानने व्यवहार filterAcceptsRow() और filterAcceptsColumn() फ़ंक्शन reimplementing द्वारा प्राप्त किया जा सकता है।

फिर आप संभवतः मॉडल इंडेक्स का उपयोग यह जांचने के लिए कर सकते हैं कि इंडेक्स आइटम एक निर्देशिका (स्वचालित रूप से स्वीकार) या फ़ाइल (फ़ाइल नाम पर फ़िल्टर) है या नहीं।

1

qsortfilterproxymodel निकाले जाते हैं और फिर ...

bool YourQSortFilterProxyModel::filterAcceptsRow (int source_row, const QModelIndex & source_parent) const 
{ 
    if (source_parent == qobject_cast<QStandardItemModel*>(sourceModel())->invisibleRootItem()->index()) 
    { 
     // always accept children of rootitem, since we want to filter their children 
     return true; 
    } 

    return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); 
} 
6

मेरे जैसे लोग हैं, जो निम्नलिखित व्यवहार में रुचि रखते हैं के लिए: यदि एक बच्चे को फ़िल्टर से मेल खाता है, तो अपने पूर्वजों छिपी नहीं किया जाना चाहिए:

bool MySortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex & source_parent) const 
{ 
    // custom behaviour : 
    if(filterRegExp().isEmpty()==false) 
    { 
     // get source-model index for current row 
     QModelIndex source_index = sourceModel()->index(source_row, this->filterKeyColumn(), source_parent) ; 
     if(source_index.isValid()) 
     { 
      // if any of children matches the filter, then current index matches the filter as well 
      int i, nb = sourceModel()->rowCount(source_index) ; 
      for(i=0; i<nb; ++i) 
      { 
       if(filterAcceptsRow(i, source_index)) 
       { 
        return true ; 
       } 
      } 
      // check current index itself : 
      QString key = sourceModel()->data(source_index, filterRole()).toString(); 
      return key.contains(filterRegExp()) ; 
     } 
    } 
    // parent call for initial behaviour 
    return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent) ; 
} 
संबंधित मुद्दे