PDA

View Full Version : cannot share the database connection!!!!



cbarmpar
22nd September 2008, 21:38
Hi all.

I just made the next step to start making applications that make sense but it seems that i get confused easy.

I have a main window(kentriko class). I have a dialogue used to initiate a database connection (class database). This dialogue is called from the mainwindow to create the database connection. The dialogue return the database ( *d.get_db() ).

I want to use this connection to make queries from another form called kentriko (kentriko class). This class is subwindowed. This allows me to instate many instances of this window all of the using the same database.

The problem is that I am making a mistake in the constructors somehow and the pointers to the database are not passed. the code is listed bellow.

Any help will be much appreciated.

parathiro implementation:

#include "parathiro.h"
#include <iostream>
#include <QString>
#include "../diafores_sinartisis/sinartisis.h"
#include "../database/database.h"

using namespace std;
parathiro::parathiro(QWidget *parent,database d)//<-- here i pass the oject (the database connection dialog)//
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.anixe, SIGNAL(clicked()) , this , SLOT(anixe()));
connect(ui.pare, SIGNAL(clicked()) , this , SLOT(pare()));
connect(ui.proto,SIGNAL(textChanged(const QString&)),this,SLOT(alagi()));
}

void parathiro::alagi(){
QSqlQuery erotisi(*d.get_db());//<- here i attempt to use it//
proto = sinartisi_SELECT( "onoma,epitheto" ,"onomata", "onoma", ui.proto->text());
ui.deytero->setText(proto);
erotisi.exec(proto);
variant = erotisi.size();
ui.trito->setText(variant.toString());
}

parathiro header:


#ifndef PARATHIRO_H
#define PARATHIRO_H

#include <QtGui/QMainWindow>
#include "ui_parathiro.h"
#include "../database/database.h"

class parathiro : public QMainWindow
{
Q_OBJECT
public:
parathiro(QWidget *parent = 0, database d );
~parathiro();
private slots:
void anixe();
void pare();
void alagi();
private:
Ui::parathiroClass ui;
QString proto;
QString deytero;
QVariant variant;
};

kentriko implementation:

#include "kentriko.h"
#include <iostream>
#include <QString>
#include "../diafores_sinartisis/sinartisis.h"
#include <QMdiArea>
#include <QMdiSubWindow>
#include "../kentriko/parathiro/parathiro.h"

using namespace std;

kentriko::kentriko(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.neo_parathiro, SIGNAL(triggered()), this, SLOT(anixe()));
connect(ui.sindesi,SIGNAL(triggered()),this,SLOT(s indesi()));
}
void kentriko::anixe(){
parathiro *para = new parathiro(0,d);//<- here i am trying to pass it to the new parathiro//
QMdiSubWindow *subwindow = ui.mdiArea->addSubWindow(para);
subwindow->setAttribute(Qt::WA_DeleteOnClose);
subwindow->resize(sizeHint());
subwindow->show();
}

void kentriko::sindesi(){
database* d;//<<<<- here i am creating the pointer to the database class//
d->show();
}

database implementation:

#include "database.h"

database::database(QWidget *parent) :
QDialog(parent) {
ui.setupUi(this);
db = QSqlDatabase::addDatabase("QMYSQL");
connect(ui.sindesi, SIGNAL(clicked()), this, SLOT(sindesou()));
connect(ui.aposindesi, SIGNAL(clicked()), this, SLOT(aposindesou()));
connect(ui.pliroforia_k, SIGNAL(clicked()), this, SLOT(pliroforia()));
}
void database::sindesou() {
ena.pinakas = ui.pinakas->text();
ena.onoma = ui.onoma->text();
ena.kodikos = ui.kodikos->text();
if (!db.isOpen()) {
db.setDatabaseName(ena.pinakas);
db.setUserName(ena.onoma);
db.setPassword(ena.kodikos);
db.setHostName("127.0.0.1");
db.setPort( 3306);
if (!db.open()) {
ui.katastasi->setText("Not connected");
} else {
ui.katastasi->setText("connected");
}
} else {
ui.katastasi->setText("It has already been connected");
}
}
void database::aposindesou() {
db.close();
}
void database::pliroforia() {
ena.pliroforia = ui.pliroforia->text();
}
A * database::get_alpha() {
return &ena;
}
QSqlDatabase * database::get_db() {
return &db;//<<<<---- here i am returning the database connection from the database class in order to use it on the parathiro.
}
database::~database() {
db.close();
}


