เชื่อมต่อสัญญาณวัตถุทั้งหมดเข้ากับช่องเดียว

ดูไปรอบๆ บ้างแล้ว และดูเหมือนว่าผู้คนจะมีปัญหาที่คล้ายกัน แต่มีสัญญาณหลายรายการจากแหล่งต่างๆ เป็นต้น สถานการณ์ของฉันคือฉันมีสิ่งที่ส่งสัญญาณว่าสำเร็จ ล้มเหลว หรือถูกยกเลิก สัญญาณเหล่านี้จะถูกส่งผ่านไปยังคลาสอื่นและไม่ได้เชื่อมต่อกับสล็อต เป็นเพียงสัญญาณเท่านั้น ตอนนี้ฉันต้องการแก้ไขเพื่อให้ไม่ว่าสัญญาณใดที่วัตถุจะส่ง (ล้มเหลว สำเร็จ ยกเลิก) ช่องจะถูกเรียกที่จะลบวัตถุ กล่าวโดยสรุป ฉันต้องการวิธีเชื่อมต่อทุกสัญญาณของวัตถุเข้ากับช่อง

ต้องการทำอะไรแบบนี้:

connect(myObject, allSignals, this, handleObjectDone());

void handleObjectDone() {
    myObject->deleteLater();
}

มีวิธีการทำเช่นนี้หรือไม่? หรือฉันควรจะส่งสัญญาณสองครั้งทุกครั้งที่มันทำอะไรบางอย่าง เช่น emit readyToBeDeleted() และ emit succeded()

ขอบคุณ!


person chikuba    schedule 11.04.2012    source แหล่งที่มา
comment
คุณต้องการลบวัตถุที่ส่งสัญญาณออกจากช่องที่เชื่อมต่ออยู่หรือไม่?   -  person Kunal    schedule 11.04.2012
comment
ฉันต้องการรับสัญญาณจากวัตถุเพื่อให้สามารถรู้ว่าเมื่อใดควรลบออก   -  person chikuba    schedule 11.04.2012
comment
คุณใช้ DeleteLater() ไม่ได้เหรอ?   -  person Kunal    schedule 11.04.2012
comment
DeleteLater ลบบางสิ่งที่ส่วนท้ายของขอบเขต ฉันต้องรอจนกว่าคำขอเหล่านี้จะพร้อมก่อนจึงจะสามารถลบออกโดยใช้การลบในภายหลัง   -  person chikuba    schedule 11.04.2012


คำตอบ (2)


การแยกความกังวลใดๆ เกี่ยวกับการเชื่อมต่อสัญญาณทั้งหมดในออบเจ็กต์หนึ่งไปยังช่องเดียวในออบเจ็กต์อื่นนั้นจริง ๆ แล้วเป็นสิ่งที่ควรทำ ด้านล่างนี้คือฟังก์ชันที่ทำเช่นนั้น ควบคู่ไปกับการทดสอบหน่วยเพื่อตรวจสอบว่าใช้งานได้หรือไม่

หากคุณดู stdout ขณะที่คุณรันสิ่งนี้ คุณจะเห็นว่ามันพิมพ์การเชื่อมต่อทั้งหมดที่มันทำออกมา เมื่อทำงาน การคลิกที่ QLineEdit จะทำให้ QLineEdit ส่งสัญญาณ ซึ่ง (แน่นอน) จะทำให้ช่อง QApplication::quit() ถูกเรียก ดังนั้นแอปพลิเคชันจะออก

#include <stdio.h>
#include <QApplication>
#include <QLineEdit>
#include <QMetaMethod>
#include <QMetaObject>

void ConnectAllSignalsToSlot(QObject * sourceObject, QObject * targetObject, const char * slotName)
{
   const QMetaObject * mo = sourceObject->metaObject();
   if (mo)
   {
      int numMethods = mo->methodCount();
      int firstMethod = mo->methodOffset();  // set to 0 instead if you want to connect signals from superclasses too
      for (int i=firstMethod; i<numMethods; i++)
      {
         QMetaMethod mm = mo->method(i);
         if (mm.methodType() == QMetaMethod::Signal)
         {
            QString signalString = QString("2") + mm.signature();
            printf("Connecting up signal [%s] on object %p to slot [%s] on object %p\n", signalString.toUtf8().constData(), sourceObject, slotName, targetObject);  // just so we can see what it's doing
            QObject::connect(sourceObject, signalString.toUtf8().constData(), targetObject, slotName);
         }
      }
   }
   else printf("Error, sourceObject has no QMetaObject????\n");
}

