मैं (अर्थात बॉयलरप्लेट कोड का भार से छुटकारा पाने के) QObject
आवरण वर्गों है कि अन्य QObject
व्युत्पन्न वर्ग की संपत्ति का उपयोग आगे के निर्माण को आसान बनाने की कोशिश कर रहा हूँ बनाने के लिए एक मैक्रो का उपयोग करना।QObject व्युत्पन्न वर्ग
छोटे शुरू करने के लिए, मैं सिर्फ एक संपत्ति के साथ यह कोशिश कर रहा हूँ:
// Sy_test.h - The wrapped class
class Sy_test : public QObject
{
Q_OBJECT
Q_PROPERTY(bool prop READ getProp WRITE setProp NOTIFY propChanged)
public:
Sy_test(QObject* parent = nullptr) :
QObject{ parent },
prop_{ false } {}
bool getProp() const { return prop_; }
public slots:
void setProp(bool value)
{
if (value != prop_) {
prop_ = value;
emit propChanged(prop_);
}
}
signals:
void propChanged(bool value);
private:
bool prop_;
};
// Sy_proxy.h - The wrapper generator
#define SY_PROXYPROPERTY(Type, Name, Getter, Setter, Notifier)\
private:\
Q_PROPERTY(Type Name READ Getter WRITE Setter NOTIFY Notifier)\
\
public:\
Type Getter() const { return target_->Getter(); }\
\
public slots:\
void Setter(Type value) { target_->Setter(value); }\
\
signals:\
void Notifier(Type value);\
\
private:\
void setConnection()\
{\
connect(target_, &std::remove_pointer< decltype(target_) >::type::Notifier,\
this, &std::remove_pointer< decltype(this ) >::type::Notifier);\
}
#define SY_PROXY(ProxyName, TargetType, Prop1)\
class ProxyName : public QObject\
{\
Q_OBJECT \
Prop1 \
\
public:\
ProxyName(TargetType* target) :\
target_{ target }\
{\
setConnection();\
}\
\
virtual ~ProxyName() {}\
\
private:\
TargetType* target_;\
};
// This should create a Sy_test wrapper class called Sy_testProxy
SY_PROXY(Sy_testProxy,
Sy_test,
SY_PROXYPROPERTY(bool, prop, getProp, setProp, propChanged))
तो SY_PROXY
मैक्रो एक वर्ग कार्यान्वयन के साथ Sy_test::prop
संपत्ति की एक प्रति किया जाता है कि Sy_testProxy
बुलाया बनाना चाहिए कि सिर्फ आगे अनुरोध/संकेत है।
और यह लगभग करता है। प्री-प्रोप्रोसेसर आउटपुट को देखकर (मैं g ++ का उपयोग कर रहा हूं, इसलिए .ii फाइलें), मैं Sy_testProxy
क्लास का निर्माण कर सकता हूं और यह Sy_test
वर्ग के समान रूप में है। हालांकि, मैं कोई त्रुटि मिलती है:
../CppTest/Sy_proxy.h:47: Error: NOTIFY signal 'propChanged' of property 'prop' does not exist in class Sy_testProxy.
make: *** [moc_Sy_proxy.cpp] Error 1
तो moc
की तरह मेरे मैक्रो जादू पार्स करने के लिए विफल हो रहा है यह लग रहा है; हालांकि मुझे यकीन नहीं है कि SY_PROXY
मैक्रो मौजूद है (Sy_testProxy
नामक कक्षा से त्रुटि आ रही है), और SY_PROXYPROPERTY
भी मान्य होना चाहिए (moc
ने Q_PROPERTY
मैक्रो से इसे पढ़ना होगा)। क्या कोई देख सकता है कि मैं गलत कहां गया हूं?
रिकॉर्ड के लिए: मैं हर किसी की तरह मैक्रो नफरत है, लेकिन मैं moc
के टेम्पलेट्स के लिए घृणा और QObject
आभासी विरासत की वजह से उन्हें प्रयोग में गिर गई है। यह जांच ट्रिगर हुई क्योंकि मेरे पास अलग-अलग धागे में भारी गणना करने वाले उदाहरणों का संग्रह था, लेकिन वे क्यूएमएल प्रस्तुतिकरण चलाते थे। हालांकि QML मुख्य थ्रेड के बाहर ऑब्जेक्ट्स के लिए कनेक्शन/प्रॉपर्टी बाइंडिंग की इजाजत नहीं देता है, इसलिए मुझे मुख्य थ्रेड में रहने वाली प्रॉक्सी ऑब्जेक्ट बनाने में मजबूर होना पड़ा है। अगर किसी के पास एक बेहतर विचार है, तो मैं उनके लिए बहुत खुला हूं!
मुझे लगता है कि यह कुछ भी नहीं बदलता है, लेकिन आप '' मैक्रो signals' ... AFAIK MOC का विस्तार नहीं करता है के बजाय Q_SIGNAL' बहुत अच्छी तरह से कोशिश कर सकते। यह कुछ हद तक करता है, लेकिन चूंकि यह मानक से चिपकता नहीं है, इसलिए मैं हमेशा उन्हें QObject व्युत्पन्न कक्षाओं के शीर्षकों से बचाता हूं। – leemes
यह मुझे एक्स-वाई समस्या की तरह लगता है। आपके प्रश्न का पहला पैराग्राफ अधिक विस्तृत होना चाहिए। कृपया बताएं कि आप वास्तव में क्या करने की कोशिश कर रहे हैं। आपकी कक्षा पदानुक्रम क्या है, किस वस्तु में गुण हैं, टेम्पलेट वर्ग कहां हैं, और आपको यह सब क्यों चाहिए। "रिकॉर्ड के लिए" पैराग्राफ इसका एक हिस्सा है, लेकिन फिर भी पर्याप्त जानकारी प्रदान नहीं करता है। –
मुझे यह भी यकीन नहीं है कि "क्यूएमएल मुख्य स्रोत के बाहर ऑब्जेक्ट्स के लिए कनेक्शन/प्रॉपर्टी बाइंडिंग की इजाजत नहीं देता है" –