i have attached the code as complete files.

Many thanks in advance.

spirit
23rd September 2008, 09:13
where is new operator in your code?


void kentriko::sindesi(){
database* d;//<<<<- here i am creating the pointer to the database class//
d->show();
}

why you don't use ref or pointer to database instead of copying it?


parathiro::parathiro(QWidget *parent,database d)//<-- here i pass the oject (the database connection dialog)//

spirit
23rd September 2008, 09:15
I forgot to add a link.
http://doc.trolltech.com/4.4/qsqldatabase.html#database

cbarmpar
23rd September 2008, 10:53
Thank you for the reply but still not aware on what should I change.

Why and where should I use the new operator?

Many thanks in advance.

spirit
23rd September 2008, 10:58
in this method


void kentriko::sindesi(){
database* d;//<<<<- here i am creating the pointer to the database class//
d->show();
}

so, it should look like


void kentriko::sindesi(){
database* d = new database();
d->show();
}

cbarmpar
23rd September 2008, 11:01
thank you for the reply.

Shall i leave the constractor as it is?

Since d is a pointer i am not coping the object right when i do the following:

parathiro *para = new parathiro(0,d);

do i also need to change the constractor of the parathiro?

Regards.

cbarmpar
23rd September 2008, 11:08
sorry forgot to add:

my implementation now looks like:

parathiro::parathiro(QWidget *parent = 0, database &d)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.anixe, SIGNAL(clicked()) , this , SLOT(anixe()));
connect(ui.pare, SIGNAL(clicked()) , this , SLOT(pare()));
connect(ui.proto,SIGNAL(textChanged(const QString&)),this,SLOT(alagi()));
}

void parathiro::alagi(){
QSqlQuery erotisi(*d->get_db());
proto = sinartisi_SELECT( "onoma,epitheto" ,"onomata", "onoma", ui.proto->text());
ui.deytero->setText(proto);
erotisi.exec(proto);
variant = erotisi.size();
ui.trito->setText(variant.toString());
}


and this is how i call it:

void kentriko::anixe(){
parathiro *para = new parathiro(d);
QMdiSubWindow *subwindow = ui.mdiArea->addSubWindow(para);
subwindow->setAttribute(Qt::WA_DeleteOnClose);
subwindow->resize(sizeHint());
subwindow->show();
}

void kentriko::sindesi(){
database *d = new database;
d->show();
}

regards.

spirit
23rd September 2008, 11:09
of course.
so it should look like


class parathiro : public QMainWindow
{
Q_OBJECT
public:
parathiro(QWidget *parent = 0, database *d);

cbarmpar
23rd September 2008, 11:15
still cant compile i am getting an error in the constructor of parathrio.

spirit
23rd September 2008, 11:17
what kind of error do you get?

cbarmpar
23rd September 2008, 11:23
in the parathiro.h:

#ifndef PARATHIRO_H
#define PARATHIRO_H

#include <QtGui/QMainWindow>
#include "ui_parathiro.h"
#include "../database/database.h"
database *d;
class parathiro : public QMainWindow
{
Q_OBJECT
public:
parathiro(QWidget *parent = 0,database *d = 0);//err= after previous specification in parathiro::parathiro(QWidget*.database*)
~parathiro();


and in the parathiro.cpp:


#include "parathiro.h"
#include <iostream>
#include <QString>
#include "../diafores_sinartisis/sinartisis.h"
#include "../database/database.h"
#include <QMainWindow>
using namespace std;

parathiro::parathiro(QWidget *parent = 0, database *d)//Multiple markers at this line
// - default argument given for parameter 1 of
// ‘parathiro::parathiro(QWidget*, database*)’
// - unused parameter ‘d’
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.anixe, SIGNAL(clicked()) , this , SLOT(anixe()));
connect(ui.pare, SIGNAL(clicked()) , this , SLOT(pare()));
connect(ui.proto,SIGNAL(textChanged(const QString&)),this,SLOT(alagi()));
}

