কিউটি ইভেন্ট এবং সংকেত / স্লট


99

কিউটি বিশ্বে ইভেন্ট এবং সংকেত / স্লটের পার্থক্য কী?

একজন কি অন্যটিকে প্রতিস্থাপন করে? ইভেন্টগুলি কি সংকেত / স্লটের বিমূর্ততা?

উত্তর:


30

কিউটি ডকুমেন্টেশন সম্ভবত এটি শ্রেষ্ঠ ব্যাখ্যা করেছেন:

কিউটিতে, ইভেন্টগুলি অবজেক্ট QEventক্লাস থেকে উদ্ভূত বস্তু, যা অ্যাপ্লিকেশনটির মধ্যে ঘটেছিল বা বাইরের ক্রিয়াকলাপের ফলে অ্যাপ্লিকেশনটির সম্পর্কে জানা থাকা দরকার বলে প্রতিনিধিত্ব করে। ইভেন্টগুলি QObjectসাবক্লাসের যে কোনও উদাহরণের মাধ্যমে গ্রহণ ও পরিচালনা করতে পারে তবে সেগুলি উইজেটের সাথে বিশেষভাবে প্রাসঙ্গিক। এই দস্তাবেজটি বর্ণনা করে যে কীভাবে একটি সাধারণ অ্যাপ্লিকেশনটিতে ইভেন্টগুলি বিতরণ করা হয় এবং পরিচালনা করা হয়।

সুতরাং ইভেন্ট এবং সিগন্যাল / স্লট একই জিনিস সম্পাদন করা দুটি সমান্তরাল প্রক্রিয়া are সাধারণভাবে, একটি ইভেন্ট বাইরের সত্তা দ্বারা উত্পন্ন করা হবে (উদাহরণস্বরূপ, কীবোর্ড বা মাউস হুইল) এবং ইভেন্ট লুপের মাধ্যমে সরবরাহ করা হবে QApplication। সাধারণভাবে, আপনি কোডটি সেট আপ না করা পর্যন্ত আপনি ইভেন্ট তৈরি করবেন না। আপনি এগুলি ফিল্টার করতে পারেন QObject::installEventFilter()বা উপযুক্ত ফাংশনগুলিকে ওভাররাইড করে সাবক্ল্যাসড বস্তুতে ইভেন্টগুলি পরিচালনা করতে পারেন।

সংকেত এবং স্লটগুলি উত্পাদন করা এবং গ্রহণ করা অনেক সহজ এবং আপনি যে কোনও দুটি QObjectসাবক্লাস সংযোগ করতে পারেন । এগুলি মেটাক্লাসের মাধ্যমে পরিচালিত হয় (আরও তথ্যের জন্য আপনার moc_classname.cpp ফাইলটি দেখুন) তবে আপনি যে আন্তঃরঙের যোগাযোগ তৈরি করবেন তার বেশিরভাগই সম্ভবত সংকেত এবং স্লট ব্যবহার করবে। সিগন্যালগুলি তাত্ক্ষণিকভাবে বিতরণ করা যেতে পারে বা একটি সারির মাধ্যমে পিছিয়ে দেওয়া যেতে পারে (যদি আপনি থ্রেড ব্যবহার করছেন)।

একটি সংকেত তৈরি করা যেতে পারে।


স্থগিত করা সারি কিউ ইভেন্ট ইভেন্ট লুপের মতো, না এটি দুটি সারি বিদ্যমান? ডিফার্ড সিগন্যালের জন্য একটি এবং ইভেন্টের জন্য?
Guillaume07

30
@ রাফেল এই উত্তরটি গ্রহণ করার জন্য আপনাকে লজ্জা দিচ্ছে। - উদ্ধৃত অনুচ্ছেদে "সংকেত" বা "স্লট" শব্দটিও নেই!
রবার্ট সিমার

4
@ নিউরোনেট: অনুচ্ছেদে উদ্ধৃত হয়েছে "[এটি] এটি সর্বোত্তমভাবে ব্যাখ্যা করে", যা তা দেয় না। একদমই না. এমনকি সামান্য না.
রবার্ট সিমার

