• 8426阅读
  • 12回复

菜鸟弱问关于关闭子窗体的问题~ [复制链接]

上一主题 下一主题
离线windking
 
只看楼主 倒序阅读 楼主  发表于: 2009-03-11
小弟现在遇到从主窗体打开一个子窗体,然后关闭父窗体,而子窗体还在的问题。

之前在http://www.qtcn.org/bbs/read.php?tid=15608&fpage=10 帖子中已经谈到过这个问题,但是子窗体还在的问题不知道该如何解决。

引用原来 溟阡 兄的代码(我的和这个差不多,只是父窗体是QMainWindow,子窗体是QWidget):


A:: A(QWidget *parent) :QWidget(parent) {
    //主窗口

void A::open(){
    B* b=new B(this);
    b->show();
}
//点击主窗口的按钮后打开B
B::B(QWidget* parent) :QMainWindow(parent){
    //子窗口
}



请教各位高手,到底是怎么回事?我看过子窗体的parent,没有问题的。
离线windking
只看该作者 1楼 发表于: 2009-03-11
我哭~ 再次拜请各位大大以求赐教~
离线aid120
只看该作者 2楼 发表于: 2009-03-11
在A窗口的窗口关闭事件中关闭B窗口,这样解决不行么?
离线windking
只看该作者 3楼 发表于: 2009-03-11
好像不行耶,我加入了 delete b; 但是子窗口还是好好的在那里呆着~
离线aid120
只看该作者 4楼 发表于: 2009-03-11
添加b->close();
离线windking
只看该作者 5楼 发表于: 2009-03-11
谢谢aid120兄的指点,可惜似乎还是不行,我贴代码上来看看吧:

main函数:
/////////////////////////////////////////
#include <table.h>
#include <QApplication>
int main( int argc, char ** argv )
{
    QApplication a( argc, argv );
    MainTable w;
    w.show();
    w.resize(400,320);
    return a.exec();
}

form2.h文件:(子窗体)
////////////////////////////////////////
#include <QtGui>
#include <QApplication>
class Form2 : public QWidget
  {
   Q_OBJECT
   public:
      Form2 (QWidget *parent );
      ~Form2();
  };

form2.cpp文件:
//////////////////////////////////////
Form2::Form2(  QWidget *parent )
    : QWidget ( parent,Qt::Window )
  {
      resize(200,100);
  }
Form2::~Form2() {}

table.h文件:(父窗体)
//////////////////////////////////////
#include <form2.h>
#include <QtGui>
#include <QApplication>
class QPushButton;
class MainTable : public QMainWindow
  {
    Q_OBJECT
    public:
      MainTable( );
      ~MainTable();
      QPushButton* push;
      Form2* form2;
    private slots:
      void form2_show();
  };

table.cpp文件:
///////////////////////////////////
#include <table.h>
MainTable::~MainTable()
{
   form2->close();
}
MainTable::MainTable(  )
      : QMainWindow (  )
{
   QPushButton* push=new QPushButton(this);
   connect( push, SIGNAL(clicked()),  this, SLOT(form2_show()));
}
void MainTable::form2_show()
  {
   Form2* form2= new Form2(this);
   form2->show();
  }
//////////////////////////////////////

我的qt4的版本是4.2.1
上面的在我的机器上编过去了,点击父窗体的button可以出现form2(点击多次,可以出现多个)。可是关闭父窗体,子窗体都在,已经加入了close()这个,还是不行啊~

请各位不吝指点,告诉小弟到底是哪里错了?

先谢过了~~~~
离线浪漫天使
只看该作者 6楼 发表于: 2009-03-11
正常得很呢

main.h
  1. #include <QtGui>
  2. class B: public QMainWindow
  3. {
  4.  Q_OBJECT
  5. public :
  6.  B(QWidget* parent=0);
  7. };
  8. class A : public QWidget
  9. {
  10.  Q_OBJECT
  11. public:
  12.  A(QWidget *parent=0);
  13.  B* b;
  14. public slots:
  15.  void open();
  16. };


main.cpp
  1. #include "main.h"B::B(QWidget* parent) :QMainWindow(parent){
  2.     //子窗口
  3. }A::A(QWidget *parent) :QWidget(parent) {
  4.     //主窗口
  5.  QPushButton *btn = new QPushButton("ok",this); 
  6.  connect(btn,SIGNAL(clicked()),this,SLOT(open()));
  7. }
  8. void A::open(){
  9.     b=new B(this);
  10.     b->show();
  11. }
  12. //点击主窗口的按钮后打开Bint main( int argc, char ** argv )
  13. {
  14.     QApplication a( argc, argv );
  15.     A w;
  16.     w.show();
  17.    
  18.  a.setQuitOnLastWindowClosed(true);
  19.     return a.exec();
  20. }