void parathiro::alagi(){
QSqlQuery erotisi(d->get_db());// no matching function to call 'Qsqlquery::QSqlquery(QSqlDatabase)
proto = sinartisi_SELECT( "onoma,epitheto" ,"onomata", "onoma", ui.proto->text());
ui.deytero->setText(proto);
erotisi.exec(proto);
variant = erotisi.size();
ui.trito->setText(variant.toString());
}

spirit
23rd September 2008, 11:57
the wrong code in cpp file


...
parathiro::parathiro(QWidget *parent = 0, database *d)
...


must be


...
parathiro::parathiro(QWidget *parent, database *d)
...

spirit
23rd September 2008, 12:32
actually, I suggest you to use QSqlDatabase::database (http://doc.trolltech.com/4.4/qsqldatabase.html#database) and refuse to use pointer to database object.

cbarmpar
23rd September 2008, 15:42
i tried almost everything and it doesnt seem to work. Additionaly the eclipse IDE seems to stuck sometimes and i need to clean the project. most of the times even when i made the correct change the moc files get stuck andt.I see now why people dont prefer linux:D

I have attached the implementation together with the errors i recieve:



#include "kentriko.h"
#include <iostream>
#include <QString>
#include "../diafores_sinartisis/sinartisis.h"
#include <QMdiArea>
#include <QMdiSubWindow>
#include "../kentriko/parathiro/parathiro.h"
using namespace std;

kentriko::kentriko(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.neo_parathiro, SIGNAL(triggered()), this, SLOT(anixe()));
connect(ui.sindesi,SIGNAL(triggered()),this,SLOT(s indesi()));
}
void kentriko::anixe(){
parathiro *para = new parathiro(0,d);
QMdiSubWindow *subwindow = ui.mdiArea->addSubWindow(para);
subwindow->setAttribute(Qt::WA_DeleteOnClose);
subwindow->resize(sizeHint());
subwindow->show();
}

void kentriko::sindesi(){
database *d = new database;
d->show();
}



the parathiro implementation:



#include "parathiro.h"
#include <iostream>
#include <QString>
#include "../diafores_sinartisis/sinartisis.h"
#include "../database/database.h"
#include <QMainWindow>
using namespace std;

parathiro::parathiro(QWidget *parent, database *d)//<--- unsued parameter 'd'
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.anixe, SIGNAL(clicked()) , this , SLOT(anixe()));
connect(ui.pare, SIGNAL(clicked()) , this , SLOT(pare()));
connect(ui.proto,SIGNAL(textChanged(const QString&)),this,SLOT(alagi()));
}

void parathiro::alagi(){
QSqlQuery erotisi( *d->get_db());
proto = sinartisi_SELECT( "onoma,epitheto" ,"onomata", "onoma", ui.proto->text());
ui.deytero->setText(proto);
erotisi.exec(proto);
variant = erotisi.size();
ui.trito->setText(variant.toString());
}


and finally the database implementation:



#include "database.h"

database::database(QWidget *parent) :
QDialog(parent) {
ui.setupUi(this);
db = QSqlDatabase::addDatabase("QMYSQL");
connect(ui.sindesi, SIGNAL(clicked()), this, SLOT(sindesou()));
connect(ui.aposindesi, SIGNAL(clicked()), this, SLOT(aposindesou()));
connect(ui.pliroforia_k, SIGNAL(clicked()), this, SLOT(pliroforia()));
}
void database::sindesou() {
ena.pinakas = ui.pinakas->text();
ena.onoma = ui.onoma->text();
ena.kodikos = ui.kodikos->text();
if (!db.isOpen()) {
db.setDatabaseName(ena.pinakas);
db.setUserName(ena.onoma);
db.setPassword(ena.kodikos);
db.setHostName("127.0.0.1");
db.setPort( 3306);
if (!db.open()) {
ui.katastasi->setText("Not connected");
} else {
ui.katastasi->setText("connected");
}
} else {
ui.katastasi->setText("It has already been connected");
}
}

..............
QSqlDatabase * database::get_db() {
return &db;
}


Many thanks for your support so far.

Regards.