@ রবার্ট তাই যদি সেই ছোট্ট ইন্ট্রো লাইনটি "এই সংকেতগুলির সাথে সম্পর্কিত কীভাবে তা বিবেচনা করার আগে ডক্স কীভাবে ঘটনাগুলি ব্যাখ্যা করে তা বিবেচনা করুন" এ পরিবর্তিত হয়ে গেলে আপনি কি উত্তরটির সাথে ঠিক আছেন? যদি তাই হয় তবে আমরা এটির উন্নতি করার জন্য উত্তরটি কেবল সম্পাদনা করতে পারি কারণ এটি একটি ছোটখাটো বিষয় এবং আমি সম্মত better [এটি একটি আসল প্রশ্ন সম্পাদনা করুন: যেহেতু আমি নিশ্চিত নই যে এটির বাকী অংশগুলি আরও ভাল .... তবে কেবলমাত্র উদ্ধৃত অংশটি সংকেতের উল্লেখ না করায় যদি বাকী অংশটি আসলে ভাল হয় তবে আমি যা আছি ধরে
নিচ্ছেন

4
@ নিউরনেট, আপনি যদি উক্তিটি পুরোপুরি সরিয়ে ফেলেন তবে এটি আমার চোখে উত্তরটি উন্নত করবে। - আপনি যদি পুরো উত্তরটি সরিয়ে ফেলেন তবে এটি পুরো QA এর উন্নতি করবে।
রবার্ট সিমার

152

কিউটিতে, সংকেত এবং ইভেন্টগুলি উভয়ই পর্যবেক্ষক প্যাটার্নের বাস্তবায়ন । এগুলি বিভিন্ন পরিস্থিতিতে ব্যবহৃত হয় কারণ তাদের শক্তি এবং দুর্বলতা রয়েছে।

প্রথমে আসুন আমরা কিউটি ইভেন্টের অর্থ হ'ল সংজ্ঞা দিই: কিউটি ক্লাসে একটি ভার্চুয়াল ফাংশন, আপনি যদি ইভেন্টটি পরিচালনা করতে চান তবে আপনার একটি বেস ক্লাসে পুনর্নির্মাণের আশা করা হচ্ছে। এটি টেম্পলেট পদ্ধতি প্যাটার্নের সাথে সম্পর্কিত ।

আমি কীভাবে " হ্যান্ডেল " শব্দটি ব্যবহার করেছি তা নোট করুন । প্রকৃতপক্ষে, এখানে সংকেত এবং ইভেন্টের অভিপ্রায়ের মধ্যে একটি প্রাথমিক পার্থক্য:

  • আপনি ইভেন্টগুলি " পরিচালনা " করেন
  • সংকেত নির্গমন সম্পর্কে আপনি " অবহিত " হন "

পার্থক্যটি হ'ল আপনি যখন ইভেন্টটি "পরিচালনা" করেন, আপনি শ্রেণীর বাইরে কার্যকর এমন আচরণের সাথে "প্রতিক্রিয়া জানানোর" দায়িত্ব গ্রহণ করেন। উদাহরণস্বরূপ, এমন অ্যাপ্লিকেশনটি বিবেচনা করুন যাতে তার সাথে একটি নম্বরযুক্ত বোতাম রয়েছে। অ্যাপটিকে ব্যবহারকারীদের বোতামটি ফোকাস করতে দেওয়া উচিত এবং "উপরে" এবং "ডাউন" কীবোর্ড কীগুলি টিপে সংখ্যাটি পরিবর্তন করতে হবে। অন্যথায় বোতামটি স্বাভাবিকের মতো কাজ করা উচিত QPushButton(এটি ক্লিক করা যায় ইত্যাদি)। কিউটি এই আপনার নিজের সামান্য পুনর্ব্যবহারযোগ্য "কম্পোনেন্ট" (এর উপশ্রেণী তৈরি করে সম্পন্ন করা হয় QPushButton), যা reimplements QWidget::keyPressEvent। সুডোকোড:

class NumericButton extends QPushButton
    private void addToNumber(int value):
        // ...

    reimplement base.keyPressEvent(QKeyEvent event):
        if(event.key == up)
            this.addToNumber(1)
        else if(event.key == down)
            this.addToNumber(-1)
        else
            base.keyPressEvent(event)

দেখা? এই কোডটি একটি নতুন বিমূর্ততা উপস্থাপন করে: একটি উইজেট যা বোতামটির মতো কাজ করে তবে কিছু অতিরিক্ত কার্যকারিতা সহ। আমরা খুব কার্যকরীভাবে এই কার্যকারিতা যুক্ত করেছি:

  • যেহেতু আমরা ভার্চুয়ালটিকে পুনরায় প্রয়োগ করেছি, তাই আমাদের বাস্তবায়নটি স্বয়ংক্রিয়ভাবে আমাদের শ্রেণিতে আবদ্ধ হয়ে যায়। যদি কিউটি এর ডিজাইনাররা keyPressEventএকটি সংকেত তৈরি করে থাকে , আমাদের সিগন্যালের উত্তরাধিকারী হতে হবে QPushButtonবা কেবল বাহ্যিকভাবে সংযুক্ত করতে হবে কিনা তা আমাদের সিদ্ধান্ত নেওয়া দরকার । তবে এটি নির্বোধ হবে, যেহেতু Qt এ আপনি সর্বদা প্রত্যাশিত হবেন যখন কোনও কাস্টম আচরণের সাথে উইজেট লেখার সময় (সঙ্গত কারণে - পুনঃব্যবহারযোগ্যতা / মডুলারালিটি)। সুতরাং keyPressEventএকটি ইভেন্ট তৈরি করে, তারা তাদের উদ্দেশ্যটি জানায় keyPressEventযা কার্যকারিতার কেবল একটি প্রাথমিক বিল্ডিং ব্লক। যদি এটি কোনও সংকেত হত তবে এটি ব্যবহারকারীর মুখোমুখি জিনিসটির মতো লাগবে, যখন এটি করার ইচ্ছা নেই।
  • যেহেতু ফাংশনটির বেস-ক্লাস-বাস্তবায়ন উপলব্ধ, আমরা আমাদের বিশেষ কেসগুলি (আপ এবং ডাউন কীগুলি) পরিচালনা করে এবং বাকীটি বেস শ্রেণিতে রেখে সহজেই চেইন অফ-দায়িত্ব প্যাটার্নটি প্রয়োগ করি । আপনি দেখতে পাচ্ছেন এটি যদি প্রায়শই keyPressEventসংকেত হত তবে প্রায় অসম্ভব হয়ে উঠবে ।

কিউটি নকশা ভাল চিন্তা আউট হয় - তারা আমাদের তৈরি সাফল্যের গর্তে পড়ে যায় ডান জিনিস কাজ করা সহজ এটি তৈরি ও ভুল জিনিস করতে কঠিন (keyPressEvent একটি ইভেন্ট তৈরি করে) দ্বারা।

অন্যদিকে, এর সহজ ব্যবহার বিবেচনা করুন QPushButton- কেবল এটি তাত্পর্যপূর্ণ করা হয় এবং এটি ক্লিক করার পরে বিজ্ঞপ্তি পাওয়া :

button = new QPushButton(this)
connect(button, SIGNAL(clicked()), SLOT(sayHello())

এটি ক্লাসের ব্যবহারকারী দ্বারা পরিষ্কারভাবে বোঝানো হয়েছে :

  • আমাদের যদি QPushButtonপ্রতিটি বার সাবক্লাস করতে হয় তবে কিছু ক্লিকের জন্য আমাদের কিছু বোতামটি জানানোর জন্য প্রয়োজন, কারণ এটি কোনও অকারণে অনেক সাবক্লাসের প্রয়োজন ! messageboxক্লিক করা হলে শুধুমাত্র "হ্যালো ওয়ার্ল্ড" দেখায় এমন উইজেট কেবলমাত্র একক ক্ষেত্রে কার্যকর - তাই এটি সম্পূর্ণ পুনরায় ব্যবহারযোগ্য নয়। আবার, বাহ্যিকভাবে এর সাথে সংযোগ স্থাপন করে - সঠিক কাজটি করা ছাড়া আমাদের আর কোনও উপায় নেই।
  • আমরা কয়েকটি স্লট এর সাথে সংযোগ করতে চাই clicked()- বা এর সাথে বেশ কয়েকটি সংকেতকে সংযুক্ত করতে চাই sayHello()। সিগন্যালের সাথে কোনও কোলাহল নেই। সাবক্লাসিংয়ের সাহায্যে আপনি উপযুক্ত নকশার সিদ্ধান্ত না নেওয়া পর্যন্ত আপনাকে বসে কিছু শ্রেণির চিত্রগুলি নিয়ে চিন্তা করতে হবে।

নোট করুন যে জায়গাগুলির মধ্যে যেটি QPushButtonইমিট করে clicked()তা এর mousePressEvent()বাস্তবায়নে রয়েছে। এর অর্থ এই নয় clicked()এবং mousePressEvent()বিনিময়যোগ্য - কেবলমাত্র তারা সম্পর্কিত।

সুতরাং সংকেত এবং ইভেন্টগুলির পৃথক উদ্দেশ্য রয়েছে (তবে এটির সাথে সম্পর্কিত যে উভয়ই আপনাকে কিছু ঘটনার একটি বিজ্ঞপ্তিতে "সাবস্ক্রাইব" করতে দেয়)।


আমি ধারণা পেতে। ইভেন্ট প্রতি ক্লাসে হয়, কোনও শ্রেণীর সমস্ত উদাহরণ একই রকম প্রতিক্রিয়া দেখাবে, তারা সকলেই একই কিউ ক্লাসনাম :: ইভেন্টকে কল করবে। তবে সিগন্যাল প্রতি-বস্তুর, প্রতিটি বস্তুর নিজস্ব অনন্য সিগন্যাল-স্লট সংযোগ থাকতে পারে।
21 薯条 德里克

39

আমি এখন পর্যন্ত উত্তর পছন্দ করি না। - আমাকে প্রশ্নের এই অংশে মনোনিবেশ করা যাক:

ইভেন্টগুলি কি সংকেত / স্লটের বিমূর্ততা?

সংক্ষিপ্ত উত্তর: না। দীর্ঘ উত্তর একটি "আরও ভাল" প্রশ্ন উত্থাপন করে : সংকেত এবং ইভেন্টগুলি কীভাবে সম্পর্কিত?

একটি অলস মূল লুপ (উদাহরণস্বরূপ Qt এর) অপারেটিং সিস্টেমের একটি নির্বাচন () কলটিতে সাধারণত "আটকে" থাকে। এই কলটি অ্যাপ্লিকেশনটিকে "ঘুম" করে তোলে, যখন এটি সকেট বা ফাইলগুলির একটি গুচ্ছ বা কার্নেলের কাছে যা কিছু জিজ্ঞাসা করে তা পাস করে: যদি এইগুলির মধ্যে কিছু পরিবর্তন হয়, তবে নির্বাচন করুন () কলটি ফিরে আসুন। - এবং কার্নেল, বিশ্বের কর্তা হিসাবে জানে যে কখন তা ঘটে।

সেই নির্বাচনের () কলের ফলাফলটি হতে পারে: সকেটের নতুন ডেটা এক্স 11 এর সাথে সংযুক্ত, আমরা যে ইউডিপি পোর্টের মধ্যে শুনি তার প্যাকেট ইত্যাদি এসেছিল That এই স্টাফটি না কোনও Qt সংকেত, না কিউটি ইভেন্ট এবং এবং কিউটি প্রধান লুপ নিজেই সিদ্ধান্ত নেয় যদি তাজা ডেটাটিকে এক, অন্যটিতে পরিণত করে বা এড়িয়ে যায়।

কিউটি কী-প্রেস ইভেন্ট () বা কী-ওয়ার্ডপ্রেস () এর মতো কোনও পদ্ধতিতে কল করতে পারে, কার্যকরভাবে এটিকে Qt ইভেন্টে রূপান্তরিত করে। বা কিউটি একটি সংকেত নির্গত করে, যা কার্যকরভাবে সেই সংকেতের জন্য নিবন্ধিত সমস্ত ফাংশন সন্ধান করে এবং একে একে একে ডাকে।

এই দুটি ধারণার একটি পার্থক্য এখানে দৃশ্যমান: এই সংকেতটিতে নিবন্ধিত অন্যান্য স্লটগুলি কল হবে কিনা তা নিয়ে একটি স্লটে কোনও ভোট নেই। - ইভেন্টগুলি আরও একটি শৃঙ্খলার মতো হয় এবং ইভেন্ট হ্যান্ডলার সিদ্ধান্ত নেয় যে এটি যদি সেই চেইনে বাধা দেয় বা না করে। এই দিক থেকে সংকেতগুলি তারা বা গাছের মতো দেখাচ্ছে।

একটি ইভেন্ট ট্রিগার করতে পারে বা পুরোপুরি সিগন্যালে রূপান্তরিত হতে পারে (কেবলমাত্র একটিটি নির্গত করুন এবং "সুপার ()" কল করবেন না)। একটি সংকেত ইভেন্টে রূপান্তরিত হতে পারে (ইভেন্ট হ্যান্ডলারকে কল করুন)।

কেসের উপর নির্ভর করে কিসের বিমূর্ততা রয়েছে: ক্লিক করা () - সিগন্যাল অ্যাবস্ট্রাক্ট মাউস ইভেন্টগুলি (একটি বোতাম খুব বেশি না ঘুরে আবার নীচে নেমে যায়)। কীবোর্ড ইভেন্টগুলি নিম্ন স্তরের বিমূর্ততা (果 বা é এর মতো জিনিসগুলি আমার সিস্টেমে বেশ কয়েকটি কী স্ট্রোক)।

হতে পারে ফোকাসআইএনএভেন্ট () এর বিপরীত উদাহরণ: এটি ক্লিক করা () সংকেতটি ব্যবহার করতে পারে (এবং এইভাবে বিমূর্ত), তবে এটি আসলে কী তা আমি জানি না।


4
আমি এই অংশটি খুঁজে পেয়েছি: "সংকেত এবং ইভেন্টের মধ্যে পার্থক্যের জন্য খুব আলোকিতকারী" এই সংকেতটিতে নিবন্ধিত অন্যান্য স্লটগুলি কল হবে কিনা তা সম্পর্কে "একটি স্লটে কোনও ভোট নেই। তবে, আমার একটি সম্পর্কিত প্রশ্ন রয়েছে: বার্তাগুলি কী এবং কীভাবে বার্তাগুলি সংকেত এবং ইভেন্টগুলির সাথে সম্পর্কিত? (যদি তারা সম্পর্কিত হয়)। বার্তা কি সংকেত এবং ইভেন্টের জন্য বিমূর্ততা? এগুলি কিউওবজেক্টসের (বা অন্যান্য অবজেক্টগুলির)? এর মধ্যে এই জাতীয় মিথস্ক্রিয়া বর্ণনা করতে ব্যবহার করা যেতে পারে
ব্যবহারকারী 1284631

@ ম্যাক্সথ: কিউটিতে, "বার্তা" বলে কিছুই নেই। ঠিক আছে, একটি বার্তা বাক্স আছে, কিন্তু এটি প্রায়।
আনস্ল্যান্ডার মনিকা 14

@ কুবা ওবার: আপনাকে ধন্যবাদ আমার অর্থ ছিল "ইভেন্ট"।
ব্যবহারকারী 1284631

4
@ ম্যাক্সথ: তাহলে আপনার প্রশ্নটি বাজে। এটিতে লেখা রয়েছে: "ইভেন্টগুলি কী এবং কীভাবে ইভেন্টগুলি সংকেত এবং ইভেন্টগুলির সাথে সম্পর্কিত"।
আনস্ল্যান্ডার মনিকা

@ কুবা ওবার: এক বছর পরে প্রসঙ্গটি মনে নেই। যাইহোক, দেখে মনে হচ্ছে যে আমি প্রায় ওপি'র মতো একই জিনিসটি জিজ্ঞাসা করছিলাম: কী পার্থক্য বেটউই, সন্নিবিষ্ট এবং কীভাবে ইভেন্টগুলি সংকেত এবং স্লটের সাথে সম্পর্কিত। আইআইআরসি আমি আসলে কি ছিলাম, আমি কিউটি সিগন্যাল / স্লট-চালিত ক্লাসগুলিকে কিছু ধরণের নন-কিউটি ক্লাসগুলিতে গুটিয়ে রাখার উপায় খুঁজছিলাম, তাই আমি প্রথম দিকের অভ্যন্তর থেকে প্রথম আদেশের কোনও উপায়টি খুঁজছিলাম। আমি কল্পনা করি যে আমি তাদের কাছে ইভেন্টগুলি প্রেরণের বিষয়ে বিবেচনা করছি, যেহেতু এর অর্থ হল যে আমাকে কেবল কিউটি হেডার অন্তর্ভুক্ত করতে হবে, এবং আমার ক্লাসগুলিকে সংকেত / স্লটগুলি প্রয়োগ করতে বাধ্য করা হয়নি।
ব্যবহারকারী 1284631

16

ইভেন্ট লুপ দ্বারা ইভেন্টগুলি প্রেরণ করা হয়। প্রতিটি জিইউআই প্রোগ্রামের কিউটি, উইন 32 বা অন্য কোনও জিইউআই লাইব্রেরি ব্যবহার করে উইন্ডোজ বা লিনাক্স যাই লিখুন না কেন ইভেন্ট লুপের প্রয়োজন হয়। পাশাপাশি প্রতিটি থ্রেডের নিজস্ব ইভেন্ট লুপ রয়েছে। কিউটিতে "জিইউআই ইভেন্ট লুপ" (যা সমস্ত কিউটি অ্যাপ্লিকেশনগুলির মূল লুপ) লুকানো থাকে তবে আপনি এটি কল করা শুরু করেন:

QApplication a(argc, argv);
return a.exec();

আপনার প্রোগ্রামে ওএস এবং অন্যান্য অ্যাপ্লিকেশন প্রেরিত বার্তাগুলি ইভেন্ট হিসাবে প্রেরণ করা হয়।

সংকেত এবং স্লটগুলি Qt প্রক্রিয়া। মোক (মেটা-অবজেক্ট সংকলক) ব্যবহার করে সংকলনের প্রক্রিয়াতে এগুলি কলব্যাক ফাংশনে পরিবর্তিত হয়।

ইভেন্টের একটি রিসিভার থাকা উচিত, যা এটি প্রেরণ করা উচিত। অন্য কারও এই ইভেন্টটি করা উচিত নয়।

নির্গত সিগন্যালের সাথে সংযুক্ত সমস্ত স্লট কার্যকর করা হবে।

আপনার সিগন্যালগুলি ইভেন্ট হিসাবে ভাবেন না, কারণ আপনি Qt নথিতে পড়তে পারেন:

যখন কোনও সিগন্যাল নির্গত হয়, তখন এর সাথে সংযুক্ত স্লটগুলি সাধারণত একটি সাধারণ ফাংশন কলের মতোই অবিলম্বে কার্যকর করা হয়। যখন এটি ঘটে, সিগন্যালগুলি এবং স্লট প্রক্রিয়া কোনও জিইআইআই ইভেন্ট লুপ থেকে সম্পূর্ণ স্বতন্ত্র।

আপনি যখন কোনও ইভেন্ট প্রেরণ করেন, ইভেন্ট লুপটি আগে উপস্থিত সমস্ত ইভেন্ট প্রেরণ না করা পর্যন্ত কিছু সময়ের জন্য অপেক্ষা করতে হবে। এ কারণে ইভেন্ট বা সিগন্যাল প্রেরণের পরে কোডটি কার্যকর করা আলাদা। ইভেন্ট প্রেরণের নিম্নলিখিত কোডগুলি তাত্ক্ষণিকভাবে চালানো হবে। সংকেত এবং স্লট প্রক্রিয়া সহ এটি সংযোগের ধরণের উপর নির্ভর করে। সাধারণত এটি সমস্ত স্লটের পরে কার্যকর করা হবে। কিউটি :: কুইডড কানেকশন ব্যবহার করে, এটি ইভেন্টের মতোই অবিলম্বে কার্যকর করা হবে। Qt ডকুমেন্টেশনে সমস্ত সংযোগের প্রকারগুলি পরীক্ষা করুন ।


এই বাক্যটি আমাকে কিউটি সিগন্যাল-স্লট এবং ইভেন্টগুলির মধ্যে When you send an event, it must wait for time when event loop dispatch all events that came earlier. Because of this, execution of the cod after sending event or signal is different
পৃথকতার

7

একটি নিবন্ধ রয়েছে যা ইভেন্ট প্রসেসিংয়ে কিছু বিশদ আলোচনা করে: http://www.packtpub.com/article/events-and-signals

এটি এখানে ইভেন্ট এবং সিগন্যালের মধ্যে পার্থক্য নিয়ে আলোচনা করেছে:

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

এটি এটি সম্পর্কে কথা বলার একটি সাধারণ উপায় বলে মনে হয়, যেমন গৃহীত উত্তরটি একই বাক্যাংশগুলির কয়েকটি ব্যবহার করে।


দ্রষ্টব্য, দয়া করে কুবা ওবারের এই উত্তরের নীচে সহায়ক মন্তব্যগুলি দেখুন, যা আমাকে কিছুটা সরল হতে পারে কিনা তা অবাক করে দেয়।


আমি দেখতে পাচ্ছি না যে তারা কীভাবে একই জিনিসটি সম্পাদন করতে ব্যবহৃত দুটি প্রক্রিয়া হবে - আমি মনে করি এটি একটি অকেজো সাধারণকরণ যা কাউকেই সহায়তা করে না।
আনস্ল্যান্ডার মনিকা 20 'এ 12'16

4
@ কুবা ওবার এটি নিম্ন-স্তরের বিবরণ এড়াতে সহায়তা করে না। আপনি কি বলবেন পাইথন সহায়ক নয় কারণ আপনি মেশিন কোডে একই জিনিস লিখতে পারেন? :)
এরিক

4
আমি বলছি যে উদ্ধৃতিটির প্রথম বাক্যটি এতদূর অকেজো হিসাবে সাধারণীকরণ করছে। প্রযুক্তিগতভাবে এটি ভুল নয়, তবে কেবলমাত্র আপনি যদি চান, তবে সিগন্যাল-স্লট প্রক্রিয়াটি কী করে তা সম্পাদন করতে ইভেন্ট পাসিং এবং এর বিপরীত ব্যবহার করতে পারতেন। এটা খুব কষ্টকর হবে। সুতরাং, না, সিগন্যাল-স্লটগুলি ইভেন্টের মতো নয় , তারা একই জিনিসটি সম্পাদন করে না এবং উভয়টিই বিদ্যমান যেটি Qt এর সাফল্যের জন্য গুরুত্বপূর্ণ । উদ্ধৃত বোতামের উদাহরণটি সিগন্যাল-স্লট সিস্টেমের সাধারণ কার্যকারিতাটিকে সম্পূর্ণ উপেক্ষা করে।
আনস্ল্যান্ডার মনিকা

4
"ইভেন্ট এবং সংকেত দুটি UI উইজেট / নিয়ন্ত্রণের সংকীর্ণ সুযোগের মধ্যে একই জিনিসটি সম্পাদন করতে ব্যবহৃত দুটি সমান্তরাল প্রক্রিয়া " " সাহসী অংশটি সমালোচিতভাবে অনুপস্থিত এবং উদ্ধৃতিটিকে অসহায় করে তুলেছে। তারপরেও, কেউ প্রশ্ন করতে পারে যে "একই জিনিস" সত্যিই কতটা সম্পন্ন হয়েছে: সংকেতগুলি আপনাকে উইজেটে কোনও ইভেন্ট ফিল্টার ইনস্টল না করে ইভেন্টগুলিতে ক্লিক করার প্রতিক্রিয়া করতে দেয় (বা উইজেট থেকে প্রাপ্ত)। সিগন্যাল ছাড়াই এটি করা অনেক বেশি জটিল এবং ক্লায়েন্ট কোডটিকে শক্তভাবে নিয়ন্ত্রণে রাখতে দম্পতিরা। এটা খারাপ নকশা।
আনস্ল্যান্ডার মনিকা

4
ইভেন্টগুলি একটি সর্বব্যাপী ধারণা । কিউটিতে বিশেষ বাস্তবায়ন ডেটা স্ট্রাকচারগুলিতে পাস করার সাথে সাথে এগুলিকে দৃ concrete ়ভাবে সেট করে event। সিগন্যাল ও স্লট, হয় মূর্তভাবে , পদ্ধতি, যখন সংযোগ প্রক্রিয়া একটি ডাটা স্ট্রাকচার যেমন সংযুক্ত তালিকাভুক্ত এক বা একাধিক স্লট ডাকা সংকেত দেয়। আমি আশা করি আপনি দেখতে পাচ্ছেন যে সিগন্যাল / স্লটগুলির সাথে কিছু "সাবসেট" বা ইভেন্টগুলির "বৈকল্পিক" হিসাবে কথা বলা বাজে কথা। তারা সত্যিই ভিন্ন জিনিস যে ঘটতে কিছু উইজেট প্রেক্ষাপটে অনুরূপ প্রান্ত ব্যবহার করা। এটাই. আপনি যত বেশি সাধারণীকরণ করবেন ততই আপনি আইএমএইচও হয়ে উঠবেন helpful
আনস্ল্যান্ডার মনিকা

5

টিএল; ডিআর: সংকেত এবং স্লটগুলি পরোক্ষ পদ্ধতি কল। ইভেন্টগুলি ডেটা স্ট্রাকচার। সুতরাং তারা বেশ ভিন্ন প্রাণী।

কেবল তখনই যখন তারা একত্রিত হয় যখন থ্রেড সীমানা জুড়ে স্লট কল করা হয়। স্লট কল আর্গুমেন্ট একটি ডেটা স্ট্রাকচারে প্যাক আপ হয়ে থাকে এবং থ্রেডের ইভেন্টের সারিটিতে ইভেন্ট হিসাবে প্রেরণ হয়। প্রাপ্ত থ্রেডে, QObject::eventপদ্ধতিটি আর্গুমেন্টগুলি প্যাক করে, কলটি কার্যকর করে এবং সম্ভবত এটি যদি কোনও ব্লকিং সংযোগ থাকে তবে ফলাফলটি ফিরিয়ে দেয়।

আমরা যদি বিস্মৃতিতে সাধারণীকরণ করতে ইচ্ছুক হই, তবে কেউ ঘটনাটিকে লক্ষ্য অবজেক্টের eventপদ্ধতিটি আহ্বানের উপায় হিসাবে ভাবতে পারে । এটি কোনও ফ্যাশনের পরেও পরোক্ষ পদ্ধতির কল but তবে এটি সত্য বিবৃতি না হলেও, এটি এটি সম্পর্কে চিন্তাভাবনার সহায়ক উপায় বলে আমি মনে করি না।


2

ইভেন্টগুলি (ব্যবহারকারী / ব্যবহারকারী ইন্টারঅ্যাকশনের সাধারণ অর্থে) সাধারণত Qt এ সংকেত / স্লট সহ পরিচালনা করা হয় তবে সংকেত / স্লট প্রচুর পরিমাণে অন্যান্য কাজ করতে পারে।

কিউভেন্ট এবং এর সাবক্লাসগুলি আপনার কোডের সাথে যোগাযোগের জন্য ফ্রেমওয়ার্কের জন্য মূলত কেবলমাত্র কিছুটা মানযুক্ত ডেটা প্যাকেজ। আপনি যদি কোনও উপায়ে মাউসের প্রতি মনোযোগ দিতে চান তবে আপনাকে কেবল কিউমাউসএভেন্ট এপিআইটি দেখতে হবে এবং লাইব্রেরি ডিজাইনারদের প্রতিবার চাকাটি পুনরায় উদ্ভাবন করতে হবে না যখন মাউসের কোনও কোনও কোণে কী করেছে তা নির্ধারণ করতে হবে Qt API।

এটি সত্য যে আপনি যদি কোনও ধরণের ইভেন্টের (আবার সাধারণ ক্ষেত্রে) অপেক্ষা করতে থাকেন তবে আপনার স্লট প্রায় অবশ্যই একটি আর্গুমেন্ট হিসাবে একটি QEvent সাবক্লাস গ্রহণ করবে।

যা বলা হয়েছিল, সংকেত এবং স্লট অবশ্যই কিউভেেন্টস ছাড়াই ব্যবহার করা যেতে পারে, যদিও আপনি দেখতে পাবেন যে একটি সংকেত সক্রিয় করার জন্য মূল উত্সাহটি প্রায়শই একরকম ব্যবহারকারীর ইন্টারঅ্যাকশন বা অন্যান্য অ্যাসিনক্রোনাস কার্যকলাপ হতে পারে। কখনও কখনও, তবে, আপনার কোড ঠিক এমন একটি জায়গায় পৌঁছে যাবে যেখানে কোনও নির্দিষ্ট সিগন্যাল ফায়ার করা সঠিক কাজ হবে। উদাহরণস্বরূপ, দীর্ঘ প্রক্রিয়া চলাকালীন একটি অগ্রগতি বারের সাথে সংযুক্ত সিগন্যাল থেকে গুলি চালানো সেই বিন্দু পর্যন্ত কোনও QEvent জড়িত না।


4
"ইভেন্টগুলি সাধারণভাবে Qt এ সংকেত / স্লট সহ পরিচালনা করা হয়" - আসলে না ... কিউভেন্ট অবজেক্টগুলি সর্বদা ওভারলোডেড ভার্চুয়ালগুলির মধ্য দিয়ে যায়! উদাহরণস্বরূপ, কিউবিজেটে কোনও সংকেত "কীডাউন" নেই - পরিবর্তে, কীডাউন একটি ভার্চুয়াল ফাংশন।
স্টেফান মনোভ

স্টেফানের সাথে সম্মত হন, আসলে Qt- র একটি বিভ্রান্তিকর টুকরো
হ্যারাল্ড শাইরিখ

4
@ স্টেফান: আমি যুক্তি দেব যে যথেষ্ট পরিমাণ কিউটি অ্যাপ্লিকেশন কীডাউনকে ওভাররাইড করে (এবং এর পরিবর্তে বেশিরভাগই QAbstractButton :: ক্লিক করা এবং QLineEdit :: editFinished এর মতো সংকেত ব্যবহার করে) "সাধারণত" ন্যায্যতা প্রমাণ করার জন্য। আমি অবশ্যই আগে কীবোর্ড ইনপুট স্ন্যাগড করেছি, তবে ইভেন্টগুলি পরিচালনা করার এটি সাধারণ পদ্ধতি নয়।
জেকেরিয়ান

আপনার সম্পাদনার পরে ("ইভেন্ট" বলতে আপনার অর্থ কী তা বোঝানো), আপনার পোস্টটি এখন সঠিক। যদিও এরকম শব্দ পুনরায় ব্যবহার করা থেকে বিরত থাকি। সংকেতগুলিকে "ইভেন্টের এক ধরণের" না বলে জিনিসগুলি যথেষ্ট কচি হয়।
স্টিফান মনোভ

2

লেও উই খেংয়ের 'ইভেন্ট প্রসেসিং' পড়ার সময় আমি এই প্রশ্নটি পেয়েছি । এটি আরও বলে:

এখানে চিত্র বর্ণনা লিখুন

জেসমিন ব্ল্যানচেট বলেছেন:

আপনি স্ট্যান্ডার্ড ফাংশন কল, বা সিগন্যাল এবং স্লটগুলির চেয়ে ইভেন্টগুলি কেন ব্যবহার করবেন তার মূল কারণ হ'ল ইভেন্টগুলি সিঙ্ক্রোনসিভ এবং অ্যাসিনক্রোনালি উভয়ই ব্যবহার করা যেতে পারে (আপনি সেন্ডইভেন্ট () বা পোস্ট-এজেন্টস ()) কল করেন, যেখানে কোনও ফাংশন কল করা বা প্রার্থনা করা হয় তার উপর নির্ভর করে একটি স্লট সর্বদা সমকালীন হয়। ইভেন্টগুলির আর একটি সুবিধা হ'ল এগুলি ফিল্টার করা যায়।


1

আরেকটি ছোট ছোট বাস্তববাদী বিবেচনা: সংকেত নির্গমন বা গ্রহণের জন্য উত্তরাধিকার সূত্রে প্রয়োজনীয়তা রয়েছে QObjectযেখানে কোনও উত্তরাধিকারের কোনও অবজেক্ট কোনও ইভেন্ট পোস্ট বা পাঠাতে পারে (যেহেতু আপনি প্রার্থনা করছেন QCoreApplication.sendEvent()বা postEvent()) এটি সাধারণত কোনও সমস্যা নয় তবে: পিকিউটি অদ্ভুতভাবে QObjectপ্রথম সুপার বর্গ হতে হবে, এবং আপনি কেবলমাত্র সিগন্যাল প্রেরণে সক্ষম হয়ে নিজের উত্তরাধিকারের আদেশটি পুনর্বিন্যস্ত করতে চান না))


