PDA

View Full Version : Issue with QObject::connect



fish_sticks
28th February 2012, 13:52
I'm trying to call a user-defined function while clicking a button.Here's my code and the error I'm getting

Here's my .h file


#include <QApplication>
#include <QPushButton>
#include <QGridLayout>
#include <QLCDNumber>
#include <QString>
#include <iostream>
#include <test.h>

int i;
QString str = "0";
int calc::appendone()
{
i = 1;
str.append("1");
return 0;
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget *window = new QWidget;
QPushButton *one = new QPushButton("1");
QPushButton *two = new QPushButton("2");
QPushButton *three = new QPushButton("3");
QPushButton *four = new QPushButton("4");
QPushButton *five = new QPushButton("5");
QPushButton *six = new QPushButton("6");
QPushButton *seven = new QPushButton("7");
QPushButton *eight = new QPushButton("8");
QPushButton *nine = new QPushButton("9");
QPushButton *zero = new QPushButton("0");
QPushButton *add = new QPushButton("+");
QPushButton *sub = new QPushButton("-");
QPushButton *mul = new QPushButton("*");
QPushButton *div = new QPushButton("/");
QPushButton *equ = new QPushButton("=");
QLCDNumber *lcd = new QLCDNumber(5);
QObject::connect(one, SIGNAL(clicked()), &calc, SLOT(appendone()));
std::cout<<i;
if(i == 1)
{
str.append("1");
lcd->display(str);
}
QGridLayout *layout = new QGridLayout;
lcd->display(str);
layout->addWidget(zero,5,1);
layout->addWidget(equ,5,3);
layout->addWidget(one,4, 2);
layout->addWidget(two,4,1);
layout->addWidget(three,4,0);
layout->addWidget(add,4,3);
layout->addWidget(sub,4,4);
layout->addWidget(four,3,2);
layout->addWidget(five,3,1);
layout->addWidget(six,3,0);
layout->addWidget(mul,5,3);
layout->addWidget(div,5,4);
layout->addWidget(seven,2,2);
layout->addWidget(eight,2,1);
layout->addWidget(nine,2,0);
layout->addWidget(lcd,2,3);
window->setLayout(layout);
window->show();
return app.exec();
}


My .CPP file


#include <QApplication>
#include <QPushButton>
#include <QGridLayout>
#include <QLCDNumber>
#include <QString>
#include <iostream>
#include <test.h>

int i;
QString str = "0";
int calc::appendone()
{
i = 1;
str.append("1");
return 0;
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget *window = new QWidget;
QPushButton *one = new QPushButton("1");
QPushButton *two = new QPushButton("2");
QPushButton *three = new QPushButton("3");
QPushButton *four = new QPushButton("4");
QPushButton *five = new QPushButton("5");
QPushButton *six = new QPushButton("6");
QPushButton *seven = new QPushButton("7");
QPushButton *eight = new QPushButton("8");
QPushButton *nine = new QPushButton("9");
QPushButton *zero = new QPushButton("0");
QPushButton *add = new QPushButton("+");
QPushButton *sub = new QPushButton("-");
QPushButton *mul = new QPushButton("*");
QPushButton *div = new QPushButton("/");
QPushButton *equ = new QPushButton("=");
QLCDNumber *lcd = new QLCDNumber(5);
QObject::connect(one, SIGNAL(clicked()), &calc, SLOT(appendone())); //line 37
std::cout<<i;
if(i == 1)
{
str.append("1");
lcd->display(str);
}
QGridLayout *layout = new QGridLayout;
lcd->display(str);
layout->addWidget(zero,5,1);
layout->addWidget(equ,5,3);
layout->addWidget(one,4, 2);
layout->addWidget(two,4,1);
layout->addWidget(three,4,0);
layout->addWidget(add,4,3);
layout->addWidget(sub,4,4);
layout->addWidget(four,3,2);
layout->addWidget(five,3,1);
layout->addWidget(six,3,0);
layout->addWidget(mul,5,3);
layout->addWidget(div,5,4);
layout->addWidget(seven,2,2);
layout->addWidget(eight,2,1);
layout->addWidget(nine,2,0);
layout->addWidget(lcd,2,3);
window->setLayout(layout);
window->show();
return app.exec();
}


Here's the error I'm getting


test.cpp: In function ‘int main(int, char**)’:
test.cpp:37:45: error: expected primary-expression before ‘,’ token


Thanks in advance

mvuori
28th February 2012, 14:25
(You seem to have included test.cpp twice in your post, the upper one instead of test.h)

