[gelöst] wo ist meine Klasse?

Alles rund um die Programmierung mit Qt
Antworten
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

[gelöst] wo ist meine Klasse?

Beitrag 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 ??
Zuletzt geändert von mikro am 11. Mai 2006 23:04, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn der Compiler es ohne Fehlermeldungen compiliert ist es auch da - egal was der Debugger sagt. Dein Fehler muss also woanders liegen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

Beitrag 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.
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

Beitrag von mikro »

newhappy
Beiträge: 13
Registriert: 11. Mai 2006 07:48
Kontaktdaten:

Beitrag von newhappy »

try virtual inherit
Antworten