Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT] сигналы и слоты


Автор: programming 28.5.2011, 15:13
Пытаюсь написать программу на qt с сигналами и слотами.
Что в ней неверно?
Код

#include <QtGui/QApplication>
#include <QLabel>


class news: public QObject {
    Q_OBJECT
public:
    void sendSig()
    {
        emit sendString("info");
    }

signals:
    void sendString(QString);
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    news g();
    QLabel lbl("hello");
    lbl.show();
    QObject::connect(&g, SIGNAL(sendString()), &lbl, SLOT(setText(QString)));

    return a.exec();
}



Выходит ошибка: 
Код

нет подходящей функции для вызова ‘QObject::connect(news(*)(), const char*, QLabel*, const char*)


Автор: Modul 28.5.2011, 18:03
Сигнал у Вас самопроизвольно не пошлется.

Код

#include <QtGui>
#include <QApplication>
#include <QLabel>


class news: public QObject 
{
    Q_OBJECT


public slots:
    void sendSig()
    {
        emit sendString("info");
    }

signals:
    void sendString(QString);        
        

};


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

    news g;
    QLabel lbl("hello");     
    QPushButton pushButton("Run");
    // нажали кнопку
    QObject::connect(&pushButton, SIGNAL(clicked() ), &g, SLOT(sendSig()));        
    QObject::connect(&g, SIGNAL(sendString(QString)), &lbl, SLOT(setText(QString)));

    QVBoxLayout verLayout; 
    verLayout.addWidget(&lbl); 
    verLayout.addWidget(&pushButton);
    
    wgt.setLayout(&verLayout);
    wgt.show();


    return app.exec(); 
}

Автор: math64 28.5.2011, 19:02
В данном случае
Код

    news g();

воспринято компилятором как объявление функции g() без аргументов, возвращающую news.
Нужно объявить news g; или явно объявить конструктор по умолчанию news::news();

Автор: programming 28.5.2011, 19:18
Да, ошибка изменилась.
Код

Undefined reference to `vtable for news`

На эту ошибку он указывает в конструкторе и деструкторе.

Автор: math64 28.5.2011, 19:40
Объявление класса производного  от QObject с новыми слотами/сигналами нужно делать в заголовочном файле, который нужно добавлять в проект. Тогда при компиляции будет создаваться файл moc_*.cpp

Автор: programming 28.5.2011, 19:45
Спасибо.
Помогло.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)