2010-01-20 10 views
7

1) मैं फ़ोल्डर की निगरानी के लिए फ़ोल्डर का नाम प्राप्त करना चाहता हूं .. क्या कोई तरीका है कि मैं QFileDialog का उपयोग करके विशिष्ट फ़ोल्डर को प्रदर्शित होने से फ़िल्टर कर सकता हूं (उदाहरण के लिए मैं नहीं चाहता कि मेरे दस्तावेज़ होने चाहिए फ़ाइल संवाद में प्रदर्शित) ..qfiledialog - फ़िल्टरिंग फ़ोल्डर्स?

2) मैं नहीं चाहता कि उपयोगकर्ता ड्राइव का चयन करे। इस कोड को ड्राइव भी चुना जा सकता है में डिफ़ॉल्ट .. करके

dirname=QtGui.QFileDialog.getExistingDirectory(self,'Open Directory','c:\\',QtGui.QFileDialog.ShowDirsOnly) 
print(dirname) 

वहाँ एक रास्ता है कि मैं इतना है कि यह चयन नहीं किया जा सकता है ड्राइव या कुछ विशिष्ट फ़ोल्डरों बाहर ग्रे कर सकते हैं या मैं फ़ोल्डर के लिए फिल्टर सेट कर सकते हैं है इसे दिखाने से रोकने के लिए ..

उत्तर

1

आप QDir.Dirs फ़िल्टर का उपयोग करने का प्रयास कर सकते हैं।

dialog = QtGui.QFileDialog(parentWidget) 

dialog.setFilter(QDir.Dirs) 
+0

आपके उत्तर के लिए धन्यवाद। लेकिन यह सभी निर्देशिकाओं को सूचीबद्ध करेगा .. यहां मैं केवल पेट्रीक्युलर निर्देशिकाओं को सूचीबद्ध करना चाहता हूं .. उपर्युक्त कोड भी वही करता है .. मेरा प्रश्न है फ़ाइल एक्सटेंशन फ़िल्टर की तरह निर्देशिकाओं के लिए कोई फ़िल्टर है ?? और एक और सवाल यह है कि जब उपयोगकर्ता पेट्रीकुलर निर्देशिका का चयन करता है तो "qfiledialog में ठीक बटन" अक्षम किया जा सकता है .. – Jeba

8

आप अपनी फ़ाइल संवाद के लिए प्रॉक्सी मॉडल सेट करने का प्रयास कर सकते हैं: QFileDialog::setProxyModel। प्रॉक्सी मॉडल क्लास में filterAcceptsRow विधि ओवरराइड करें और फ़ोल्डरों के लिए झूठी वापसी करें जिन्हें आप दिखाना नहीं चाहते हैं। नीचे एक उदाहरण है कि प्रॉक्सी मॉडल कैसा दिख सकता है; यह C++ नहीं है, अगर मुझे इस कोड को पायथन में परिवर्तित करने में कोई समस्या हो तो मुझे बताएं। यह मॉडल फ़ाइलों को फ़िल्टर और केवल फ़ोल्डरों को दिखाने के लिए माना जाता है:

class FileFilterProxyModel : public QSortFilterProxyModel 
{ 
protected: 
    virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; 
}; 

bool FileFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const 
{ 
    QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent); 
    QFileSystemModel* fileModel = qobject_cast<QFileSystemModel*>(sourceModel()); 

    if (fileModel!=NULL && fileModel->isDir(index0)) 
    { 
     qDebug() << fileModel->fileName(index0); 
     return true; 
    } 
    else 
     return false; 
    // uncomment to execute default implementation 
    //return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); 
} 

यहाँ है मैं इसे कैसे बुला रहा था

QFileDialog dialog; 
FileFilterProxyModel* proxyModel = new FileFilterProxyModel; 
dialog.setProxyModel(proxyModel); 
dialog.setOption(QFileDialog::DontUseNativeDialog); 
dialog.exec(); 

ध्यान दें कि प्रॉक्सी मॉडल गैर देशी फ़ाइल संवाद केवल द्वारा समर्थित है।

1

serge_gubenko आपको सही उत्तर दिया। आपको केवल फ़ोल्डर नामों को जांचना था और उन लोगों के लिए "झूठा" वापस करना था जिन्हें प्रदर्शित नहीं किया जाना चाहिए। उदाहरण के लिए, बाहर फिल्टर करने के लिए "निजी" आप लिखते हैं नामित किसी भी फ़ोल्डर:

bool FileFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const 
{ 
    QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent); 
    QFileSystemModel* fileModel = qobject_cast<QFileSystemModel*>(sourceModel()); 

    if (fileModel!=NULL && fileModel->isDir(index0)) 
    { 
     qDebug() << fileModel->fileName(index0); 
     if (QString::compare(fileModel->fileName(index0), tr("private")) == 0) 
      return false; 

     return true; 
    } 
    else 
     return false; 
    // uncomment to execute default implementation 
    //return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); 
} 

मैं पहले से ही इस परीक्षण किया है और यह पूरी तरह काम करता है। serge_gubenko सभी देय क्रेडिट प्राप्त करना चाहिए।