Lesiok
28th February 2012, 14:49
Third parameter of QObject::connect must be an address of object. A &calc is not an address.

wysota
28th February 2012, 15:03
What is "calc"? Seems like a class and not an object. You can't get an address of a class.

fish_sticks
28th February 2012, 17:04
Sorry.Here's my test.h file



#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>

using namespace std;
namespace Ui {
class calc;
}

class calc : public QWidget {
Q_OBJECT
public:
calc(QWidget *parent = 0);
~calc();


protected:

private:
Ui::calc *ui;

private slots:

public slots:
int appendone();
};
#endif // WIDGET_H


I created an object for calc in my C++ file

calc c;
Now I'm getting the following error


/home/anil/Tests/Qt/test/test.cpp:10: undefined reference to `calc::calc(QWidget*)'
/home/anil/Tests/Qt/test/test.cpp:10: undefined reference to `calc::~calc()'
collect2: ld returned 1 exit status
make: *** [test] Error 1

wysota
28th February 2012, 17:17
You're missing a body for your constructor and your destructor. Did you implement them?

fish_sticks
28th February 2012, 17:31
Nope I havent implemented a constructor nor a destructor. I've just declared them in the class. Should I remove the declaration?

Added after 5 minutes:

I defined the constructor and destructor and got the following errors



test.o: In function `~calc':
/home/anil/Tests/Qt/test/test.cpp:18: undefined reference to `vtable for calc'
/home/anil/Tests/Qt/test/test.cpp:18: undefined reference to `vtable for calc'
test.o: In function `calc':
/home/anil/Tests/Qt/test/test.cpp:15: undefined reference to `vtable for calc'
/home/anil/Tests/Qt/test/test.cpp:15: undefined reference to `vtable for calc'
collect2: ld returned 1 exit status


Added after 6 minutes:

I finally compiled the code,but now I'm getting the following error.


QWidget: Must construct a QApplication before a QPaintDevice
Aborted (core dumped)


Here's my C++ file


#include <QApplication>
#include <QPushButton>
#include <QGridLayout>
#include <QLCDNumber>
#include <QString>
#include <iostream>
#include <test.h>

calc c;

int i;
QString str = "0";

calc::calc(QWidget *parent)
{
}
calc::~calc()
{
}


int calc::appendone()
{
i = 1;
str.append("1");
return 0;
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget *window = new QWidget;
QPushButton *one = new QPushButton("1");
QPushButton *two = new QPushButton("2");
QPushButton *three = new QPushButton("3");
QPushButton *four = new QPushButton("4");
QPushButton *five = new QPushButton("5");
QPushButton *six = new QPushButton("6");
QPushButton *seven = new QPushButton("7");
QPushButton *eight = new QPushButton("8");
QPushButton *nine = new QPushButton("9");
QPushButton *zero = new QPushButton("0");
QPushButton *add = new QPushButton("+");
QPushButton *sub = new QPushButton("-");
QPushButton *mul = new QPushButton("*");
QPushButton *div = new QPushButton("/");
QPushButton *equ = new QPushButton("=");
QLCDNumber *lcd = new QLCDNumber(5);
QObject::connect(one, SIGNAL(clicked()), &c, SLOT(appendone()));
std::cout<<i;
QGridLayout *layout = new QGridLayout;
lcd->display(str);
layout->addWidget(zero,5,1);
layout->addWidget(equ,5,3);
layout->addWidget(one,4, 2);
layout->addWidget(two,4,1);
layout->addWidget(three,4,0);
layout->addWidget(add,4,3);
layout->addWidget(sub,4,4);
layout->addWidget(four,3,2);
layout->addWidget(five,3,1);
layout->addWidget(six,3,0);
layout->addWidget(mul,5,3);
layout->addWidget(div,5,4);
layout->addWidget(seven,2,2);
layout->addWidget(eight,2,1);
layout->addWidget(nine,2,0);
layout->addWidget(lcd,2,3);
window->setLayout(layout);
window->show();
switch (i)
{
case 1:
{
str.append("1");
lcd->display(str);
}
}
return app.exec();
}

wysota
28th February 2012, 20:45
Why is your calc object global?

amleto
28th February 2012, 21:30
you cant have global widgets - they are initialised before the qapplication.

tip for you - you dont need globals ;)

fish_sticks
3rd March 2012, 10:08
Where have I declared global widgets? Can you point out please?

wysota
3rd March 2012, 10:24
Line #9 of the last snippet.