Kein Datenzugriff auf lineEdit

Alles rund um die Programmierung mit Qt
Antworten
DerSofti
Beiträge: 3
Registriert: 18. September 2016 15:20

Kein Datenzugriff auf lineEdit

Beitrag 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?
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

Re: Kein Datenzugriff auf lineEdit

Beitrag 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
DerSofti
Beiträge: 3
Registriert: 18. September 2016 15:20

Re: Kein Datenzugriff auf lineEdit

Beitrag 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;
}


MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Re: Kein Datenzugriff auf lineEdit

Beitrag 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.
Antworten