Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: tsdaemon от Февраль 09, 2010, 21:23



Название: ошибка undefined reference to `slot'
Отправлено: tsdaemon от Февраль 09, 2010, 21:23
Имею такое описание класса:

Код:
class CalcDialog : public QDialog {
    Q_OBJECT;
    public:
        CalcDialog(QWidget *parent = 0);
    signals:
        void numPush(const int num);
        void actionPush(act c);
        void pointPush();
        void resPush();
        void sqrPush();
    private slots:
        void calc();
        void editLine(int i);
        void editLine(float f);
        void setAction(act c);

    private:
        QLineEdit *editStr;
        QPushButton *buttonNums[10];
        ActionButton *buttonPlus;
        ActionButton *buttonMinus;
        ActionButton *buttonMul;
        ActionButton *buttonDiv;
        ActionButton *buttonSquare;
        QPushButton *buttonRes;
        QPushButton *buttonPoint;
};

и реализацию:

Код:
CalcDialog::CalcDialog(QWidget *parent) : QDialog(parent) {
    editStr = new QLineEdit;

    for(int i = 0;i<10;i++) buttonNums[i] = new QPushButton(QString::number(i));

    buttonPoint = new QPushButton(".");
    buttonPlus = new ActionButton(ADD,"+");
    buttonMinus = new ActionButton(SUB,"-");
    buttonMul = new ActionButton(MUL,"*");
    buttonDiv = new ActionButton(DIV,"/");
    buttonSquare = new ActionButton(SQR,"X2");
    buttonRes = new QPushButton("=");

    for(int i = 0;i<10;i++) connect(buttonNums[i],SIGNAL(clicked()),this,SLOT(editLine(i)));
    connect(buttonPoint,SIGNAL(clicked()),this,SLOT(editLine(float f)));
    connect(buttonPlus,SIGNAL(clicked()),this,SLOT(setAction(buttonPlus->getAction())));
    connect(buttonMinus,SIGNAL(clicked()),this,SLOT(setAction(buttonMinus->getAction())));
    connect(buttonMul,SIGNAL(clicked()),this,SLOT(setAction(buttonMul->getAction())));
    connect(buttonDiv,SIGNAL(clicked()),this,SLOT(setAction(buttonDiv->getAction())));
    connect(buttonSquare,SIGNAL(clicked()),this,SLOT(setAction(buttonSquare->getAction())));
    connect(buttonRes,SIGNAL(clicked()),this,SLOT(calc()));
}


На что получаю при сборке:
Код:
C:/PROJECTS/Qt/WindowApplication/calculus/debug/moc_calc_dialog.cpp:85: undefined reference to `CalcDialog::editLine(int)'
C:/PROJECTS/Qt/WindowApplication/calculus/debug/moc_calc_dialog.cpp:86: undefined reference to `CalcDialog::editLine(float)'
C:/PROJECTS/Qt/WindowApplication/calculus/debug/moc_calc_dialog.cpp:87: undefined reference to `CalcDialog::setAction(act)'
C:/PROJECTS/Qt/WindowApplication/calculus/debug/moc_calc_dialog.cpp:84: undefined reference to `CalcDialog::calc()'

в мок файлике примерно такое:
Код:
int CalcDialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QDialog::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    if (_c == QMetaObject::InvokeMetaMethod) {
        switch (_id) {
        case 0: numPush((*reinterpret_cast< const int(*)>(_a[1]))); break;
        case 1: actionPush((*reinterpret_cast< act(*)>(_a[1]))); break;
        case 2: pointPush(); break;
        case 3: resPush(); break;
        case 4: sqrPush(); break;
        case 5: calc(); break;
        case 6: editLine((*reinterpret_cast< int(*)>(_a[1]))); break;
        case 7: editLine((*reinterpret_cast< float(*)>(_a[1]))); break;
        case 8: setAction((*reinterpret_cast< act(*)>(_a[1]))); break;
        default: ;
        }
        _id -= 9;
    }
    return _id;
}

Делал в QtCreator'e


Название: Re: ошибка undefined reference to `slot'
Отправлено: shirushizo от Февраль 09, 2010, 21:41
1. Когда соединяешь сигнал со слотом указываешь тип аргумента, а не сам фактический аргумент.
2. В слоте не может быть больше аргументов, чем в вызывающем его сигнале.

QObject::connect(but,SIGANL(clicked()),this,SLOT(onClick()));