2011-02-07 6 views
11

मैं थोड़ा चैट मैसेंजर प्रोग्राम बना रहा हूं, जिसके लिए उपयोगकर्ता शामिल हो गए चैट चैनलों की एक सूची की आवश्यकता है। ग्राफिकल रूप से इस सूची का प्रतिनिधित्व करने के लिए, मैंने QPushButtons की एक सूची बनाई है, जो सभी एक अलग चैनल का प्रतिनिधित्व करते हैं। ये बटन निम्नलिखित विधि के साथ बना रहे हैं, और कहा कि जहां मेरी समस्या किक में है: (। ActivePanelContents एक QWidget उस सूची को धारण करता है)QT में स्लॉट विधियों के चर को कैसे पास किया जाए?

void Messenger::addToActivePanels(std::string& channel) 
{ 
    activePanelsContents = this->findChild<QWidget *>(QString("activePanelsContents")); 
    pushButton = new QPushButton(activePanelsContents); 
    pushButton->setObjectName("pushButton"); 
    pushButton->setGeometry(QRect(0, 0, 60, 60)); 
    pushButton->setText(""); 
    pushButton->setToolTip(QString(channel.c_str())); 
    pushButton->setCheckable(true); 
    pushButton->setChecked(false); 
    connect(pushButton, SIGNAL(clicked()), this, SLOT(switchTab(channel))); 
} 

बात यह है कि प्रत्येक बटन switchTab(string& tabname) विधि बुलाना चाहिए जब क्लिक किया गया, विशिष्ट चैनल के नाम चर के रूप में। यह कार्यान्वयन हालांकि काम नहीं करता है, और मैं यह पता लगाने में सक्षम नहीं हूं कि इसे ठीक से कैसे किया जाए।

उत्तर

0

आप अपने switchTab स्लॉट को कोई तर्क नहीं लेने का प्रयास कर सकते हैं और संकेत भेजने वाले ऑब्जेक्ट को प्राप्त करने के लिए QObject::sender का उपयोग कर सकते हैं।

Messenger::switchTab() 
{ 
    QObject* sender = this->sender(); 
    QPushButton* button = qobject_cast<QPushButton*>(sender); 
    if(button) 
    { 
    // Do stuff... 
    } 
} 
+0

चेतावनी से सावधान रहें QObject :: इस प्रयोग करने से पहले आपके कोड में –

+0

सुनिश्चित नहीं है कि आपकी पोस्ट का उपयोग क्यों किया गया था, लेकिन वैसे भी धन्यवाद। आपने बहुत मदद की – parsecer

1

प्रेषक विधि का उपयोग न करें जबतक कि आपको बिल्कुल नहीं करना है। यह फ़ंक्शन को सीधे स्लॉट के रूप में उपयोग करने के लिए जोड़ता है (सीधे नहीं कहा जा सकता है)। फ़ंक्शन को स्ट्रिंग स्वीकार करने के व्यवहार को बनाए रखें और केवल एक तंत्र बनाएं जिससे आप इसे कॉल कर सकें।

QSignalMapper के उपयोग का लाभ उठाने के लिए आपको एक अन्य विधि मिल सकती है। यह वस्तुओं को मूल्यों के लिए मानचित्रित करेगा और उपयुक्त हस्ताक्षर के संकेतों को पुन: उत्पन्न करेगा।

1

मैं "रिले" वस्तुओं के साथ यह करना होगा:

TabSwitchRelay बनाएं जो एक यह निर्माता के साथ QObject के उप-वर्ग है:

TabSwitchRelay::TabSwitchRelay(QObject *parent, Messanger * m, const QString & c) 
: QObject(parent), m_messanger(m), m_channel(c) 
{ 
} 

यह भी एक स्लॉट clicked() है:

void TabSwitchRelay::clicked() 
{ 
    m_messager->switchTab(m_channel); 
} 

अब अपने कोड में लाइन को प्रतिस्थापित करें जो इससे जुड़ता है:

TabSwitchRelay * tabRelay = new TabSwitchRelay(pushButton, this, channel); 
connect(pushButton, SIGNAL(clicked()), tabRelay, SLOT(clicked())); 

यह परीक्षण नहीं किया गया है लेकिन आपको मूलभूत विचार मिलता है।

7

तारों और पूर्णांक के लिए, आप QSignalMapper का उपयोग कर सकते हैं। अपने Messenger वर्ग में, आप एक QSignalMapper mapper वस्तु जोड़ना होगा, और अपने समारोह दिखाई देगा:

void Messenger::addToActivePanels(std::string& channel) 
{ 
    activePanelsContents = this->findChild<QWidget *>(QString("activePanelsContents")); 
    pushButton = new QPushButton(activePanelsContents); 
    // ... 
    connect(pushButton, SIGNAL(clicked()), &mapper, SLOT(map())); 
    mapper.setMapping(pushButton, QString(channel.c_str())); 
} 

और के बाद आप अपने सक्रिय पैनलों के लिए सभी चैनलों को शामिल किया है, तो आप

connect(&mapper, SIGNAL(mapped(const QString &)), this, SLOT(switchTab(const QString &))); 
+0

यह काम नहीं कर रहा है ... switchTab() को कभी भी कॉल नहीं किया जाता है, हालांकि किसी भी त्रुटि को कहीं भी नहीं दिया जाता है। – Neko

+0

क्या 'स्विचटैब()' 'const const QString 'लेता है? यदि ऐसा नहीं होता है, तो आपको इसे बदलने की ज़रूरत है ताकि ऐसा हो। क्यूटी आपको सिग्नल और स्लॉट के माध्यम से 'std :: string' (या, सामान्य रूप से, 'qRegisterMetaType' के साथ पंजीकृत नहीं है) को पारित करने की अनुमति नहीं देता है। 'SIGNAL' और' SLOT' के अंदर टाइपो को रनटाइम तक नहीं पता चला है, क्योंकि वे मैक्रोज़ अपने तर्कों को तारों में बदल देते हैं। संभावना है कि क्यूटी कंसोल को एक त्रुटि संदेश प्रिंट कर रहा है जब यह 'स्विचटैब (कॉन्स क्यूस्ट्रिंग और)' से कनेक्शन बनाने का प्रयास करता है। –

3

उपयोग QSignalMapper करने के लिए कॉल चर पारित करें;

 QSignalMapper* signalMapper = new QSignalMapper (this) ; 
     QPushButton *button = new QPushButton(); 


     signalMapper -> setMapping (button, <data>) ; 
     connect (signalMapper, SIGNAL(mapped(QString)), this, 
        SLOT(buttonClicked(QString))) ; 

स्लॉट i में।ई

void class::buttonClicked(QString data){ 

    //use data 
    // to get sender 
    QSignalMapper *temp = (QSignalMapper *)this->sender(); 
    QPushButton *btn = (QPushButton *)temp->mapping(data); 
    // use btn 

} 

आशा है कि मेरी ans अगर आप Qt5 उपयोग कर रहे हैं आप

+0

इस उत्तर के लिए धन्यवाद। मैं QTNetworkRequest के साथ QSignalMapper का उपयोग कर रहा था और मुझे नहीं पता था कि मुझे इस तरह के मामले में ऑब्जेक्ट प्राप्त करने के लिए मैपर-> मैपिंग (डेटा) का उपयोग करना था। मैं बस qobject_cast (प्रेषक) का उपयोग कर रहा था जो आपके पास कोई पैरामीटर नहीं होने पर ही काम करता है। – fayyazkl

0

मदद मिल सकती है, तो आप लैम्ब्डा के माध्यम से यह कर सकते हैं:

connect(sender, &Sender::valueChanged, [=](){ myMethod(5); }); 

void myMethod(int value) 
{ 
    // do stuff 
} 
संबंधित मुद्दे