2010-05-27 14 views
9

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

इसलिए यह जरूरी है कि मैं जिस क्रम में जो मोड चलाने के लिए पता करने के लिए में आदेश पंक्ति तर्क पार्स करने में सक्षम हूँ आदि

[संपादित करें]

मैं क्यूटी निर्माता 1.3 का उपयोग कर रहा हूँ डिबगिंग .1 उबंटू कर्मिक पर। तर्क सामान्य तरीके से पारित किए जाते हैं (यानी उन्हें क्यूटी निर्माता आईडीई में 'प्रोजेक्ट' सेटिंग्स के माध्यम से जोड़कर)।

जब मैं ऐप चलाता हूं, ऐसा प्रतीत होता है कि तर्क एप्लिकेशन को पास नहीं किए जा रहे हैं। नीचे दिया गया कोड, मेरे मुख्य() फ़ंक्शन का एक स्निपेट है।

int main(int argc, char *argv[]) 
{ 
    //Q_INIT_RESOURCE(application); 

    try { 
     QApplication the_app(argc, argv); 

     //trying to get the arguments into a list  
     QStringList cmdline_args = QCoreApplication::arguments(); 

     // Code continues ... 
    } 
    catch (const MyCustomException &e) { return 1; } 

    return 0; 
} 

[अपडेट]

मैं इस समस्या की पहचान की है - किसी कारण से, हालांकि argc सही है, argv के तत्वों रिक्त स्ट्रिंग है।

मैंने इस छोटे कोड स्निपेट को argv आइटम्स को मुद्रित करने के लिए रखा - और यह देखने के लिए भयभीत था कि वे सभी खाली थे।

for (int i=0; i< argc; i++){ 
    std::string s(argv[i]); //required so I can see the damn variable in the debugger 
    std::cout << s << std::endl; 
} 

क्या कोई जानता है कि मैं अपने आवेदन में कमांड लाइन तर्क कैसे प्राप्त कर सकता हूं?

+0

आपके पास अपने प्रयास/पकड़ पर अतिरिक्त ब्रेस है। आप हमें उपयोगिता :: option_values ​​के लिए कोड नहीं देते हैं ...क्या आप इस उदाहरण को सरल बनाने के लिए सरल नहीं कर सकते हैं कि cmdline_args.isEmpty() प्रिंट करें "ओह नहीं!"? यदि आप करते हैं, तो क्या आपको अभी भी समस्या आती है? – HostileFork

+0

वैसे भी उपयोगिता :: विकल्प_वृत्त क्या है? मुझे क्यूटी दस्तावेज में ऐसा कुछ भी नहीं दिख रहा है। भले ही आप तर्क पारित न करें, पहला तर्क हमेशा कार्यक्रम का नाम होगा। तो मुझे लगता है कि समस्या उपयोगिता :: option_values ​​में हो सकती है। इसके अलावा आपने argv [0], argv [1] आदि की जांच करने का प्रयास किया है ... इसे भी सही दिशा में इंगित करने के लिए .. – liaK

उत्तर

16

यदि आपका argc और argv अच्छा है, तो मुझे आश्चर्य है कि यह संभव होगा क्योंकि QApplication::arguments() बेहद सरल है। नोट the source code। लिनक्स के लिए #ifdefs को फ़िल्टर करना, यह बस है:

QStringList QCoreApplication::arguments() 
{ 
    QStringList list; 
    if (!self) { 
     qWarning("QCoreApplication::arguments: Please instantiate the QApplication object first"); 
     return list; 
    } 
    const int ac = self->d_func()->argc; 
    char ** const av = self->d_func()->argv; 
    for (int a = 0; a < ac; ++a) { 
     list << QString::fromLocal8Bit(av[a]); 
    } 
    return list; 
} 

यह सब आपको मिला है। एक यूनिकोड चेतावनी है जो मुझे नहीं लगता कि कर्मिक पर लागू होगा:

"यूनिक्स पर, यह सूची मुख्य() फ़ंक्शन में कन्स्ट्रक्टर को पास किए गए argc और argv पैरामीटर से बनाई गई है। Argv में स्ट्रिंग-डेटा QString :: सेLocal8Bit() का उपयोग करके व्याख्या की गई है, इसलिए, उदाहरण के लिए, लैटिन 1 लोकेल में चलने वाली प्रणाली पर जापानी कमांड लाइन तर्कों को पार करना संभव नहीं है। अधिकांश आधुनिक यूनिक्स सिस्टम में यह सीमा नहीं है, क्योंकि वे यूनिकोड- आधारित है। "

आप सीधे अपने तर्क और argv के खिलाफ उस कोड की एक प्रति कोशिश कर सकते हैं और देखें कि क्या होता है।

+1

+1 को आजमाएं। मैं तर्क से सही मूल्य होने के कारण गुमराह था, और इसकी सामग्री की जांच करने के लिए dereference argv को परेशान नहीं किया। मैंने stdout के तर्कों को मुद्रित करने के लिए एक छोटा सा बयान दिया और मैं यह देखने के लिए डर गया कि वहां argv के तत्व खाली तार हैं - यह किस प्रकार की पागलपन है? – morpheous

+1

मैं इसे सही उत्तर के रूप में स्वीकार करूंगा क्योंकि उसने मुझे सही रास्ते पर शुरू किया - साथ ही, मैं मूल प्रश्न को हटा नहीं सकता, क्योंकि मैंने इस जवाब को वोट दिया था। मूल कोड गलत था कि मुझे आवेदन के उदाहरण (कक्षा के बजाए) तर्कों पर कॉल करना चाहिए - मुझे नहीं पता कि मैंने इसे पहले क्यों नहीं देखा (और कोई भी नहीं किया गया)। इसके अलावा प्रलेखन तर्कों में एक स्थैतिक विधि है (और यह staticall कहलाते समय [विचित्र रूप से] संकलित करता है), वास्तव में मुझे इसे एक आवृत्ति विधि के रूप में आमंत्रित करना चाहिए (आंकड़ा जाओ!)। – morpheous

+1

@ मॉर्फीस: QCoreAplication के उदाहरण पर तर्क() को कॉल करने की आवश्यकता नहीं है क्योंकि यह एक स्थिर कार्य है। हालांकि, मुझे qApp-> arguemtns() QCoreAplication :: तर्क() से बेहतर होने के लिए मिलता है। – CMircea

2

यदि आप केवल कंसोल लिख रहे हैं तो आप QApplicition के बजाय QCoreAplication का उपयोग करने पर विचार करना चाहेंगे। क्यूकोर आवेदन QtCore का हिस्सा है जबकि QAplplication QtGui में परिभाषित किया गया है, इसलिए आपको एक अतिरिक्त और अनावश्यक निर्भरता मिलती है।

http://doc.qt.io/qt-5/qcommandlineparser.html

पी.एस.:

2

केवल क्रम अप करने की तारीख रखने के लिए प्रतिक्रिया में, क्यूटी अब एक समर्पित वर्ग कमांड लाइन पार्स करने के लिए प्रदान करता है : केवल इसे प्रतिक्रिया के रूप में पोस्ट कर सकते हैं और टिप्पणी नहीं; मुझे खेद है क्योंकि सवाल वास्तव में नहीं था कि कैसे पार्स करना है लेकिन कैसे पहुंचे।

संबंधित मुद्दे