2016-04-04 22 views
0
#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QtDebug> 
#include <iostream> 
char * ip_ch; 
void test(const char* a) 
{ 
    qDebug()<<"test is "<<a; 

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

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

void MainWindow::on_lineEdit_editingFinished() 
{ 
    QString st_ip_ch=ui->lineEdit->text(); 
    QByteArray ip_ch_temp = st_ip_ch.toLatin1(); 
    ip_ch = ip_ch_temp.data(); 
    qDebug()<<"ip_ch is "<<ip_ch; 
    test(ip_ch); 
} 

void MainWindow::on_pushButton_clicked() 
{ 
    qDebug()<<"when push button "; 
    test(ip_ch); 
} 

Der Code verwendet the following UI. Ich möchte eine Zeichenfolge in das Zeileneingabe-Widget eingeben like this, und dann drücken Sie die Taste.Globale Variable enthält Müll, wenn auf die Schaltfläche geklickt wird

Es druckt diese:

ip_ch is 123 
test is 123 

Wenn Schaltfläche geklickt wird, druckt es:

test is `??` 

Warum ip_ch Punkt Müll?

Antwort

2

ip_ch wird ein dangling Zeiger, sobald on_lineEdit_editingFinished() zurückgibt. Das ist, weil Sie es Punkt zu einem temporären Puffer zu machen ip_ch_temp, die aus dem Geltungsbereich:

ip_ch = ip_ch_temp.data(); // Don't do that! 

Da Sie in C++ sind Codierung, sollten Sie nicht C. Speichern Sie Ihre Latein1 Darstellung von Wert schreiben:

class MainWindow : public QMainWindow { 
    QByteArray ip_ch; 
    Ui::MainWindow ui; 
public: 
    MainWindow(QWidget * parent = 0) { 
    ui.setupUi(this); 
    } 
    // no explicit destructor needed! 

    void test(const QByteArray & data) { qDebug() << "test:" << data; } 

    void on_lineEdit_editingFinished() 
    { 
    ip_ch = ui.lineEdit->test().toLatin1(); 
    qDebug() << "ip_ch is" << ip_ch; 
    test(ip_ch); 
    } 

    void on_pushButton_clicked() 
    { 
    qDebug() << "button was pushed"; 
    test(ip_ch); 
    } 
}; 

Andere Probleme mit Ihrem Code:

  1. #include <QDebug>, nicht <QtDebug>
  2. #include <QMainWindow>, nicht <qmainwindow.h>
  3. Höchstwahrscheinlich müssen Sie Ihren Dialog nicht von QMainWindow ableiten; abgeleitet von einem QDialog stattdessen.
  4. Verwenden Sie keinen Zeiger auf ui; Speichern Sie es stattdessen nach Wert. Auf diese Weise haben Sie weniger Code, der schief gehen kann: Lassen Sie den Compiler Speicher für Sie verwalten. Dafür ist es da!
Verwandte Themen