2017-05-04 24 views
5

JUCE में दृश्य WYSISWYG संपादक के साथ सिंगल-पेज एप्लिकेशन बनाने से आ रहा है, मुझे नई विंडो (मुख्य जीयूआई विंडो के बाहर) को कैसे खोलना है, इस बारे में कुछ परेशानी हो रही है। मैंने एक टेस्ट एप्लिकेशन बनाया है जिसमें दृश्य संपादक के साथ बनाया गया एक छोटा न्यूनतम मुख्य जीयूआई है। इसमें एक बटन है "नई विंडो बनाएं।" मेरा लक्ष्य उस बटन पर क्लिक करने में सक्षम होना है और एक नई विंडो पॉप अप है और यह नई विंडो एक JUCE "GUI घटक" है (AKA, ग्राफिकल/विज़ुअल जीयूआई संपादक फ़ाइल)। अब, मेरे पास वास्तव में की तरह है, हालांकि, इसकी फेंकने वाली त्रुटियों और दावों को हासिल किया गया है, इसलिए एक बहुत ही सरल, चरण-दर-चरण ट्यूटोरियल प्राप्त करना बहुत अच्छा होगा।JUCE - एक नई विंडो बनाना

मैंने main.cpp फ़ाइल का अध्ययन किया है जो Projucer स्वचालित रूप से बनाया गया है ताकि यह महसूस हो सके कि वे विंडो कैसे बना रहे हैं। मैंने जो किया है वह यहाँ है।

1) मेरी परियोजना में, मैंने एक नया जीयूआई घटक जोड़ा (जो एक वर्ग बन गया) और इसे "InvokedWindow" कहा जाता है। 2) मेरे मुख्य जीयूआई घटक वर्ग शीर्षलेख में, मैंने InvokedWindow: ScopedPointer<InvokedWindow> invokedWindow; 3 के एक नए स्कोप्ड पॉइंटर को जोड़ा है 3) मैंने "मेक न्यू विंडो" नामक मुख्य जीयूआई संपादक में एक नया बटन बनाया और इसे हैंडलर कोड में जोड़ा: newWindowPtr = new InvokedWindow; ताकि जब भी बटन मारा जाता है, तो InvokedWindow प्रकार का एक नया ऑब्जेक्ट बनाया जाता है। 4) InvokedWindow कक्षा में, निर्माता में स्वत: उत्पन्न कोड के शीर्ष पर, मैं कहा:

setUsingNativeTitleBar (true); 
setCentrePosition(400, 400); 
setVisible (true); 
setResizable(false, false); 

कौन सा मैं इन सबसे छुटकारा Juce अनुप्रयोग का मुख्य फ़ाइल से मिला है।

मैंने कार्यक्षमता जोड़ने के लिए इस नई विंडो में एक स्लाइडर भी जोड़ा।

5) मैं मुझे विंडो को बंद करने देने के लिए एक ओवरलोड समारोह कहा:

void InvokedWindow::closeButtonPressed() 
{ 
    delete this; 
} 

तो, अब जब मैं अनुप्रयोग चलाने और नई विंडो बटन पर क्लिक करें, एक नई विंडो पॉप अप करता है, लेकिन मैं एक अभिकथन मिलती है:

/* Agh! You shouldn't add components directly to a ResizableWindow - this class 
    manages its child components automatically, and if you add your own it'll cause 
    trouble. Instead, use setContentComponent() to give it a component which 
    will be automatically resized and kept in the right place - then you can add 
    subcomponents to the content comp. See the notes for the ResizableWindow class 
    for more info. 

    If you really know what you're doing and want to avoid this assertion, just call 
    Component::addAndMakeVisible directly. 
*/ 

इसके अलावा, मैं एक बार विंडो बंद करें और एक नई विंडो का एक और उदाहरण बनाने के लिए मुख्य GUI में बटन हिट करने में सक्षम हूँ, लेकिन यह दूसरी बार बंद करने में कोई त्रुटि की ओर जाता है:

template <typename ObjectType> 
struct ContainerDeletePolicy 
{ 
    static void destroy (ObjectType* object) 
    { 
     // If the line below triggers a compiler error, it means that you are using 
     // an incomplete type for ObjectType (for example, a type that is declared 
     // but not defined). This is a problem because then the following delete is 
     // undefined behaviour. The purpose of the sizeof is to capture this situation. 
     // If this was caused by a ScopedPointer to a forward-declared type, move the 
     // implementation of all methods trying to use the ScopedPointer (e.g. the destructor 
     // of the class owning it) into cpp files where they can see to the definition 
     // of ObjectType. This should fix the error. 
     ignoreUnused (sizeof (ObjectType)); 

     delete object; 
    } 
}; 

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

