2011-01-31 12 views
10
MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

कोड के इस भाग में में एक नौसिखिया सवाल है, : के बाद क्याक्यूटी

QMainWindow(parent), 
ui(new Ui::MainWindow) 

मतलब है?

उत्तर

11

यह वास्तव में एक सी ++ प्रश्न है। आप जो देख रहे हैं उसे initialization lists कहा जाता है। QMainWindow(parent) कॉल करता है कि MainWindow के सुपरक्लास (QMainWindow) और ui(new Ui::MainWindow) के लिए निर्माता ui सदस्य बनाता है।

+0

तो यह केवल निर्माण कार्य में उपयोग किया जाता है? या किसी भी तरह के fucntions में इस्तेमाल किया जा सकता है? – Sean

+1

केवल एक निर्माता में। – TonyK

+0

.. लेकिन सभी प्रकार के रचनाकारों में, _copy constructors_ सहित। – MSalters

6

ये दो पंक्तियां तथाकथित प्रारंभिक सूची हैं और इस वर्ग के प्रत्येक उदाहरण के "निर्माण" समय पर निष्पादित की जाती हैं। प्रत्येक वर्ग को विरासत में रखने वाले प्रत्येक वर्ग में इस सूची में सुपरक्लास 'कन्स्ट्रक्टर को कॉल करना चाहिए।

तुम भी लिख सकते हैं:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    ui = new Ui::MainWindow(); 
    ui->setupUi(this); 
} 

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

#define DEFAULT_VALUE 1.0 

class MyClass { 

public: 
    MyClass() : 
     value1(DEFAULT_VALUE), 
     value2(value1) 
    { 
    } 

    MyClass(qreal value) : 
     value1(value), 
     value2(value1) 
    { 
    } 

private: 
    qreal value1; 
    qreal value2; 
}; 

ध्यान दें कि सबसे compilers आप एक चेतावनी है, तो के आदेश दे आपकी प्रारंभिक सूची में सदस्य वर्ग परिभाषा में क्रम से मेल नहीं खाते हैं।

7

अधिक विवरण के वैसे, देख सकते हैं कि वर्ग यूजर इंटरफेस संकलक द्वारा उत्पन्न भी (इस मामले में) MainWindow कहा जाता है, लेकिन यह, नाम स्थान Ui है, इसलिए उसके पूरा नाम Ui::MainWindow है। यह MainWindow वर्ग के समान नहीं है जो QMainWindow से विरासत में मिलता है। हालांकि, QMainWindow -डेड क्लास में एक सदस्य सूचक (जिसे ui कहा जाता है) Ui::MainWindow पर है, जिसे ऊपर वर्णित अनुसार, निर्माता में प्रारंभ किया गया है। यूआईसी-जेनरेट की गई फ़ाइल ui_mainwindow.h पर एक नज़र डालें, यह देखने के लिए कि सभी टुकड़े एक साथ कैसे फिट होते हैं। ध्यान दें कि Ui::MainWindow के सदस्य सभी सार्वजनिक हैं और इसलिए MainWindow के भीतर पूरी तरह से पहुंच योग्य हैं।

एक वैकल्पिक डिजाइन एकाधिक वंशानुक्रम का उपयोग कर दो MainWindow वर्गों की पहचान मर्ज करने के लिए, पाने है अपनी खुद की MainWindowQMainWindow और Ui::MainWindow दोनों से। हालांकि, के वर्तमान संस्करण द्वारा उत्पन्न कोड QtCreator विरासत पैटर्न की बजाय संरचना पैटर्न का पालन करता है।

+0

+1 - यह उत्तर एक अच्छा अनुस्मारक था कि यूआई :: मेनविंडो एमओसी का एक उत्पाद है और वास्तव में मेनविंडोएचएच में घोषित नहीं किया गया है - यह घोषणा है कि ... नेमस्पेस उई { कक्षा मेनविंडो; } ... वास्तव में संकलन को गति देने के लिए एक स्टब क्लास है। – mtbkrdave