qt Programm stürzt ab



  • Ich bin neu mit der QT Programmierung, ich habe ein Programm geschrieben, mit dem ich ein label ändenr möchte, wenn ich einen Button betätige.
    Wenn ich den Button("messen") drücke (Zeile 28) , dann stürzt mein Programm ab. an schein geht das Programm nicht in die funktion Messen
    Ich benutze QTCreator.

    Hier ist mein Code

    mywindow.h:

    #ifndef MYWINDOW_H
    #define MYWINDOW_H
    
    #include <QWidget>
    #include <QVBoxLayout>
    #include <QPushButton>
    #include <QLabel>
    #include <QObject>
    #include <QLineEdit>
    
    class MyWindow : public QWidget
    {
        Q_OBJECT
    
        public:
    
        MyWindow(QWidget* parent = 0);
        private:
        QLabel *label1;
        QLabel *label2;
        QLabel *label3;
        QLineEdit *datei;
        QLineEdit *gareate;
        QLineEdit *nummer;
        QPushButton *messen;
        QPushButton *clear;
        QPushButton *drucken;
        QPushButton *beenden;
        QVBoxLayout* layout;
    
    public slots:
        void Messen();
        /*void Clear();
        void Drucken();*/
    };
    #endif // MYWINDOW_H
    

    mywindow.cpp

    #include "mywindow.h"
    #include <iostream>
    
    MyWindow::MyWindow(QWidget *parent): QWidget(parent)        
    {
    
        QLabel *label1 = new QLabel(tr("Dateiname:", 0), this);
        label1->setGeometry(0, 0, 130, 40);
        label1->setFont(QFont("Times", 14, QFont::Bold));
    
        QLabel *label2 = new QLabel(tr("Gerätename:",0), this);
        label2->setGeometry(0, 50, 130, 40);
        label2->setFont(QFont("Times", 14, QFont::Bold));
    
        QLabel *label3 = new QLabel(tr("Seriennummer:", 0),  this);
        label3->setGeometry(0, 100, 135, 40);
        label3->setFont(QFont("Times", 14, QFont::Bold));
    
        QLineEdit *datei = new QLineEdit (this);
        datei->setGeometry(140,0,150,40);
    
        QLineEdit *geraete = new QLineEdit (this);
        geraete->setGeometry(140,50,150,40);
    
        QLineEdit *nummer = new QLineEdit (this);
        nummer->setGeometry(140,100,150,40);
    
        messen = new QPushButton (tr ("Messen", 0), this);
        messen->setGeometry(0, 140, 300, 40);
        messen->setFont(QFont("Times", 18, QFont::Bold));
    
        clear = new QPushButton (tr ("Clear", 0), this);
        clear->setGeometry(0, 190, 300, 40);
        clear->setFont(QFont("Times", 18, QFont::Bold));
    
        drucken = new QPushButton (tr ("Drucken", 0), this);
        drucken->setGeometry(0, 240, 300, 40);
        drucken->setFont(QFont("Times", 18, QFont::Bold));
    
        beenden = new QPushButton (tr ("Beenden", 0), this);
        beenden->setGeometry(0, 290, 300, 40);
        beenden->setFont(QFont("Times", 18, QFont::Bold));
    
        connect( beenden, SIGNAL( clicked() ),this, SLOT( close() ) );
        connect( messen, SIGNAL( clicked() ),this, SLOT( Messen() ) );
    }
    
    void MyWindow::Messen()
    {
          label1->setText("neuer Text"); 
    }
    

    main.cpp

    #include <QtCore/QCoreApplication>
    #include <QApplication>
    #include "mywindow.h"
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        MyWindow* window = new MyWindow();
        window->resize(300, 340);
        window->show();
        return app.exec();
    }
    mfg
    


  • Deine ganzen Member-Variablen (label1 usw) sind nicht initialisiert! Die Pointer zeigen ins Nirvana, klar Segfaultet dein Programm weg.
    Und nein, im Konstruktor initialisierst du die nicht, das sind alles eigene Variablen, die nur den gleichen Namen haben wie die Member. Hat jetzt nichts mit Qt zu tun, das ist C++-Grundwissen 😉



  • Vielen dank für deine Antwort

    Ich verstehe es nicht, weil ich das von diesem Beispiel genommen:

    // beispiele/signalslot5/mywindow.h

    #ifndef MYWINDOW_H
     #define MYWINDOW_H
     #include <QWidget>
     #include <QVBoxLayout>
     #include <QPushButton>
     #include <QLabel>
     #include <QObject>
     class MyWindow : public QWidget {
     Q_OBJECT
     public:
     MyWindow(QWidget *parent = 0);
     private:
     QLabel *label;
     QPushButton *button0;
     QPushButton *button1;
     QVBoxLayout* layout;
    private slots:
     void setText();
    };
    #endif
    
    // beispiele/signalslot5/mywindow.cpp
    #include "mywindow.h"
     MyWindow::MyWindow(QWidget *parent): QWidget(parent) {
     label = new QLabel("alter Text");
     button0 = new QPushButton ("Label aktualisieren");
     button1 = new QPushButton ("Beenden");
     layout = new QVBoxLayout(this);
     layout->addWidget(button0);
     layout->addWidget(button1);
     layout->addWidget(label);
     setLayout(layout);
     connect( button0, SIGNAL( clicked() ),
     this, SLOT( setText() ) );
    
     connect( button1, SIGNAL( clicked() ),
     this, SLOT( quit() ) );
    }
    
    void MyWindow::setText() {
    label->setText("neuer Text");
    }
    

    // beispiele/signalslot5/main.cpp

    #include <QApplication>
    #include "mywindow.h"
    int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyWindow* window = new MyWindow;
    window->show();
    return app.exec();
    }
    

    Deine ganzen Member-Variablen (label1 usw) sind nicht initialisiert! Die Pointer zeigen ins Nirvana, klar Segfaultet dein Programm weg.
    Und nein, im Konstruktor initialisierst du die nicht, das sind alles eigene Variablen, die nur den gleichen Namen haben wie die Member.

    Da werden die Member Variablen auch nicht initialisiert oder? und die Pointer zeigen auch nirgendwohin oder???



  • In den beiden Codeabschnitten ist ein gewaltiger Unterschied!
    Ich zeig dir das exemplarisch:

    class klasse_a {
        Member* mem;
    public:
        klasse_a() {
            mem = new Member;
        }
    };
    
    class klasse_b {
        Member* mem;
    public:
        klasse_b() {
            Member* mem = new Member; // Das "mem" ist nicht der Klassen-Member mit gleichem Namen!
        }
    };
    

    Siehst du den Unterschied?



  • @skaos77
    Bitte versteh mich nicht falsch, aber bevor du mit Qt rum experimentierst solltest du dir zuerst die C++ Grundlagen aneignen, andernfalls wirst du nicht wirklich sehr viel Freude am programmieren mit Qt und C++ haben.



  • ja das habe ich gestern bemerkt :(, ich kann Java und C, und ich muss eine Gui machen, deswegen dachte ich würde ees hinkriegen, wenn ich mir Beispiele ansehe. Naja ich werde mir heute die Grundlagen von Klassen und Objekte ansehen. Ich glaube das ist was ich mir auf jeden Fall lernen sollte oder? und was ich für Qt brauche, denke ich 🙂



  • skaos77 schrieb:

    ja das habe ich gestern bemerkt :(, ich kann Java und C, und ich muss eine Gui machen, deswegen dachte ich würde ees hinkriegen, wenn ich mir Beispiele ansehe. Naja ich werde mir heute die Grundlagen von Klassen und Objekte ansehen. Ich glaube das ist was ich mir auf jeden Fall lernen sollte oder? und was ich für Qt brauche, denke ich 🙂

    Nicht nur, du solltest dir auf alle Fälle auch Pointer und das ganze anschauen.
    http://tutorial.schornboeck.net/inhalt.htm



  • ich weiß nicht, ob ich vielleicht nicht lieber einen neuen Thread öffnen sollte.
    Naja ich habe es schon mit der Gui relativ gut hinbekommen und ich kann die Textdateien erzeugen und auch in denen schreiben.

    Mein Programm ist,

    void MyWindow::Messen()
    { 
    
       QString dateiname = datei->text();
       std::string s1 = dateiname.toAscii().data();
    
       QString name = geraete->text();
       std::string s2 = name.toAscii().data();
    
       QString seriennummer = nummer->text();
       std::string s3 = seriennummer.toAscii().data();
    
       char* tmp = new char[s1.size() + 1];
       strcpy(tmp, s1.c_str());
       std::ofstream outfile;
       outfile.open(tmp);
    
       outfile  << s2 << std::endl;
       outfile  << s3 << std::endl;
    
       HANDLE hPort;
       DWORD dw;
       DCB dcb;
       unsigned char buf;
    
    //hier habe ich den Fehler
    hPort=CreateFile( "COM1",GENERIC_READ | GENERIC_WRITE, 0,  NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    
       if (hPort == INVALID_HANDLE_VALUE)
       GetCommState(hPort, &dcb);
       BuildCommDCB("9600,n,8,1", &dcb);
       SetCommState(hPort, &dcb);
    
       while(1)
       {
            ReadFile(hPort, &buf, 1, &dw,NULL);
            if('\r' == buf)continue;
            if(buf==12)break;
            printf("%c",buf);
            outfile << buf << std::endl;
       }
    
       CloseHandle(hPort);
       outfile.close();
    
       delete[] tmp;
    }
    

    Hier bekomme ich die FEhlermeldung

    hPort=CreateFile( "COM1",GENERIC_READ | GENERIC_WRITE, 0, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

    mywindow.cpp:93: error: cannot convert 'const char*' to 'const WCHAR*'
    for argument '1' to 'void* CreateFileW(const WCHAR*, DWORD, DWORD,
    _SECURITY_ATTRIBUTES*, DWORD, DWORD, void*)'

    und heir auch:

    BuildCommDCB("9600,n,8,1", &dcb);

    mywindow.cpp:96: error: cannot convert 'const char*' to 'const WCHAR*'
    for argument '1' to 'BOOL BuildCommDCBW(const WCHAR*, _DCB*)'



  • Die Fehlermeldung ist doch richtig gut, was verstehst du nicht?
    Du hast eine Funktion, in der als Parameter ein const wchar_t* erwartet wird, du übergibst aber ein const char*.

    const char* name = "Hallo";
    const wchar_t* name_w = L"Hallo";
    


  • Hi!

    Warum sparst du dir den Aufwand mit den handles und den ganzen Konvertierungen nicht und benutzt das was Qt dir mit QFile anbietet?
    http://doc.qt.nokia.com/4.6/qfile.html


Anmelden zum Antworten