+0

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

+1

आपके प्रश्न के साथ कुछ भी गलत नहीं है, आपने यह जानने का एक अच्छा काम किया है कि आप +1 चाहते हैं और यदि आप एक गाइड की तलाश में हैं, तो शायद आप इसे आजमा सकते हैं: https://www.juce.com/doc/tutorial_main_window मैं व्यक्तिगत रूप से पहले यह नहीं किया है, लेकिन यह कैसे करने के लिए उत्सुक हूँ। –

+1

@ किंगिंगलोड, आश्वासन के लिए धन्यवाद। मैं अक्सर अपनी पोस्ट लंबाई के लिए मतदान मिलता है। इसके अलावा, मैं उस ट्यूटोरियल के माध्यम से रहा हूं और यह काफी अच्छा है, हालांकि, मेरा मानना ​​है कि यह आपको केवल एक विंडो जोड़ने देता है जिसे आपको सबकुछ कोड करना है (अर्थात्, यदि आप उस नई विंडो में स्लाइडर को जोड़ना चाहते हैं, घुंडी, लेबल, पाठ संपादक, आदि ... आप इसे JUCE में आलेखीय संपादक के माध्यम से सम्मिलित नहीं कर सकते हैं, आपको अपने प्लेसमेंट, पैरामीटर इत्यादि को कोड-कोड करना होगा)। मैं जानना चाहता हूं कि एक नई विंडो कैसे खोलें, लेकिन वह विंडो ग्राफ़िकल JUCE संपादक के माध्यम से संपादन योग्य हो। –

उत्तर

1

मैंने इसे समझ लिया। मैं बनाने के लिए आवश्यक:

  1. एक नया जीयूआई घटक
  2. एक वर्ग (मैं इसे BasicWindow, Juce डेमो कोड के आधार पर कहा जाता है) कि करने के लिए एक खोल के रूप में कार्य (याद रखें, यह Juce में दृश्य संपादक है) इस नई खिड़की को चलाएं और जीयूआई घटक रखो।
  3. एक JUCE सेफ पॉइंटर जो किसी भी प्रकार का मूल ऑब्जेक्ट बनाता है जब भी बटन क्लिक किया जाता है और उस विंडो में विशेषताओं को सेट करता है।

    पंक्ति 3) बटन का हैंडलर खंड नई विंडो बनाने के अंदर का जिक्र करते हुए:

यहाँ मेरी कोड है

basicWindow = new BasicWindow("Information", Colours::grey, DocumentWindow::allButtons); 

basicWindow->setUsingNativeTitleBar(true); 
basicWindow->setContentOwned(new InformationComponent(), true);// InformationComponent is my GUI editor component (the visual editor of JUCE) 

basicWindow->centreWithSize(basicWindow->getWidth(), basicWindow->getHeight()); 
basicWindow->setVisible(true); 

जिक्र करते हुए 2 लाइन) एक .cpp फ़ाइल है कि परिभाषित करता है क्या BasicWindow है:

#include "../JuceLibraryCode/JuceHeader.h" 

class BasicWindow : public DocumentWindow 
{ 
private: 
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BasicWindow) 

public: 
    BasicWindow (const String& name, Colour backgroundColour, int buttonsNeeded) 
    : DocumentWindow (name, backgroundColour, buttonsNeeded) 
    { 
    } 

    void closeButtonPressed() override 
    { 
     delete this; 
    } 
}; 

और लाइन 1 की चर्चा करते हुए) जीयूआई संपादक घटक है, जो यह करने के लिए आसान है। आप बस JUCE फ़ाइल प्रबंधक में एक नई फ़ाइल जोड़ें। "नया जीयूआई घटक जोड़ें," फिर अपने सभी तत्वों और हैंडलर कोड को दृष्टि से जोड़ें।

मेरा सबसे बड़ा मुद्दा यह था कि मैं एक JUCE स्कोप्ड पॉइंटर का उपयोग कर रहा था, इसलिए ऑब्जेक्ट को हटाने के बाद, पॉइंटर को इंगित करने के लिए उसे वापस सेट नहीं किया जा रहा था। सुरक्षित पॉइंटर यह करता है। यदि कोई और स्पष्टीकरण की आवश्यकता है, तो मुझे मदद करने में प्रसन्नता हो रही है, क्योंकि यह किसी के लिए भयानक था जिसके साथ बहुत अधिक जीयूआई विकास नहीं था "उसके बेल्ट के नीचे।"

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