main.pro
  1. TEMPLATE = app
  2. TARGET =
  3. DEPENDPATH += .
  4. INCLUDEPATH += .# Input
  5. HEADERS += main.h
  6. SOURCES += main.cpp
只看该作者 7楼 发表于: 2009-03-11
引用第5楼windking于2009-03-11 15:42发表的  :
谢谢aid120兄的指点,可惜似乎还是不行,我贴代码上来看看吧:
main函数:
/////////////////////////////////////////
#include <table.h>
.......

你不开form2就关闭主窗口试试,是不是内存报错了?

指针不能乱用啊
离线浪漫天使
只看该作者 8楼 发表于: 2009-03-11
你的问题在于
table。h里面的 Form2* form2; 中的form2
不是
table。cpp里面的 Form2* form2中的form2
这2个form2不是同一个东西,
跟qt没有关系的,c++的东西来。
离线aid120
只看该作者 9楼 发表于: 2009-03-11
就像楼上的浪漫天使说的哈,两个form不是同一个,而且如果多次点击的话,应该保存每次申请的内存地址,然后逐个关闭哈。楼主的指针没学好哦
离线windking
只看该作者 10楼 发表于: 2009-03-11
实在是太感谢楼上各位了~偶的C++都是看着书自学的,呵呵,确实不扎实。
我改了一会还是不行,我实在不知道怎么才能让table.h 中的form2与table.cpp 中form2是同一个。。。。。

另6楼的代码我在自己的机器上编了一遍,还是关闭父窗口而其他子窗口不能自动关闭~不知道为何。我是用的centos5,用的是qmake -project; qmake; make;

实在是拜托各位了~小弟已经琢磨了2天了,快抓狂了!就麻烦各位给说的具体一点吧~
离线aid120
只看该作者 11楼 发表于: 2009-03-12
main函数:
/////////////////////////////////////////
#include <table.h>
#include <QApplication>
int main( int argc, char ** argv )
{
    QApplication a( argc, argv );
    MainTable w;
    w.show();
    w.resize(400,320);
    return a.exec();
}

form2.h文件:(子窗体)
////////////////////////////////////////
#include <QtGui>
#include <QApplication>
class Form2 : public QWidget
  {
   Q_OBJECT
   public:
      Form2 (QWidget *parent );
      ~Form2();
  };

form2.cpp文件:
//////////////////////////////////////
Form2::Form2(  QWidget *parent )
    : QWidget ( parent,Qt::Window )
  {
      resize(200,100);
  }
Form2::~Form2() {}

table.h文件:(父窗体)
//////////////////////////////////////
#include <form2.h>
#include <QtGui>
#include <QApplication>
class QPushButton;
class MainTable : public QMainWindow
  {
    Q_OBJECT
    public:
      MainTable( );
      ~MainTable();
      QPushButton* push;
      Form2* form2;
    private slots:
      void form2_show();
  };

table.cpp文件:
///////////////////////////////////
#include <table.h>
MainTable::~MainTable()
{
   form2->close();
}
MainTable::MainTable(  )
      : QMainWindow (  )
{
   QPushButton* push=new QPushButton(this);
   connect( push, SIGNAL(clicked()),  this, SLOT(form2_show()));
}
void MainTable::form2_show()
  {
   form2= new Form2(this);
   form2->show();
  }
//////////////////////////////////////
离线windking
只看该作者 12楼 发表于: 2009-03-12
非常非常感谢~~~~
快速回复
限100 字节
 
上一个 下一个