Ich konnte den Fehler einengen nur leider versteh ich es nicht
Ich habe mich daher entschlossen doch mal einige meiner Klassen zu posten und hoffe es findet sich ein hilfsbereiter Boardnutzer der sich das mal durchschaut.
________________________
Erklärung:
Ich nehme in meinem Programm Zugriff auf eine Datenbank um die Zugriffsinformationen (Host, User, Name, ..)zu laden und zu speicher (auf der HDD) nutze ich die Klasse "setingmanager" (das eine T fehlt mit absicht 8) ).
Der Fehler tritt NICHT auf, wenn ich in db connect (Klasse nimmt Zugriff auf Datenbank)
die Zeile
auskommentiere, so wie es gerade der fall ist. Also wenn ich nicht die Daten von der Festplatte laden sonder per Hand in den Code eingebe.
bevor der Feheler:
QWidget: Must construct a QApplication before a QPaintDevice
auftritt gibt er mir noch ein cerr, was ich geschrieben habe, aus der Funktion .loadSettingsFromFile() (setingmanager ) aus.
________________________
Was ich nicht vertehe:
In meiner Main frage ich als erstes ab ob diese config Datei aus der ich die Datenbankeinstellungen lesen möchte
existiert
und wenn nicht lassse ich eine QMessageBox mit exec starten, sodass das Programm ja gar nicht bis an diese Stelle in dbconnect laufen sollte.
________________________
Was mir helfen könnte:
Wie strukturiere ich meine Klassen, dass ich erst feststelle ob eine *.conf Datei existiert und wenn nicht eine schreiben lasse.
Wenn ihr doch noch die anderen Klassen sehen wollt, gerne, ich möchte nur nichts unwesentliches posten.
Vielan Dank schonmal für eure Mühen!!
________________________
Der Code
main.h
Code: Alles auswählen
#ifndef MAIN_H
#define MAIN_H
#include "DbmsWindow.h"
#include "setingmanager.h"
#include <QApplication>
#include <iostream>
using namespace std;
class main
{
private:
public:
main();
};
#endif // MAIN_H
main.cpp
Code: Alles auswählen
// main.cpp
#include "main.h"
int main ( int argc, char *argv[] )
{
QApplication app( argc, argv );
//Vor dem Start des Programm prüfen ob Einstellungen zur Datenbank geladen werden können
SetingManager lSettings;
if (!lSettings.check())
{
//wird benötigt um Umlaute richtig darzustellen
wchar_t* QboxText = L"Die Datei \"d_manager.conf\" konnte nicht gefunden werden.\n"\
"Diese enthällt die Grundeinstellungen für den Datenbankzugriff.\n"\
"Wenn Sie dieses Programm das erste mal aufrufen muss diese erst neu erstellt werden.\n\n"\
"Möchten Sie jetzt die Grundkonfigurationen festlegen?\n";
QMessageBox abfrage;
abfrage.setWindowTitle("Keine Konfiguration gefunden!");
abfrage.setIcon(QMessageBox::Question);
abfrage.setText(QString(QString::fromWCharArray(QboxText)));
abfrage.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
int usedButton = abfrage.exec();
//used Butten enthält den genutzen Button
db_setting datenbankEinstellungen;
switch (usedButton) {
case QMessageBox::Yes:
// EinstellungsDialog erzeugen uns starten.
//bewirkt, dass die Codeausführung solange angehalten wird bis der Dialog beendet wurde.
// exec ist immer modal aber übergibt die Kontrolle nicht an da aufrufende Programm zurück,
//imgegensatz zu .show();
//daher "datenbankEinstellungen.setModal(true);" unnötig!
datenbankEinstellungen.exec();
break;
case QMessageBox::No:
return 0;
}
}
DbmsWindow mw;
mw.show();
return app.exec();
}
setingmanager.h
Code: Alles auswählen
#ifndef SETINGMANAGER_H
#define SETINGMANAGER_H
#include "settings.h"
#include "db_setting.h"
#include <QMap>
#include <QColor>
#include <QFile>
#include <QDataStream>
#include <iostream>
using namespace std;
class SetingManager
{
public:
SetingManager();
Settings loadSettingsFromFile();
bool writeNewSettingsToFile(Settings uebergebeneEinstellung);
bool loadedCorrect;
bool check();
private:
Settings dieEinstellungen;
QMap<QString, QString> map;
};
#endif // SETINGMANAGER_H
setingmanager.cpp
Code: Alles auswählen
#include "setingmanager.h"
#include <QMessageBox>
SetingManager::SetingManager()
{
loadedCorrect=false;
}
Settings SetingManager::loadSettingsFromFile()
{
quint32 n;
// Einlesen der gespeicherten Grundeinstellung in eine Map
QFile confDatei("d_manager.conf");
if (!confDatei.open(QIODevice::ReadOnly))
{
cerr << "Cannot open file for reading:s "
<< qPrintable(confDatei.errorString()) << endl;
//wird benötigt um Umlaute richtig darzustellen
wchar_t* QboxText = L"Beim Laden ist ein Fehler aufgetreten \n\n"
"Mögliche Ursachen:\n"
"1. \"d_manager.conf\" konnte nicht gefunden werden. \n"
"2. \"d_manager.conf\" ist beschädigt. \n"
"3. \"d_manager.conf\" wurde noch nicht erstellt. \n"
"4. \"d_manager.conf\" kann nicht gelesen werden. \n";
cout << "foobaaahhhh"<<endl;
QMessageBox msgBox;
msgBox.setWindowTitle("Laden fehlerhaft!");
msgBox.setIcon(QMessageBox::Critical);
msgBox.setText(QString(QString::fromWCharArray(QboxText)));
msgBox.exec();
}else{
QDataStream in(&confDatei);
in.setVersion(QDataStream::Qt_4_1);
in >> n >> map;
//Umwandeln der Map in eigenes Format
dieEinstellungen.setHostName(map.value("Host"));
dieEinstellungen.setDbName(map.value("dbName"));
dieEinstellungen.setDbUserName(map.value("UserName"));
dieEinstellungen.setDbUserPassword( map.value("UserPw"));
dieEinstellungen.setLastUserName(map.value("lUser"));
dieEinstellungen.setPort( map.value("Port"));
loadedCorrect=true;
}
return dieEinstellungen;
}
bool SetingManager::writeNewSettingsToFile(Settings uebergebeneEinstellung)
{
dieEinstellungen=uebergebeneEinstellung;
bool richtigGeschrieben=false;
map.insert("Host", dieEinstellungen.getHostName());
map.insert("Port", dieEinstellungen.getDbPort());
map.insert("dbName", dieEinstellungen.getDbName());
map.insert("UserName",dieEinstellungen.getDbUserName());
map.insert("UserPw", dieEinstellungen.getDbUserPassword());
map.insert("lUser", dieEinstellungen.getLastUserName());
/* QMessageBox msgBox2;
msgBox2.setWindowTitle("Fukushima");
msgBox2.setText(QString("PLOP;\n"
"Host: %1\n dbName: %2,\nUserName: %3,\nPW: %4,\nlU: %5").arg(einstellung.getHostName(),einstellung.getDbName(),einstellung.getDbUserName(),einstellung.getDbUserPassword(),einstellung.getLastUserName()));
msgBox2.exec();
QMessageBox msgBox;
msgBox.setWindowTitle("NACH map VOR schreiben");
msgBox.setText(QString("PLOP;\n"
"Host: %1\ndbName: %2,\nUserName: %3,\nPW: %4,\nlU: %5").arg(
map.value("Host"),map.value("dbName"),map.value("UserName"),
map.value("UserPw"),map.value("lUser") ));
msgBox.exec();
*/
QFile confDatei("d_manager.conf");
if (!confDatei.open(QIODevice::WriteOnly))
{
cerr << "d_manager.conf konnte nicht geschrieben werden!"
<< qPrintable(confDatei.errorString())<<endl;
//wird benötigt um Umlaute richtig darzustellen
wchar_t* QboxText = L"Beim Speichern ist ein Fehler aufgetreten \n\n"
"Haben Sie schreibrechte auf dem Datenträger? \n"
"Bitte versuchen Sie es noch einmal!\n";
QMessageBox msgBox;
msgBox.setWindowTitle("Speichern fehlerhaft!");
msgBox.setIcon(QMessageBox::Critical);
msgBox.setText(QString(QString::fromWCharArray(QboxText)));
msgBox.exec();
}else
{
QDataStream out (&confDatei);
out.setVersion(QDataStream::Qt_4_1);
out<<quint32(0x12345678)<<map;
richtigGeschrieben=true;
}
return richtigGeschrieben;
}
bool SetingManager::check()
{
bool confAvailable=false;
QFile confDatei("d_manager.conf");
if (!confDatei.open(QIODevice::ReadOnly))
{
confAvailable=false;
}else
{
confAvailable=true;
}
return confAvailable;
}
dbconnect.h
Code: Alles auswählen
#ifndef DBCONNECT_H
#define DBCONNECT_H
#include "setingmanager.h"
#include "settings.h"
//#include <QtSql/QSqlDatabase>
//#include <QtSql/QSqlQuery>
//#include <QtSql/QSqlQueryModel>
#include <QtSql/QtSql>
#include <QMessageBox>
class DbConnect
{
public:
DbConnect();
void auslesen(QString query, QSqlQueryModel *model);
bool wasDbwritten();
bool writeNewTables();
bool writeNewExample();
bool repairDatabase();
bool connectionOK;
private:
QSqlDatabase db;
//QSqlQuery qry;
};
#endif // DBCONNECT_H
dbconnect.cpp
Code: Alles auswählen
#include "dbconnect.h"
#include <QtSql/QSqlError>
DbConnect::DbConnect()
{
SetingManager ladeAusDB = SetingManager();
Settings DbEinstellungen = Settings();
/*DbEinstellungen = ladeAusDB.loadSettingsFromFile();
db = QSqlDatabase::addDatabase("QMYSQL","DDatabase");
db.setHostName(DbEinstellungen.getHostName());
db.setDatabaseName(DbEinstellungen.getDbName());
db.setUserName(DbEinstellungen.getDbUserName());
db.setPassword(DbEinstellungen.getDbUserPassword());
db.setPort(DbEinstellungen.getDbPort().toInt());
connectionOK = db.open();
*/
db = QSqlDatabase::addDatabase("QMYSQL","DDatabase");
db.setHostName("localhost");
db.setDatabaseName("test");
db.setUserName("test");
db.setPassword("test");
db.setPort(3301);
connectionOK = db.open();
if (!connectionOK){
QMessageBox msgBox;
msgBox.setWindowTitle("Datenbankfehler");
msgBox.setText(QString("ACHTUNG;\n"
"Es konte keine Verbindung zur Datenbank hergestelt werden!\n\n"
"Fehler: %1 \n"
"Setzen Sie Die Einstllungen unter \"Einstellungen\" -> \"Datenbankeinstellungen setzen\" neu!").arg(connectionOK));
msgBox.exec();
}
}
void DbConnect::auslesen(QString query, QSqlQueryModel *model){
model->setQuery(query,db);
}
bool DbConnect::wasDbwritten() //prüft ob die Datenbank alle nötigen Tabellen enthällt
{
bool readed=false;
if (!db.tables().contains("dm_view") ||
!db.tables().contains("dm_userview") ||
!db.tables().contains("dm_firma") ||
!db.tables().contains("dm_user") ||
!db.tables().contains("dm_person") ||
!db.tables().contains("dm_kunden") ||
!db.tables().contains("dm_projektuser") ||
!db.tables().contains("dm_projektperson") ||
!db.tables().contains("dm_anschperson") ||
!db.tables().contains("dm_rollen") ||
!db.tables().contains("dm_phone") ||
!db.tables().contains("dm_email") ||
!db.tables().contains("dm_projekt") ||
!db.tables().contains("dm_anschrift")
)
{
readed=true;
}
return readed;
}
bool DbConnect::writeNewTables() //löscht alle Tabellen und schreibt sie neu
{
QSqlQuery qry(QSqlDatabase::database( "DDatabase" ));
bool erstellenErfolgreich;
if (connectionOK){
qry.prepare( "DROP TABLE IF EXISTS dm_anschrift");
qry.exec();
qry.prepare( "CREATE TABLE dm_anschrift(anschriftid INTEGER UNIQUE AUTO_INCREMENT PRIMARY KEY, Strasse VARCHAR(30) NOT NULL, Hausnummer VARCHAR(5) NOT NULL, PLZ INTEGER(5) NOT NULL, Ort VARCHAR(30) NOT NULL)" );
qry.exec();
// hier steht eigentlich noch mehr nur gekürzt da es das gleiche ist
erstellenErfolgreich=true;
}
return erstellenErfolgreich;
}
bool DbConnect::repairDatabase() // schreibt alle fehlenden Tabellen in die Datenbank
{
bool foo=false;
QSqlQuery qry(QSqlDatabase::database( "DDatabase" ));
if (connectionOK){
qry.prepare( "CREATE TABLE IF NOT EXISTS dm_anschrift(anschriftid INTEGER UNIQUE AUTO_INCREMENT PRIMARY KEY, Strasse VARCHAR(30) NOT NULL, Hausnummer VARCHAR(5) NOT NULL, PLZ INTEGER(5) NOT NULL, Ort VARCHAR(30) NOT NULL)" );
qry.exec();
// hier steht eigentlich noch mehr nur gekürzt da es das gleiche ist
foo=true;
}
return foo;
}
bool DbConnect::writeNewExample() //schreibt Beispieldaten in die Datenbank
{
QSqlQuery qry(QSqlDatabase::database( "DDatabase" ));
bool foo=false;
if (connectionOK)
{
qry.prepare( "INSERT INTO dm_person (Vorname, Nachname, Anrede ) VALUES ('John', 'Doe','Herr')" );
qry.exec();
// hier steht eigentlich noch mehr nur gekürzt da es das selbe ist
foo=true;
}
return foo;
}