2012-03-14 8 views
6

अतिरिक्त ड्रॉप डाउन करने के लिए मैं अपनी कंपनी के लिए एक पाठक तालिका बनाने के लिए क्यूटी का उपयोग कर एक छात्र प्रोग्रामर हूं। यह पाठक एक संपादक और कनवर्टर दोनों है। यह एक .i फ़ाइल में पढ़ता है एक पाठ दस्तावेज़ के तालिका संपादन की अनुमति देता है और फिर एक .scf फ़ाइल डालता है जो अनिवार्य रूप से एक अलग मूल्य फ़ाइल है जो हेडर के साथ बनाई गई किंवदंती के नीचे है। मैं digress ... मूल रूप से आयातित फ़ाइल प्रारूप वास्तव में स्कैन और पढ़ने के लिए मुश्किल है (ज्यादातर असंभव) तो मैं खुली फ़ाइल preBuilt QFileDialog को संशोधित करना चाहता हूं ताकि अतिरिक्त ड्रॉप प्रकार को घोषित किया जा सके जब पुरानी फ़ाइल प्रकार घोषित करने के लिए चुने जाते हैं उनके टेम्पलेट हेडर।QFileDialog संशोधित करना :: getOpenFileName

जब उपयोगकर्ता .i एक्सटेंशन फ़ाइलों (विकल्प 2 फ़ाइल प्रकार) का चयन करता है, तो मैं उपयोगकर्ता को यह चुनने के लिए अतिरिक्त ड्रॉप डाउन मेनू सक्षम करना चाहता हूं कि यह किस प्रकार की .i फ़ाइल है (टेम्पलेट चयनित)। इस तरह मुझे भगवान से निपटने की ज़रूरत नहीं है जानता है कि प्रत्येक शीर्षलेख को प्रत्येक अलग-अलग प्रकार के लिए तालिका में अनुक्रमणित करने का तरीका जानने का कितना घंटे लगता है।

QString fileLocation = QFileDialog::getOpenFileName(this,("Open File"), "", ("Simulation Configuration File(*.scf);;Input Files(*.prp *.sze *.i *.I *.tab *.inp *.tbl)")); //launches File Selector 

मैं QFileDialog Documentation संदर्भित किया गया है कोशिश करते हैं और मैं क्या जरूरत है, लेकिन कोई लाभ नहीं हुआ पड़ा है करने के लिए एक समाधान खोजने के लिए: वर्तमान में मेरी importFile समारोह संवाद इस का उपयोग करते हुए कहता है। मेरी पोस्ट पढ़ने के लिए धन्यवाद और किसी भी दिशा के लिए अग्रिम धन्यवाद, जो आप इस पर दे सकते हैं।

अद्यतन मार्च 16 2012; सबसे पहले मैं इस मामले में अपने शुरुआती समर्थन के लिए मास्सी को धन्यवाद देना चाहता हूं। नीचे कनेक्ट स्टेटमेंट है जो मुझे प्राप्त त्रुटि के साथ है।

//Declared data type 
    QFileDialog openFile; 
    QComboBox comboBoxTemplateSelector; 
    connect(openFile, SIGNAL(currentChanged(const &QString)), this, SLOT(checkTemplateSelected())); 
    openFile.layout()->addWidget(comboBoxTemplateSelector); 

compile errors

मैंने यह भी देखा है कि यह जिस तरह से मैं संशोधित संवाद के लेआउट को QComboBox जोड़ा (जो दूसरी त्रुटि है) पसंद नहीं आया। मुझे सच में उम्मीद है कि मैं बस कुछ गूंगा कर रहा हूं और इसे दूर करने का एक आसान काम है।

tmpearce की टिप्पणी के जवाब में मेरा हेडर कोड है;

#include <QWidget> 
namespace Ui { 
class ReaderTable; 
} 
class ReaderTable : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit ReaderTable(QWidget *parent = 0); 
    ~ReaderTable(); 
public slots: 
    void checkTemplateSelected(); 
    void importFile(); 
    void saveFile(); 
private: 
    Ui::ReaderTable *ui; 
}; 

इस चुनौती में किसी भी योगदान के लिए अग्रिम पढ़ने और धन्यवाद के लिए धन्यवाद!

+1

क्या कोई कारण है कि आप केवल 'QString' लौटा नहीं सकते हैं, और यदि आवश्यक हो तो ड्रॉप-डाउन मेनू के साथ दूसरा संवाद पॉप अप करें? यह अतिरिक्त कार्यक्षमता रखने के लिए QFileDialog को संशोधित करने की कोशिश करने से अधिक (संभवतः) अधिक सरल होगा। – tmpearce

+0

मैं पूरी तरह से सहमत हूं; मुझे यह भी लगता है कि यह हमारे ग्राहकों के लिए अधिक मार्गदर्शक होगा क्योंकि वे फ़ाइल प्रकारों को जांचने की सोच नहीं सकते हैं जिन्हें प्रदर्शित करने की अनुमति है। हालांकि, मुझे लगता है कि मेरी कंपनी पुरानी फ़ाइल प्रकारों को वास्तव में जितनी जल्दी हो सके विलुप्त होने के लिए थोड़ा मुश्किल बनाना चाहती है। सभी राय एक तरफ; हमारे पास इन फ़ाइलों के साथ कभी मानक नहीं था (यही कारण है कि चयनित टेम्पलेट्स इतने जरूरी हैं) और यह नया एक्सटेंशन उस पर एक प्रयास है। –