int main(int argc, char ** argv)
{
   QApplication app(argc, argv);

   QWidget * testSource = new QLineEdit;
   testSource->show();

   ConnectAllSignalsToSlot(testSource, &app, SLOT(quit()));

   return app.exec();
}
person Jeremy Friesner    schedule 01.05.2013
comment
ประเด็นน่าสงสัย: ทำไมเราต้องเติม 2 ไว้ข้างหน้าลายเซ็นสัญญาณ? (หรืออีกนัยหนึ่ง: คุณช่วยอธิบายบรรทัด: QString signalString = QString("2") + mm.signature(); ได้ไหม) - person pestophagous; 18.11.2020
comment
อ่า ฉันเห็นแล้ว 2 คือการจำลองแมโคร # define SIGNAL(a) "2"#a github.com/qt/qtbase/blob/ 34304e31008/src/corelib/kernel/ - person pestophagous; 18.11.2020

คุณสามารถเชื่อมต่อสัญญาณจำนวนเท่าใดก็ได้กับช่องจำนวนเท่าใดก็ได้ (รวมถึงสัญญาณอื่นๆ) การเชื่อมต่อสัญญาณเข้ากับช่องสองช่องเพื่อจุดประสงค์นี้เหมาะสมอย่างยิ่ง สล็อตจะถูกเรียกตามลำดับที่เชื่อมต่อ การส่งสัญญาณสองสัญญาณติดต่อกันก็สมเหตุสมผลเช่นกัน แน่นอนว่า readyToBeDeleted() ควรถูกปล่อยออกมาหลังจากประสบความสำเร็จ () เพื่อไม่ให้วัตถุถูกลบก่อนที่จะส่งสัญญาณผลลัพธ์

เว้นแต่ฉันจะเข้าใจคุณผิด มันง่ายมาก

person Anthony    schedule 11.04.2012
comment
จากสิ่งที่ฉันอ่านมา ลำดับการเรียกสล็อตนั้นเป็นแบบสุ่ม ฉันแค่อยากจะแก้ปัญหานี้ในลักษณะที่ฉันไม่ต้องเชื่อมต่อทุกสัญญาณสองครั้ง - person chikuba; 11.04.2012
comment
@chikuba ไม่ ตามเอกสาร หากมีการเชื่อมต่อหลายช่อง สำหรับสัญญาณหนึ่ง ช่องจะถูกดำเนินการทีละช่องตามลำดับที่เชื่อมต่อเมื่อสัญญาณถูกปล่อยออกมา - person Anthony; 11.04.2012
comment
แต่ฉันจะไม่เชื่อมต่อหลายช่องเข้ากับสัญญาณเดียว ฉันกำลังหาวิธีเชื่อมต่อทุกสัญญาณจากวัตถุหนึ่งไปยังช่องเฉพาะหนึ่งช่อง - person chikuba; 11.04.2012
comment
@chikuba คุณไม่สามารถ อัตโนมัติ เชื่อมต่อทุกสัญญาณจากวัตถุไปยังช่องที่กำหนด คุณต้องทำด้วยตนเอง ทีละอย่าง ตามลำดับที่คุณต้องการให้ไล่ออก ฉันไม่เข้าใจว่าปัญหาคืออะไร - person Anthony; 11.04.2012
comment
เอกสารระบุ doc.trolltech.com/4.5/signalsandslots.html#signals หากหลายช่องเชื่อมต่อกับสัญญาณเดียว ช่องต่างๆ จะถูกดำเนินการทีละช่องตามลำดับที่กำหนดเองเมื่อสัญญาณถูกปล่อยออกมา พวกเขาต้องเปลี่ยนแปลงสิ่งนี้ทันที :) - person chikuba; 12.04.2012