Seite 1 von 1

Kein Datenzugriff auf lineEdit

Verfasst: 18. September 2016 15:36
von DerSofti
Hallo zusammen,
ich habe vor einigen Tagen mit QT begonnen und zuvor beruflich mit MS Visual C++ (MFC) und Borland C++ Builder (VCL) gearbeitet.
Einleitend will ich dazu erwähnen, daß der QT Creator 4.1.0 auf den ersten Blick alles bietet und mich auch sehr interessiert, allerdings ist der Zugriff auf die Präsentationsschicht (GUI) alles andere als einfach, auch die Datentypen wie QString entsprechen nicht dem ISO-Standard von C++ 11 / 14 etc.

Nun zum Problem, ich will ganz banal auf die Text-Eigenschaft von lineEdit zugreifen, sowohl lesend, als auch schreibend. Hier zunächst die Main-Datei.

Code: Alles auswählen

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
Die Definitionsdatei

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLineEdit>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
     QLineEdit          *lineEditTest;

private slots:
    void on_pushButtonAuswerten_clicked();

    void on_lineEditTest_returnPressed();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

Die Datei mit der Implementierung

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButtonAuswerten_clicked()
{
    std::string stmp;
    QString qstmp;
    lineEditTest = new(QLineEdit);
    lineEditTest = ui->lineEditTest;


    stmp = "";
    qstmp = lineEditTest->text();
    lineEditTest->displayText() = "juhuuu";
}

void MainWindow::on_lineEditTest_returnPressed()
{
    int itmp;

    itmp = 5;
}
Die lokale Variable qstmp bekommt keine Daten von lineEditTest, obwohl ich zuvor dort Text eingegeben habe zum Testen.
Ebenfalls kann ich lineEditTest auch keinen Text zuweisen. Wie bekomm ich das mit QT zum laufen?

Re: Kein Datenzugriff auf lineEdit

Verfasst: 18. September 2016 23:12
von hilefoks

Code: Alles auswählen

void MainWindow::on_pushButtonAuswerten_clicked()
{
    std::string stmp;
    QString qstmp;
    lineEditTest = new(QLineEdit);
    lineEditTest = ui->lineEditTest;


    stmp = "";
    qstmp = lineEditTest->text();
    lineEditTest->displayText() = "juhuuu";
}
- Warum erzeugst du ein neues QLineEdit um es gleich danach wieder zu vergessen (aber nicht zu löschen)?
- In der letzten Zeile holst du dir den gerade angezeigt Text, bekommst also einen QString. Und diesem QString weißt du etwas zu. Dieser QString ist aber kein Pointer oder eine Referenz, du weißt also nur einem temporären Objekt etwas zu, nicht aber dem QLineEdit. So funktioniert es deutlich besser:

Code: Alles auswählen

lineEdit->setText("juhuuu");
MfG
Hilefoks

Re: Kein Datenzugriff auf lineEdit

Verfasst: 19. September 2016 18:45
von DerSofti
Vielen Dank für die Info. War wohl die Macht der Gewohnheit mit .Text. .SetText war das richtige. So allmählich lerne ich QT besser kennen und vielleicht bald auch schätzen.
Nun zum Destruktor von lineEdit, da bekomm ich eine Fehlermeldung, daß das Objekt geschützt währe. Wenn ich free(lineEditTest) verwende und abschließend NULL (NIL) zuweise, bekomme beim verlassen der Methode ein Segmentation Fault.
Edit: Habe vergessen, lineEditTest hat ja die Adresse von dem "eigentlichen" lineEditTest, also erst die Zuweisung lineEdit = NULL; und dann erst .free.
In anderen Beiträgen wie z.B. bei stackoverflow habe ich auch was von Connectoren gelesen, also bei älteren Versionen von QT mußte man wohl sogar erstmal das Objekt QLineEdit mit dem QLineEdit in der GUI verbinden.

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButtonAuswerten_clicked()
{
    std::string stmp;
    QString qstmp;
    lineEditTest = new(QLineEdit);
    lineEditTest = ui->lineEditTest;


    stmp = "";
    qstmp = lineEditTest->text();
    stmp = qstmp.toStdString();
    lineEditTest->setText("juhuuu");
    free(lineEditTest);
    //lineEditTest->destroy(false, false);
    //lineEditTest = NULL;
}

void MainWindow::on_lineEditTest_returnPressed()
{
    int itmp;

    itmp = 5;
}



Re: Kein Datenzugriff auf lineEdit

Verfasst: 20. September 2016 11:20
von MichaelS
Wenn Du Deinem QLineEdit beim Erzeugen einen Parent mitgibst, brauchst Du Dich um das Löschen nicht zu kümmern, weil Qt das dann für Dich macht:

Code: Alles auswählen

lineEditTest = new QLineEdit( this );
Löscht das QLineEdit-Objekt, sobald das Elternobjekt ( in Deinem Fall MainWindow ) gelöscht wird.