#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);
}
代码使用the following UI。我想在行输入窗口小部件like this中键入一些字符串,然后按下按钮。
打印出来:
ip_ch is 123
test is 123
单击按钮时,将打印:
test is `??`
为什么ip_ch
指向垃圾?
答案 0 :(得分:2)
ip_ch
返回后, on_lineEdit_editingFinished()
成为悬空指针。那是因为你让它指向超出范围的临时缓冲区ip_ch_temp
:
ip_ch = ip_ch_temp.data(); // Don't do that!
由于你是用C ++编写的,所以你不应该写C.用value存储你的Latin1表示:
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);
}
};
您的代码存在其他问题:
#include <QDebug>
,而不是<QtDebug>
#include <QMainWindow>
,而不是<qmainwindow.h>
QMainWindow
派生对话;取而代之的是QDialog
。ui
的指针;而是通过价值来存储它。这样你就可以减少可能出错的代码:让编译器为你管理内存。这就是它的用途!