Q_OBJECT ম্যাক্রো কী করে? সমস্ত Qt অবজেক্টের কেন এই ম্যাক্রোর দরকার?


131

আমি সবেমাত্র কিউটি ব্যবহার শুরু করেছি এবং লক্ষ্য করেছি যে সমস্ত উদাহরণ শ্রেণির সংজ্ঞাগুলিতে Q_OBJECTপ্রথম লাইন হিসাবে ম্যাক্রো রয়েছে । এই প্রিপ্রসেসর ম্যাক্রোর উদ্দেশ্য কী?


25
কিউটি কুইকটাইমকে বোঝায় এবং কিউটি Qt নামক সি ++ গ্রন্থাগারকে বোঝায়।
ব্লিডফ

উত্তর:


132

থেকে কিউটি ডকুমেন্টেশন :

মেটা-অবজেক্ট কমপাইলার, এমওসি, হ'ল প্রোগ্রাম যা Qt এর সি ++ এক্সটেনশনগুলি পরিচালনা করে।

মোক সরঞ্জামটি একটি সি ++ শিরোনাম ফাইলটি পড়ে। যদি এটি এক বা একাধিক শ্রেণীর ঘোষণার সন্ধান করে যা Q_OBJECT ম্যাক্রো ধারণ করে তবে এটি একটি শ্রেণীর জন্য মেটা-অবজেক্ট কোড যুক্ত একটি সি ++ উত্স ফাইল তৈরি করে। অন্যান্য জিনিসের মধ্যে, সিগন্যাল এবং স্লট প্রক্রিয়া, রান-টাইম ধরণের তথ্য এবং গতিশীল সম্পত্তি সিস্টেমের জন্য মেটা-অবজেক্ট কোড প্রয়োজন।


আমার কেন লেখার দরকার নেই, Q_OBJECT::connect()বরং শুধু লেখার connect()?
এমএল স্টুডেন্ট 33

19

এটি কেবল প্রাক-সংকলককে বলে যে এই শ্রেণীর গুই উপাদান রয়েছে এবং এটি 'এমওসি' এর মাধ্যমে চালানো দরকার আপনার কেবল ক্লাসে এটি যুক্ত করতে হবে যা সংকেত / স্লট প্রক্রিয়া ব্যবহার করে।
তবে এটি অন্য কোনও ক্লাসে চুপচাপ উপেক্ষা করা হবে - এটি কেবল বিল্ড সময়কে যুক্ত করে।


3
এটিও মিথ্যা যে আপনার কেবলমাত্র ক্লাসে এটি প্রয়োজন যা সংকেত / স্লট প্রক্রিয়া ব্যবহার করে। অনুপস্থিতি অবিচ্ছিন্নতা এবং অন্তর্নিহিতকে Q_OBJECTভেঙে দেয় qobject_cast। এটি কিছু বিভ্রান্তিকর আচরণের দিকে নিয়ে যেতে পারে, সুতরাং এটি একটি খারাপ ধারণা।
মনিকা

2
এটি সত্য নয় যে Q_OBJECTঅন্য কোনও (নন QObject) শ্রেণিতে "চুপচাপ" উপেক্ষা করা হবে । সি ++ স্ট্যান্ডার্ড অনুসারে, এটি বেশ কয়েকটি সদস্য ফাংশন এবং ভেরিয়েবলগুলি কখনই সংজ্ঞায়িত হয় না তা ঘোষণা করে অপরিবর্তিত আচরণের প্রবর্তন করে। এটি নির্দিষ্ট শ্রেণীর QObjectসদস্যদের সাথে আপনার শ্রেণীর নাম স্থানকেও দূষিত করে । উদাহরণস্বরূপ, একটি Q_OBJECTসম্পর্কিত নয় এমন একটি ক্লাস ভেঙে যেতে পারে যার নাম একটি পদ্ধতি রয়েছে metaObject
মনিকা

2
ওইটা ভুল. যদিও আপনি সম্ভবত Q_OBJECTম্যাক্রোর সাথে বেশিরভাগ গি-ক্লাস সজ্জিত করতে চান তবে ম্যাক্রোর সাথে নন-গি-ক্লাস এবং ম্যাক্রো ছাড়াই গুই-ক্লাসগুলি রাখাই পুরোপুরি বোধ করে। ম্যাক্রো দরকারী তবে গুই-ক্লাসগুলির জন্যই সীমাবদ্ধ নয় বা প্রয়োজনীয়ও নয়।
pasbi

9

এমওসি (মেটা অবজেক্ট সংকলক) কিউওবিজেইসিটি ম্যাক্রো অন্তর্ভুক্ত শিরোনাম ফাইলগুলিকে সি ++ সমমানের উত্স কোডে রূপান্তর করে। এটি মূলত সিগন্যাল-স্লট প্রক্রিয়াটি নিয়ন্ত্রণ করে এবং এটি সি ++ কম্পাইলারের কাছে বোধগম্য করে তোলে


2
এটি মিথ্যা: Q_OBJECTম্যাক্রো সংকলক দ্বারা প্রসারিত হয়, এর জন্য মক প্রয়োজন হয় না। ম্যাক নিজেই ম্যাক্রোর সাথে কিছু করে না, তবে এটি সদস্যের ভেরিয়েবল এবং ম্যাক্রো ঘোষিত পদ্ধতিগুলির সংজ্ঞা তৈরি করে । Q_OBJECT
মনিকা

5

1 মেটা-অবজেক্ট সিস্টেমের কিউটি ডকুমেন্টেশন থেকে

