Russian Qt Forum

Qt => Вопросы новичков => Тема начата: sektor от Сентябрь 20, 2015, 20:51



Название: *РЕШЕНО* undefined reference
Отправлено: sektor от Сентябрь 20, 2015, 20:51
Добрый вечер всем. Начал изучать Qt с книжкой Qt 5.3 Макс Шлее. Остановился на калькуляторе  листинг 6.6 - 6.11. Ошибка  при компиляции. Не могу создать PushButton для Widget если я правильно выражаюсь.
calculator.h
Код:
#ifndef CALCULATOR_H
#define CALCULATOR_H

#pragma once

#include <QWidget>
#include <QStack>

class QLCDNumber;
class QPushButton;

class calculator : public QWidget
{
    Q_OBJECT

private:
    QLCDNumber*     m_plcd;
    QStack<QString> m_stk;
    QString         m_strDisplay;

public:
    calculator(QWidget *parent = 0);
    ~calculator();
    QPushButton* createButton(const QString& str);
    void         calculate (                    );

/*signals:
public slots:
    void slotButtonClicked();*/
};

#endif // CALCULATOR_H

calculator.cpp
Код:
#include "calculator.h"
#include <QLCDNumber>
#include <QGridLayout>
#include <QPushButton>
#include <QDebug>

calculator::calculator(QWidget *parent)
    : QWidget(parent)
{

    m_plcd = new QLCDNumber(12);
    m_plcd->setSegmentStyle(QLCDNumber::Flat);
    m_plcd->setMinimumSize(150, 50);

    QChar aButtons [4] [4] = {{'7', '8', '9', '/'},
                              {'4', '5', '6', '*'},
                              {'1', '2', '3', '-'},
                              {'0', '.', '=', '+'}
                             };
    
    QGridLayout* ptopLayout = new QGridLayout;
    ptopLayout->addWidget(m_plcd, 0, 0, 1, 4);

    ptopLayout->addWidget(createButton("CE"), 1, 3);

    for (int i=0; i<4; ++i){
        for(int j=0; j<4; ++j){
            ptopLayout->addWidget(createButton(aButtons[i][j]), i+2, j);
        }
    }
    setLayout(ptopLayout);
}

calculator::~calculator()
{

}

main.cpp
Код:
#include "calculator.h"
#include <QApplication>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    calculator Calculator;

    Calculator.setWindowTitle("Calculator");
    Calculator.resize(230,200);

    Calculator.show();

    return a.exec();
}

при компиляции выдает ошибку undefined reference to `calculator::createButton(QString const&)'
если вместо createButton применить new QPushButton все работает.
calculator.cpp

Код:
#include "calculator.h"
#include <QLCDNumber>
#include <QGridLayout>
#include <QPushButton>
#include <QDebug>

calculator::calculator(QWidget *parent)
    : QWidget(parent)
{
    m_plcd = new QLCDNumber(12);
    m_plcd->setSegmentStyle(QLCDNumber::Flat);
    m_plcd->setMinimumSize(150, 50);

    QChar aButtons [4] [4] = {{'7', '8', '9', '/'},
                              {'4', '5', '6', '*'},
                              {'1', '2', '3', '-'},
                              {'0', '.', '=', '+'}
                             };

    QGridLayout* ptopLayout = new QGridLayout;
    ptopLayout->addWidget(m_plcd, 0, 0, 1, 4);


    ptopLayout->addWidget( new QPushButton("CE"), 1, 3);

    for (int i=0; i<4; ++i){
        for(int j=0; j<4; ++j){
            ptopLayout->addWidget(new QPushButton(aButtons[i][j]), i+2, j);
        }
    }
    setLayout(ptopLayout);
}

calculator::~calculator()
{

}

Правильно ли это будет?


Название: Re: undefined reference
Отправлено: Alex Custov от Сентябрь 20, 2015, 21:36
В классе объявлен метод QPushButton* createButton(const QString& str), он используется в ptopLayout->addWidget(createButton(aButtons[j]), i+2, j), но реализации самого метода нигде нет.

Код
C++ (Qt)
QPushButton* calculator::createButton(const QString& str)
{
   return ... trololo ...;
}


Название: Re: undefined reference
Отправлено: sektor от Сентябрь 20, 2015, 21:48
Не совсем понял, можете подробнее
Код:
return ... trololo ...;


Название: Re: undefined reference
Отправлено: Alex Custov от Сентябрь 20, 2015, 22:09
Не совсем понял, можете подробнее
Код:
return ... trololo ...;

Как не трудно догадаться из названия метода, он должен создавать и возвращать объект QPushButton с заданным текстом на кнопке.


Название: Re: undefined reference
Отправлено: sektor от Сентябрь 20, 2015, 22:27
А как это сделать? помогите новичку ?


Название: Re: undefined reference
Отправлено: sektor от Сентябрь 20, 2015, 23:15
кроме этого ничего в голову не лезет
Код:
    QPushButton* createButton(const QString& str){
        QPushButton* button = new QPushButton(str);
        return button;
    }


Название: Re: undefined reference
Отправлено: Alex Custov от Сентябрь 21, 2015, 11:09
Как-то так

Код:
    QPushButton* calculator::createButton(const QString& str){
        QPushButton* button = new QPushButton(str);
        return button;
    }


И начини учить сперва C++, а Qt пока отложи на полгода.


Название: Re: undefined reference
Отправлено: sektor от Сентябрь 21, 2015, 21:11
Все решил проблему. Спасибо за помощь.