-1

আমার মতে ঘটনাগুলি সম্পূর্ণ অপ্রয়োজনীয় এবং তা ফেলে দেওয়া যেতে পারে। সংকেতগুলি ইভেন্ট বা ইভেন্টগুলির দ্বারা সংকেতগুলির দ্বারা প্রতিস্থাপন করা যায়নি এমন কোনও কারণ নেই, কেবলমাত্র Qt যেমনটি ইতিমধ্যে সেট আপ করা আছে। সারিবদ্ধ সংকেতগুলি ইভেন্ট দ্বারা মোড়ানো হয় এবং ইভেন্টগুলি সম্ভবত সংকেত দ্বারা মোড়ানো হতে পারে, উদাহরণস্বরূপ:

connect(this, &MyItem::mouseMove, [this](QMouseEvent*){});

(তবে আর না) mouseMoveEvent()পাওয়া সুবিধামতনের ফাংশনটি প্রতিস্থাপন করবে এবং এমন কোনও সংকেত হ্যান্ডেল করবে যে কোনও দৃশ্যের পরিচালক তাকে আইটেমটির জন্য নির্গত করবে। কিছু বাইরের সত্তার দ্বারা আইটেমের পক্ষে সিগন্যাল নির্গত হওয়া বিষয়টি গুরুত্বহীন এবং Qt উপাদানগুলির বিশ্বে বেশিরভাগ ক্ষেত্রে ঘটে, যদিও এটি অনুমিত নয় যদিও (Qt উপাদানগুলি প্রায়শই এই নিয়মকে অবরুদ্ধ করে)। তবে কিউটি হ'ল বহুবিধ ডিজাইনের সিদ্ধান্তের একত্রিত এবং পুরানো কোড ভাঙার ভয়ে পাথর ফেলে দেওয়া (যা প্রায়শই যথেষ্ট হয়)।QWidgetQQuickItemmouseMove