মোক সরঞ্জামটি একটি সি ++ উত্স ফাইলটি পড়ে। যদি এটি এক বা একাধিক শ্রেণীর ঘোষণার সন্ধান করে যা Q_OBJECT ম্যাক্রো ধারণ করে, এটি অন্য একটি সি ++ উত্স ফাইল উত্পন্ন করে যা সেই শ্রেণীর প্রত্যেকটির জন্য মেটা-অবজেক্ট কোড ধারণ করে। এই উত্পন্ন উত্স ফাইলটি হয় # শ্রেণীর উত্স ফাইলে অন্তর্ভুক্ত করা হয় বা আরও সাধারণত, ক্লাসের প্রয়োগের সাথে সংকলিত এবং যুক্ত হয়।

2 Q_OBJECT এর কিউটি ডকুমেন্টেশন থেকে

Q_OBJECT ম্যাক্রো অবশ্যই এমন একটি শ্রেণীর সংজ্ঞার ব্যক্তিগত বিভাগে উপস্থিত থাকতে হবে যা নিজস্ব সংকেত এবং স্লটগুলি ঘোষণা করে বা Qt এর মেটা-অবজেক্ট সিস্টেম দ্বারা সরবরাহিত অন্যান্য পরিষেবাদি ব্যবহার করে।

3 মোক এর Qt ডকুমেন্টেশন থেকে

মোক সরঞ্জামটি একটি সি ++ শিরোনাম ফাইলটি পড়ে। যদি এটি এক বা একাধিক শ্রেণীর ঘোষণার সন্ধান করে যা Q_OBJECT ম্যাক্রো ধারণ করে তবে এটি একটি শ্রেণীর জন্য মেটা-অবজেক্ট কোড যুক্ত একটি সি ++ উত্স ফাইল তৈরি করে। অন্যান্য জিনিসের মধ্যে, সিগন্যাল এবং স্লট প্রক্রিয়া, রান-টাইম ধরণের তথ্য এবং গতিশীল সম্পত্তি সিস্টেমের জন্য মেটা-অবজেক্ট কোড প্রয়োজন।

4 সিগন্যাল এবং স্লটের কিউটি ডকুমেন্টেশন থেকে

এমও দ্বারা বাস্তবায়িত বেশ কয়েকটি সদস্যের কার্যকারিতা ঘোষণা করার জন্য প্রিপ্রসেসর দ্বারা কি_ওবিজেইসিটি ম্যাক্রো প্রসারিত করা হয়েছে; যদি আপনি "LcdNumber এর জন্য vtable এর অপরিজ্ঞাত রেফারেন্স" এর লাইনে সংকলক ত্রুটিগুলি পেয়ে থাকেন তবে আপনি সম্ভবত মক চালানো বা লিঙ্ক কমান্ডে মক আউটপুট অন্তর্ভুক্ত করতে ভুলে গিয়েছেন।


2

জিসিসিতে -Eআপনি প্রসারিত ম্যাক্রো দেখতে পাবেন। এটি Q_OBJECTলিনাক্সের জিসিসি-তে প্রসারিত হয়। সচেতন থাকুন, এটি প্ল্যাটফর্ম নির্ভর হতে পারে এবং এটি কিউটি-র সংস্করণের উপর নির্ভর করে পরিবর্তিত হতে পারে। আপনি দেখতে পারেন এটি কেবলমাত্র মক সংকলকের জন্য একটি ট্যাগ নয়।

# 11 "mainwindow.hh"
#pragma GCC diagnostic push
# 11 "mainwindow.hh"

# 11 "mainwindow.hh"
#pragma GCC diagnostic ignored "-Wsuggest-override"
# 11 "mainwindow.hh"
    static const QMetaObject staticMetaObject; virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); virtual int qt_metacall(QMetaObject::Call, int, void **); static inline QString tr(const char *s, cons
t char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } __attribute__ ((__deprecated__)) static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } private:
# 11 "mainwindow.hh"
#pragma GCC diagnostic ignored "-Wattributes"
# 11 "mainwindow.hh"
    __attribute__((visibility("hidden"))) static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
# 11 "mainwindow.hh"
#pragma GCC diagnostic pop
# 11 "mainwindow.hh"
    struct QPrivateSignal {};

0

Q_OBJECT ম্যাক্রো অবশ্যই এমন একটি শ্রেণীর সংজ্ঞার ব্যক্তিগত বিভাগে উপস্থিত থাকতে হবে যা নিজস্ব সংকেত এবং স্লটগুলি ঘোষণা করে বা Qt এর মেটা-অবজেক্ট সিস্টেম দ্বারা সরবরাহিত অন্যান্য পরিষেবাদি ব্যবহার করে।


1
এটি বিভ্রান্তিমূলক: Q_OBJECTম্যাক্রো থেকে প্রাপ্ত প্রতিটি শ্রেণিতে অবশ্যই উপস্থিত থাকতে হবে QObject। আপনার কোডটি ম্যাক্রোটি অনুপস্থিত থাকাকালীনভাবে বিভক্ত হয়ে যাবে এবং সংকলনটি ঘটায় তা ঠিক হয়ে যায় না।
মনিকা

@ কুবা ওবারের আপনার কাছে কোডের একটি উদাহরণ রয়েছে যা সংকলন করে তবে Q_OBJECTম্যাক্রো অনুপস্থিত অবস্থায় কাজ করে না ?
ক্রিস

2
আপনি যদি এর বাস্তবায়নটি দেখে থাকেন তবে Q_OBJECTআপনি দেখতে পাবেন যে এটি অ্যাক্সেস স্পেসিফায়ার ব্যবহার করে। তাই কিনা ম্যাক্রো অধীনে প্রদর্শিত হওয়া উচিত private, protectedঅথবা publicনির্দিষ্টকরী অপ্রাসঙ্গিক - এটা ক্লাসের মাথায় রাখুন মাত্র সম্মেলন হচ্ছে।
ট্রাবলডজে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.