• 6372阅读
  • 7回复

[讨论]一个简单的程序 运行不了 求助呀 [复制链接]

上一主题 下一主题
离线yuhaigolden
 
只看楼主 倒序阅读 楼主  发表于: 2011-03-10
一个简单的程序 运行不了 求助
#include "ui_test2.h"
#include <QDialog>
class test2 : public QDialog
{
     Q_OBJECT

public:
     test2(QWidget *parent = 0, Qt::WFlags flags = 0);
     ~test2();

private:
     QLineEdit* t;
     QString A;
     QPushButton* aBtn;
     private slots:
         void aPush();
};

#endif // TEST2_H

******************************
#include "test2.h"
#include <QtGui/QtGui>
test2::test2(QWidget *parent, Qt::WFlags flags)
     : QDialog(parent, flags)
{
     A="3";
     QLineEdit* t=new QLineEdit;
     QGridLayout* gridLayout=new QGridLayout;
     QPushButton* aBtn=new QPushButton(tr("3"));
     gridLayout->addWidget (t,0,0,1,2);
     gridLayout->addWidget(aBtn,1,0,1,2);
     setLayout(gridLayout);
     connect(aBtn,SIGNAL(clicked()),this,SLOT(aPush()));    
}

void test2::aPush()
{
         t->setText (A);
}
test2::~test2()
{

}
***************************
#include "test2.h"
#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
     QApplication a(argc, argv);
     test2 w;
     w.show();
     return a.exec();
}
*************************
执行aPush()时就报错,老大们都给点意见
离线dbzhang800

只看该作者 1楼 发表于: 2011-03-10
注意 你这儿的 t 是个野指针,出错是正常的
离线kimtaikee

只看该作者 2楼 发表于: 2011-03-10
if(t)
{
t->setText(A);
}

离线morriszy

只看该作者 3楼 发表于: 2011-03-10
private slots:
           void aPush();//应该定义为槽函数吧...
[ 此帖被morriszy在2011-03-10 13:45重新编辑 ]
VS2010+Qt4.7.0
离线米尔利安

只看该作者 4楼 发表于: 2011-03-10
头文件:
    QLineEdit* t;
构造函数:
QLineEdit* t=new QLineEdit;

构造函数里应该改成 t=new QLineEdit;

其他的头文件里已经定义的指针,也是直接new出来比较好。
我们在天上的父,愿人都尊你的名为圣。
愿你的国降临。
愿你的旨意行在地上,如同行在天上。
离线morriszy

只看该作者 5楼 发表于: 2011-03-10
回 4楼(米尔利安) 的帖子
QLineEdit* t=new QLineEdit;
所以说这个是野指针?
看来一楼是正解...呵呵
[ 此帖被morriszy在2011-03-10 13:42重新编辑 ]
VS2010+Qt4.7.0
离线yuhaigolden
只看该作者 6楼 发表于: 2011-03-10
谢谢各位 解决了 初学不懂 各位辛苦了
离线coblan

只看该作者 7楼 发表于: 2011-03-11
Re:获取QT窗口句柄
你这个问题应该是 C++的基本知识,和QT 的一个机理共同产生的问题。。
你在构造函数中 : QLineEdit* t=new QLineEdit;
,这里实际上是重复定义了t,那么这里的t 是你重新定义的t,而不是你的成员变量的t 。
如果是标准的C++,那么你的t ,在程序运行到离开构造函数后,这个指针就被删除了,指针指向堆中的数据还没有删除。就会造成内存泄漏t指针。那么就不会被显示出来了。但是这里能被显示出来,是由于QT的特殊原因。当你用layout.addwidget 时,将t的parent设置为了你自己的对话框类test2。那么t的析构工作由其parent接管。。所以这里你能够正常显示。。
但是当你点击按钮时,这是slot函数被调用: t->setText (A); 这里的t是你的成员变量的t,而这个t没有被赋值。所以程序会崩溃。。所以大家说你的t是野指针。。
除了上面大家说的改法,你应该还可以这样改:
void test2::aPush()
{
         sender()->setText (A);
}
这时,就不会出问题。。
//真是无聊啊,说那么多。呵呵。
快速回复
限100 字节
 
上一个 下一个