Datenbankanbindung

Alles rund um die Programmierung mit Qt
Antworten
medi
Beiträge: 16
Registriert: 2. März 2006 13:25

Datenbankanbindung

Beitrag von medi »

Hallo Forummitgleider,

Ich möchte eine Datenbankanbindung entwickeln. Die Oberflächenentwicklung soll dabei von der Datenbankentwicklung getrennt werden. Alle Beispiele die ich bis jetzt gefunden habe, trennen diese Funktionen nicht.

Als Erstes habe ich die Klasse z.B.
class PWindow : public QWidget, private Ui::PForm
In dieser sind mehrere QEditLine u.s.w. Die Form selbst wurde mit dem Designer erstellt. Innerhalb der Klasse kann ich auf Eigenschaften wie z.B. txt_Name->text() zugreifen.

Als Zweites habe ich folgende Klasse
class PInfo : public QObject
In dieser Klasse möchte ich die Funktionen zur DB-Anbindung definieren.
Wenn ich jedoch z.B.
void PInfo::PInsert(PWindow *daten)
definiere und auf die Daten zugreifen möchte, sind sie nicht sichtbar. Der Compiler meint:
class PWindow’ has no member named ‘txt_Name’

Ich vermute es liegt daran, dass die Objekte der Form mit dem Designer angelegt wurden. Ich habe sie weder private noch public definiert. Müsste ich das tun?
Ich habe auch in der Doku folgenden Hinweis gefunden:
QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");
Diesen Weg finde ich aber sehr umständlich um an die Objekte der Form zu gelangen.
Wenn diesbezüglich jemand Erfahrung haben sollte oder mir einen Hinweis geben kann, würde ich mich sehr freuen.

Danke Annett
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Ich würde dem PWindow die PInfo-Klasse bekannt machen und nicht umgekehrt. Wie wär es mit etwas Code?
medi
Beiträge: 16
Registriert: 2. März 2006 13:25

Datenbankanbindung

Beitrag von medi »

Hallo macman!

Vielen Dank für Deine Antwort. Dein Tip hilft mir bestimmt weiter.
Ich werde auch bald etwas Code zur Verfügung stellen.
Jedoch bin ich noch nicht so weit. Bis jetzt steht nur die Definition der Klasse. Das ist ja nicht so toll. :wink: Bevor ich mich verrenne, habe ich meine Fragen erst mal ins Forum gestellt.
Bis jetzt habe ich meist ohne Oberfläche entwickelt. Ist deshalb etwas Neuland für mich.

Vielen Dank Annett
medi
Beiträge: 16
Registriert: 2. März 2006 13:25

Datenbankanbindung

Beitrag von medi »

Hallo macman,

anbei nun der Code. Es funktioniert. Allerdings bin ich noch beim Überlegen ob die QList so schön ist und wie ich die DB-Verbindung deklariere. Als Beispiel und Orientierung habe ich simpletreemodel verwendet.

Tschau Annett

p_info.h

Code: Alles auswählen

#ifndef P_INFO_H
#define P_INFO_H
#include ...

class PInfo
{
private:
   QString family_name;
public:
   PInfo();
   ~PInfo();
   QString InsertP();
   void    RefreshP(const QList<QVariant> &data);
};
#endif
p_info.cpp

Code: Alles auswählen

#include "p_info.h"

PInfo::PInfo()
{
}
PInfo::~PInfo()
{
}
void PInfo::RefreshP(const QList<QVariant> &data)
{
   family_name =   data.value(0).toString();
}
QString PInfo::InsertP()
{
   QSqlQuery insert_query;
   QString   str_query;

   str_query  = "insert into p (family_name) values(:family_name)";
   insert_query.prepare(str_query);
   insert_query.bindValue(":family_name", family_name);
   insert_query.exec();

   if (insert_query.lastError().isValid())
   {      return insert_query.lastError().databaseText();   }
   else
   {      return "";   }
}
PWindow.h

Code: Alles auswählen

#ifndef _PWINDOW_H
#define _PWINDOW_H

#include "ui_PForm.h"

class PInfo;   //bekannt machen

class PWindow : public QWidget, private Ui::PForm
{
Q_OBJECT
private:
   PInfo *info_p;
public:
   PWindow(QWidget *parent = 0);
   ~PWindow();
private slots:
   void SaveP();
};
#endif
pwindow.cpp

Code: Alles auswählen

#include "PWindow.h"
#include "p_info.h"

PWindow::
PWindow(QWidget *parent): QWidget(parent)
{
   setupUi(this);
   connect(but_save, SIGNAL(clicked()), this, SLOT(SaveP()));
}

PWindow::
~PWindow()
{
}

void PWindow::SaveP()
{
   info_p = new PInfo();
   QList<QVariant> list_p;
   list_p << txt_family_name->text();
   info_p->RefreshP(list_p);
   QString test=info_p->InsertP();
   if (!test.isEmpty())
   {
      QMessageBox *test_error = new QMessageBox();
      test_error->information(this, tr("ERROR"), test, QMessageBox::Ok);
   }
}
Antworten