GB-errinerung in QT hat Speicherzugrifsfehler

Dieses Thema im Forum "C/C++" wurde erstellt von finke, 28.10.2009.

  1. #1 finke, 28.10.2009
    Zuletzt bearbeitet: 28.10.2009
    finke

    finke Eroberer

    Dabei seit:
    05.07.2007
    Beiträge:
    63
    Zustimmungen:
    0
    HI,
    da ich notorisch Geburtstage vergesse, Bin ich gerade dabei mir eine SQLite DB aufzubauen, welche die ganzen Daten der leute die ich so in meinem Umfeld nicht vergessen sollte enthält.
    Nun Brauche ich nur noch ein Programm zum auslesen. Hab mir gedacht, kannste gleich kombinieren, und schauste obde das Mit QT hin bekommst. Gedacht getan, das Buch über QT4 zur hand genommen, mal bisschen in den Beispielen rumgeblätert, und 2 sachen versucht.
    Zuerst eine Ausgabe der Daten in einem Widget nach Buch. Lies sich ausführen, allerdings kam nur ein Weiser Rahen:
    Code:
    #ifndef EDITWIDGET_H
    #define EDITWIDGET_H
    
    #include <QtGui>
    #include <QtSql>
    
    
    
    class EditWidget : public QWidget
    {
        Q_OBJECT
        private:
        QTableView* tv;
        QSqlTableModel* tm;
        QSqlDatabase db;
    
    public:
        EditWidget(QWidget *parent = 0);
        ~EditWidget();
    };
    
    #endif // EDITWIDGET_H
    Code:
    #include "editwidget.h"
    
    EditWidget::EditWidget(QWidget *parent)
        : QWidget(parent)
    {
        db= QSqlDatabase::addDatabase("QSQLITE");
        tv = new QTableView(this);
        tm =new QSqlTableModel();
        db.setHostName("MyServer");
        db.setDatabaseName("I:/server2go/htdocs/db/.htdaten.db");
    
        if(db.open()){
            tm->setTable("daten");
            tm->select();
            tm->setEditStrategy(QSqlTableModel::OnFieldChange);
            tv->setModel(tm);
            tv->setWindowTitle("Test");
            tv->show();
        }
    }
    
    EditWidget::~EditWidget()
    {
        db.close();
    }
    Code:
    #include <QtGui/QApplication>
    #include "editwidget.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        EditWidget w;
        w.show();
        return a.exec();
    }
    
    Fehlschlag, leeres fenster, ka wieso.

    Also ich noch was anderes Probiert:
    Code:
    #ifndef WINDOW_H
    #define WINDOW_H
    
    #include <QWidget>
    #include <QGridLayout>
    #include <QLabel>
    
    #include <QtSql>
    
    
    class Window : public QWidget
    
    {
        private:
        QSqlTableModel* tm;
        QSqlDatabase db;
        QGridLayout* grid;
        QLabel* geb;
        QLabel *lab[2][3];
    public:
        Window();
        ~Window();
    };
    
    #endif // WINDOW_H
    
    Code:
    #include "window.h"
    
    #include <QString>
    #include <QSqlRecord>
    
    Window::Window()
    {
        geb = new QLabel("Nächsten Geburtstage am:");
        grid = new QGridLayout;
    
    
        setLayout(grid);
        db= QSqlDatabase::addDatabase("QSQLITE");
        tm =new QSqlTableModel();
        db.setHostName("MyServer");
        db.setDatabaseName("/media/disk/server2go/htdocs/db/.htdaten.db");
    
        if(db.open()){
            tm->setTable("daten");
            tm->setFilter("");
            tm->select();
            for(int i = 0;i<3;i++){
                QSqlRecord record = tm->record(i);
                QString tmp;
                tmp = record.value("name").toString();
                tmp += ", ";
                tmp += record.value("vorname").toString();
                tmp += ": ";
                lab[0][i] = new QLabel(tmp);
                lab[1][i] = new QLabel(record.value("geburtstag").toString());
            }
            grid->addWidget(geb, 0,0);
            for(int i = 0; i<2;i++){
                for(int j = 0; j<3;i++){
                    grid->addWidget(lab[i][j],(i+1) ,j);
                }
            }
        }
    }
    
    Window::~Window()
    {
        db.close();
    
    }
    
    Code:
    #include <QtGui/QApplication>
    #include "window.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Window w;
        w.show();
        return a.exec();
    }
    
    Resultat: unter Windows nen ominöser Fehlercode (auf Wunsch schau ich nochmal nach welcher), undter Linux nur Speicherzugriffsfehler.

    Bin an und für sich nen Anfänger mit QT, kann mir wer sagen, in welcher Zeile ich den Fehler hab?
    PS: ich weis das das mit Sicherheit kein sicheres Programm ist, kann mir da wer noch Tipps geben? Oder sollt ich lieber das alles weg werfen und nochmal total neu anfangen?

    PS: am ende sollte das mal so sein, das das als ne art Plasmied unter KDE, und halt was vergleichbares unter win läuft, welches mir die nächsten 3 GB's anzeigt. wenn man mit der maus drüber geht und drauf klickt soll ne Tabelle angezeigt werden, in welcher man die Daten ändern kann.

    PS: für den unwahrscheinlichen Fall das es heute Leute gibt die mir nen fertiges Programm dazu anbieten, muss ich leider ablehnen, mein Haupt Ziel ist nicht das Programm sondern der Lehrnefekt beim schreiben.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Blender3D, 29.10.2009
    Blender3D

    Blender3D Vitamin C++

    Dabei seit:
    17.09.2007
    Beiträge:
    228
    Zustimmungen:
    0
    Ort:
    /root
    Da ich von QT keine Ahnung habe bringt es wahrscheinlich nichts, wenn ich mir den Quelltext anschaue. Aber hast du schonmal versucht mit gdb rauszuriegen, wo der Fehler ist?

    Grüße, Blender3D
     
  4. Gast1

    Gast1 Guest

    Als weiteren Kandidaten neben gdb werfe ich hier noch "strace" in die Runde.
     
  5. #4 ChocoHopper, 29.10.2009
    ChocoHopper

    ChocoHopper Mitglied

    Dabei seit:
    29.02.2008
    Beiträge:
    28
    Zustimmungen:
    0
    Und ich valgrind.
     
  6. #5 finke, 29.10.2009
    Zuletzt bearbeitet: 29.10.2009
    finke

    finke Eroberer

    Dabei seit:
    05.07.2007
    Beiträge:
    63
    Zustimmungen:
    0
    Na Toll,
    4 Antworten und alle nur um zu sagen, das sie keine Ahnung haben.
    Ja, hab schon mal versucht den GDB zu bemühen, allerdings hab ich nicht viel Ahnung von Debuggen (Wenn ich Fehler hatte sagte mir das bisher immer der Compiler), und das was ich mit dem GDB raus bekommen hab nützt mir auch nichts.

    PS: Windows sagt mir beim Asführen:
    Wäre zB schon mal ne Hilfe wenn mir wer sagen könnte, warum er die DB nicht auf bekommt. Ich hab gelesen, das man bei Pfadangaben auch unter win / statt \ verwenden soll, und die DB-Datei liegt auch dort. Und wenn ich die mal von dort weg nehme liegt nach ausführen des Programms ne leere Datei mit dem selben Namen da.
     
Thema:

GB-errinerung in QT hat Speicherzugrifsfehler