#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);
}
代码使用以下 UI。我想像这样在行输入小部件中键入一些字符串,然后按下按钮。
它打印出这个:
ip_ch is 123
test is 123
单击按钮时,它会打印:
test is `??`
为什么ip_ch
指向垃圾?
ip_ch
一旦返回on_lineEdit_editingFinished()
就会变成一个悬空的指针。这是因为您将其指向超出范围的临时缓冲区ip_ch_temp
:
ip_ch = ip_ch_temp.data(); // Don't do that!
由于您是用C++编码的,因此您不应该编写 C。 按值存储您的 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
的指针;而是按值存储它。这样,您就有更少的代码可能出错:让编译器为您管理内存。这就是它的用途!