2010-09-05 10 views
7

मुझे अपने क्यूटी कार्यक्रम में कनेक्टिंग बटन सिग्नल के साथ मेरे क्यूटी प्रोग्राम में कठिनाई हो रही है। MainWidget.hसी ++ क्यूटी सिग्नल और स्लॉट फायरिंग

#ifndef MAINWIDGET_H 
#define MAINWIDGET_H 

#include <QWidget> 

class MainWidget : public QWidget 
{ 
public: 
    MainWidget(); 

public slots: 
    void bAdvice_clicked(); 
    void bWeather_clicked(); 
    void bNextMeeting_clicked(); 
    void bQuit_clicked(); 
}; 

#endif // MAINWIDGET_H 

MainWidget.cpp

#include "MainWidget.h" 
#include <QMessageBox> 
#include <QPushButton> 
#include <QTextEdit> 
#include <QVBoxLayout> 

MainWidget::MainWidget() 
{ 
    QLayout *layout = new QVBoxLayout(); 
    this->setLayout(layout); 

    QTextEdit *message = new QTextEdit(); 
    layout->addWidget(message); 

    QPushButton *bAdvice = new QPushButton("Advice"); 
    connect(bAdvice, SIGNAL(clicked()), this, SLOT(bAdvice_clicked())); 
    layout->addWidget(bAdvice); 

    QPushButton *bWeather = new QPushButton("Weather"); 
    connect(bWeather, SIGNAL(clicked()), this, SLOT(bWeather_clicked())); 
    layout->addWidget(bWeather); 

    QPushButton *bNextMeeting = new QPushButton("Next Meeting"); 
    connect(bNextMeeting, SIGNAL(clicked()), this, SLOT(bNextMeeting_clicked())); 
    layout->addWidget(bNextMeeting); 

    QPushButton *bQuit = new QPushButton("Quit"); 
    connect(bQuit, SIGNAL(clicked()), this, SLOT(bQuit_clicked())); 
    layout->addWidget(bQuit); 
} 

void MainWidget::bAdvice_clicked() 
{ 
} 

void MainWidget::bWeather_clicked() 
{ 
} 

void MainWidget::bNextMeeting_clicked() 
{ 
    QMessageBox::information(this, "Next Meeting", "Today", QMessageBox::Ok); 
} 

void MainWidget::bQuit_clicked() 
{ 
    this->close(); 
} 

main.cpp

#include <QtGui/QApplication> 
#include "MainWidget.h" 

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

    MainWidget mainWidget; 
    mainWidget.show(); 

    return app.exec(); 
} 

कार्यक्रम आउटपुट निम्नलिखित:: मेरे कोड है

Starting C:\Users\Sameer\Documents\PartAQuestion2\debug\PartAQuestion2.exe... 
Object::connect: No such slot QWidget::bAdvice_clicked() in MainWidget.cpp:16 
Object::connect: No such slot QWidget::bWeather_clicked() in MainWidget.cpp:20 
Object::connect: No such slot QWidget::bNextMeeting_clicked() in MainWidget.cpp:24 
Object::connect: No such slot QWidget::bQuit_clicked() in MainWidget.cpp:28 

C:\Users\Sameer\Documents\PartAQuestion2\debug\PartAQuestion2.exe exited with code 0 

कोड सही लगता है, कोई संकलक चेतावनी नहीं। रनटाइम पर बस यह आउटपुट। लेकिन ऐसा लगता है कि मैंने सिग्नल और स्लॉट सही तरीके से लगाए।

उत्तर

13

को अपनी कक्षा में Q_OBJECT जोड़े, इस तरह:

class MainWidget : public QWidget 
{ 
    Q_OBJECT 

तुम भी MOC चलाने के लिए कुछ सहायक कोड उत्पन्न करने के लिए किया है। qmake स्वचालित रूप से आपके लिए करता है, लेकिन यदि आप इसे स्वयं संकलित करते हैं, तो आपको moc चलाने की आवश्यकता है।

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। लेकिन क्या आप कृपया अधिक विशिष्ट हो सकते हैं क्योंकि मैं इसके लिए बहुत नया हूं। मैंने खुले घुंघराले ब्रेसिज़ के तुरंत बाद Q_OBJECT जोड़ने के लिए अपना कोड बदल दिया है। अभी भी वही परिणाम। मैं क्यूटी निर्माता आईडीई का उपयोग कर रहा हूं। – c0d3L0g1c

+0

Q_OBJECT जोड़ने के बाद क्या होता है? आप अपना कोड कैसे संकलित कर रहे हैं? –

+0

मैंने खुले घुंघराले ब्रेसिज़ के तुरंत बाद Q_OBJECT जोड़ने के लिए अपना कोड बदल दिया है। अभी भी वही परिणाम। मैं क्यूटी निर्माता आईडीई का उपयोग कर रहा हूँ। – c0d3L0g1c

2

संपादित:

अपने कोड संकलित और सभी स्लॉट सही ढंग से कहा जाता था। यह केवल Q_OBJECT मैक्रो था जो गायब था।

+0

मैंने उली श्लाचटर को अंक दिए हैं, क्योंकि उन्होंने मुझे सही दिशा में इंगित किया था। योगदान के लिए सभी को धन्यवाद! – c0d3L0g1c

3

जब मैंने क्यूटी के साथ शुरुआत की, तो मुझे यह समस्या बहुत थी। जैसा कि मैंने देखा है कि आपके स्लॉट गलत हैं। आप संकेत (Qt Clicked Signal Docs) के लिए हस्ताक्षर को देखें, तो आपको लगता है कि तर्क सूची (bool clicked = false) है देखेंगे।

तरह से क्यूटी के संकेत & स्लॉट्स रन टाइम पर काम कनेक्ट करते हैं, है कि यह केवल संकेत और स्लॉट कनेक्ट करेगा वे ठीक उसी हस्ताक्षर किया है। यदि वे वास्तव में मेल नहीं खाते, कोई संबंध नहीं।

तो

MainWidget.h में

public slots: 
     void bAdvice_clicked(bool); 

MainWidget.cpp में

connect(bAdvice, SIGNAL(clicked(bool)), this, SLOT(bAdvice_clicked(bool))); 

चीजें आपके लिए काम करना शुरू कर देंगे।

+0

लेकिन मुझे यह काम मिलता है ** क्यूपश बटन ** बूल प्रकार पैरामीटर के बिना – Tracy