ইভেন্টগুলি QObjectযখন প্রয়োজন হয় তখন পিতা-মাতার চিত্তবিনোদন প্রচার করার সুবিধা রয়েছে । সিগন্যাল / স্লট সংযোগগুলি কোনও নির্দিষ্ট শর্ত পূরণ করার পরে প্রত্যক্ষ বা পরোক্ষভাবে কোনও ফাংশন কল করার প্রতিশ্রুতি। সংকেত এবং স্লটগুলির সাথে কোনও সম্পর্কিত হ্যান্ডলিং শ্রেণিবিন্যাস নেই।
অজ্ঞাতনামা

আপনি সংকেত সহ একই প্রচারের নিয়ম প্রয়োগ করতে পারেন। কোনও নিয়ম নেই। একটি নির্দিষ্ট সিগন্যাল অন্য বস্তুর (শিশু) পুনরায় প্রকাশ করা যাবে না। আপনি acceptedএকটি সিগন্যালে রেফারেন্স প্যারামিটার যুক্ত করতে পারেন এবং স্লটগুলি এটি পরিচালনা করে বা আপনার acceptedক্ষেত্র সহ রেফারেন্স প্যারামিটার হিসাবে কাঠামো থাকতে পারে । তবে কিউটি ডিজাইনের পছন্দগুলি তৈরি করেছে এবং সেগুলি এখন পাথরে সেট করা আছে।
ব্যবহারকারী 1095108

4
আপনি মূলত ইভেন্টগুলি পুনরায় প্রতিস্থাপন করছেন যদি আপনি এটির পরামর্শ মতো করেন।
ফ্যাবিও এ।

@ ফ্যাবিওএ এটাই ওপি-র প্রশ্নের মূল বিষয়। ইভেন্ট এবং সংকেতগুলি একে অপরের প্রতিস্থাপন করতে পারে / করতে পারে।
ব্যবহারকারী 1095108

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