+1

अच्छा, अगर आप फ़ाइल संवाद खोलते समय इसे करना चाहते हैं, तो 'QFileDialog :: फ़ाइल चयनित' सिग्नल पर एक नज़र डालें। इसके लिए आपको स्थिर फ़ंक्शन 'getOpenFileName' का उपयोग न करने की आवश्यकता होगी - इसके बजाय, एक संवाद स्वयं बनाएं और इस सिग्नल को एक स्लॉट से कनेक्ट करें जिससे आप ड्रॉप-डाउन मेनू के साथ कस्टम संवाद पॉप अप कर सकते हैं (यदि वह फ़ाइल प्रकार चुना गया था) और प्रत्येक बार एक आइटम क्लिक होने पर यह होगा। – tmpearce

उत्तर

6

एक QFileDialog इंस्टेंस करें (getOpenFileName स्थिर विधि को कॉल न करें), इसके लेआउट तक पहुंचें और इसमें एक अक्षम QComboBox जोड़ें। संवाद कार्यकारी(), आपके द्वारा चयनित फ़ाइल को पुनः प्राप्त और वर्तमान चयन cb_ सकता से लौट रहे

void MyClass::checkFilter(const QString& filter) 
{ 
    cb_->setEnabled(filter == "what_you_want"); 
} 

:

// mydialog_ and cb_ could be private fields inside MyClass 
mydialog_ = new QFileDialog; 
cb_ = new QComboBox; 
cb_->setEnabled(false); 
connect(mydialog, SIGNAL(currentChanged(const QString&)), this, SLOT(checkFilter(const QString&))); 
mydialog_->layout()->addWidget(cb_); 

if (mydialog_->exec() == QDialog::Accepted) { 
    QString selectedFile = mydialog_->selectedFiles()[0]; 
    QString cbSelection = cb_->currentText(); 
} 

स्लॉट की तरह कुछ होगा। नोटिस आप गुई सौंदर्य प्रसाधनों की देखभाल करते हुए, संवाद के निचले हिस्से में एक साधारण QComboBox से कुछ अधिक जटिल जोड़ सकते हैं।

दरअसल मुझे इस दृष्टिकोण को बहुत पसंद नहीं है (लेकिन यही वह था जिसे आपने पूछा :-)।मैं इस तरह एक सरल संवाद बनाना होगा:

enter image description here

और केवल यदि चयनित फ़ाइल अपने मानदंडों को पूरा करती कॉम्बो सक्षम करें। "ब्राउज" बटन QFileDialog में GetOpenFileMethod स्थैतिक विधि को कॉल कर सकता है।

+0

मुझे यह समाधान पसंद है, चाहे यह काम करता है, भले ही यह काम करता है लेआउट एक आकर्षक तरीके से अतिरिक्त combobox (या पूर्ण विजेट) को संभालता है, और यह कैसे लागू करने के लिए कि उपयोगकर्ता वास्तव में एक का चयन करें विकल्पों में से। यही कारण है कि मैंने उपclassing का सुझाव दिया, लेकिन यह शायद काम करने के लिए किया जा सकता है। – tmpearce

+0

@tmpearce सहमत हैं। मैंने इसे पीईक्यूटी के साथ एक सरल QLabel के साथ संवाद में शामिल किया, मुझे लगता है कि चीजों को संरेखित करने के लिए कुछ काम की आवश्यकता होगी, और किसी भी मामले में "रद्द करें" और "ओपन" बटन जोड़े गए विजेट के ऊपर बने रहेंगे। – Masci

+0

मुझे कनेक्ट स्टेटमेंट में समस्याएं आ रही हैं; मैं अवधारणा को समझता हूं लेकिन मुझे यकीन नहीं है कि मैं सही चीजों पर फोन कर रहा हूं। एक और उत्सुक घटना यह है कि सिग्नल फील्ड किसी भी प्रकार की इंटेलिजेंस नहीं बनाता है जो मुझे आश्चर्य करता है कि सिग्नल कैसे पास किए जाते हैं। मैंने कोशिश की: कनेक्ट (ओपनफाइल, सिग्नल (ओपनफाइल.फिल्टर चयन ("इनपुट फ़ाइलें (*। Prp * .sze * .i * I. * .tab * .inp * .tbl)")), यह, एसएलओटी (checkTemplateSelected())); और कनेक्ट (ओपनफाइल, सिग्नल (वर्तमान चेंज (कॉन्स और क्यूस्ट्रिंग)), यह, एसएलओटी (चेकटेम्प्लेट चयन()); यहां कोई सलाह है? –

0

आप इस संकेत से आइटम चयन संभाल कर सकते हैं:
void QFileDialog::fileSelected (const QString & file)
तो यह होती है, तो फोन प्रकार आप चाहते हैं के साथ setFilter
क्षमा करें, अगर मुझे आपका काम समझ में नहीं आता है।