Seite 1 von 1

[gelöst] wo ist meine Klasse?

Verfasst: 11. Mai 2006 12:14
von mikro
Hallo,
ich habe eine Klasse MainWindow, die ist abgeleitet von ui_MainWindow (ui_MainWindow ist die von uic automatisch aus der .ui erzeugte Headerdatei)

Code: Alles auswählen

MainWindow.h:
#include "ui_MainWindow.h"
class MainWindow : public QMainWindow, public Ui::MainWindow {
    Q_OBJECT
public:
    static MainWindow* self( QWidget* = 0 );
    QSqlDatabase db;
private:
    MainWindow( QWidget* = 0 );
    static QPointer<MainWindow> _self;
...}
Aus diesem Fenster rufe ich eine Klasse OpenProjectDialog auf.

Code: Alles auswählen

MainWindow.cpp (teilweise:)
#include "OpenProjectDialog.h"
void MainWindow::openProject() {
    OpenProjectDialog::self(this)->show();
}
OpenProjectDialog soll jetzt mit den dort eingegebenen Daten ein QSqlDatabase für das MainWindow erzeugen damit das dann der gesamten App zur Verfügung steht:

Code: Alles auswählen

OpenProjectDialog.cpp (teils)
void OpenProjectDialog::on_pBOpen_clicked() {

    MainWindow* myParent = (MainWindow *)( this->parent());
	myParent->db = QSqlDatabase::addDatabase(CB_driver->currentText());
    if (CB_driver->currentText() == "QMYSQL" || CB_driver->currentText() == "QMYSQL3") {
        myParent->db.setHostName(LE_Server->text());
Das ganze kompiliert, stürzt dann aber an diesem Punkt ab. Ich habe jetzt mal den Debugger nach myParent->db gefragt und er erzählt mir, dass ui_MainWindow kein Attribut namens db hätte. Stimmt. Deswegen habe ich ja die abgeleitete Klasse MainWindow erzeugt. Und eigentlich dachte ich auch verwendet.
Wieso greift er direkt auf ui_MainWindow zu ??

Verfasst: 11. Mai 2006 13:17
von Christian81
Wenn der Compiler es ohne Fehlermeldungen compiliert ist es auch da - egal was der Debugger sagt. Dein Fehler muss also woanders liegen.

Verfasst: 11. Mai 2006 14:45
von mikro
Danke. Das tröstet. Hatte das jetzt mehrfach hin und her geändert, und nachdem ich deinen Beitrag gelesen hatte wieder zurück und jetzt klappts plötzlich. Keine Ahnung, was jetzt anders sein soll.
So. jetzt hat mein MainWindow ein Attribut db, das sollte eine gültige, offene Datenbankverbindung enthalten. Wenn MainWindow nun das ConfigWindow öffnet, dann sagt dessen Konstruktor:

Code: Alles auswählen

ConfigWindow::ConfigWindow( QWidget* parent )
        : QMainWindow( parent ) {
    setupUi( this );
    MainWindow* myParent = (MainWindow *)( this->parent());
    myDB     = &myParent->db;
    if (! myDB->isOpen()) {
    	QMessageBox::information(this,tr("keine Datenbankverbindung"),tr("bitte öffnen Sie die Konfiguration erst nachdem Sie ein Projekt geöffnet haben"));
    }
    emit FillAnlagenTree();
}
myDB ist in ConfigWindow.h als
QSqlDatabase* myDB
definiert. Eine Fehlermeldung kommt hier nicht, anscheinend ist myDB also ein Pointer auf meine geöffnete Datenbankverbindung in MainWindow
Der Slot FillAnlagenTree() macht dann ff:

Code: Alles auswählen

    QSqlQuery query("SELECT oid,parent,bezeichnung FROM _anlagenkatalog",*myDB);
    if (query.exec()) {
        while (query.next()) {
               // befüllen des Tree
        }
    } else {
    	QMessageBox::information(this,"Anlagenkatalog leer","Die Datenbank meldet: "+ myDB->lastError().databaseText()+"\nDer Treiber meldet: "+myDB->lastError().driverText());
    }
Ich habs mal mit dem Debugger verfolgt: anscheinend gibt query.exec() false zurück. Ich kriege die Messagebox, myDB->lastError().databaseText() und myDB->lastError().driverText() sind aber leer. In der Datenbank ist auf jeden Fall was drin, mit dem Query kann ich mit SqliteAdmin ein Ergebnis bekommen. Wie kann ich rausfinden, was schiefläuft?
[EDIT]: wenn ich damit eine Verbindung zu meinem MySQL-Server aufbaue, dann klappts, nur mit SQLite will er net. Scheint also weniger ein c++-Fehler zu sein, als das ich rauskriegen müsste, was der SQLite-Treiber nicht mag.

Verfasst: 11. Mai 2006 23:05
von mikro

Verfasst: 12. Mai 2006 04:13
von newhappy
try virtual inherit