• 6291阅读
  • 22回复

[提问]QSplitter增加到QWidget,程序关闭时报内存出错,怎么delete呢? [复制链接]

上一主题 下一主题
离线红森林
 
只看楼主 正序阅读 楼主  发表于: 2013-04-02
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setAttribute(Qt::WA_DeleteOnClose);
    mainSplitter=new QSplitter(Qt::Vertical,this);
    topSplitter=new QSplitter(Qt::Horizontal,mainSplitter);
    bottomSplitter=new QSplitter(Qt::Horizontal,mainSplitter);
    mainSplitter->setOpaqueResize(false);//分隔条不实时更新
    topSplitter->setOpaqueResize(false);
    bottomSplitter->setOpaqueResize(false);

    textLeftTop=new QTextEdit(QObject::tr("Left Top Widget"),topSplitter);
    textRightTop=new QTextEdit(QObject::tr("Right Top Widget"),topSplitter);
    textLeftBottom=new QTextEdit(QObject::tr("Left Bottom Widget"),bottomSplitter);
    textRightBottom=new QTextEdit(QObject::tr("Right Bottom Widget"),bottomSplitter);
    ui->verticalLayout->addWidget(mainSplitter);

}

Widget::~Widget()
{
    delete textRightBottom;
    delete textLeftBottom;
    delete textRightTop;
    delete textLeftTop;

    delete bottomSplitter;
    delete topSplitter;
    delete mainSplitter;

    delete ui;
}
离线红森林
只看该作者 22楼 发表于: 2013-04-02
回 21楼(jdwx) 的帖子
再次感谢,还是不会查文档啊。
QLayout::setContentsMargins
要查到QLayout类
离线jdwx

只看该作者 21楼 发表于: 2013-04-02
回 19楼(红森林) 的帖子
去掉布局的边距:layout->setContentsMargins(0,0,0,0);
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线红森林
只看该作者 20楼 发表于: 2013-04-02
不添加新布局用ui->verticalLayout->addWidget(mainSplitter);时窗口如下:


这个没有边框,但不能自适应窗口的变化。现在想实现去掉边框,同时自适应窗体尺寸。该怎么办呢?
离线红森林
只看该作者 19楼 发表于: 2013-04-02
回 17楼(呆呆很呆) 的帖子
谢谢兄弟。另外我在widget中添加布局后
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(mainSplitter);
分割窗口四周的边框能去掉吗?
离线dbzhang800

只看该作者 18楼 发表于: 2013-04-02
引用第15楼呆呆很呆于2013-04-02 12:37发表的  :
如果你的Widget是在栈上创建的 由于setAttribute(Qt::WA_DeleteOnClose);  关闭会自动delete 导致报错
还有析构函数那几个delete会导致同一内存被delete两次 也会报错

后者尽管不建议,但不会导致同一内存被delete两次,也不会报错。
离线呆呆很呆
只看该作者 17楼 发表于: 2013-04-02
回 16楼(红森林) 的帖子
那只能说明可以用于多文档 并不能说明就是为了多文档而设计的......
你现在的理解就对了
离线红森林
只看该作者 16楼 发表于: 2013-04-02
回 15楼(呆呆很呆) 的帖子
明白了,这个Widget是在栈上创建的,添加setAttribute(Qt::WA_DeleteOnClose); 会报错。
另一个工程是多文档窗口,窗口部件是在堆上创建的,所以添加setAttribute(Qt::WA_DeleteOnClose); 关闭会自动delete而不会报错!
离线呆呆很呆
只看该作者 15楼 发表于: 2013-04-02
如果你的Widget是在栈上创建的 由于setAttribute(Qt::WA_DeleteOnClose);  关闭会自动delete 导致报错
还有析构函数那几个delete会导致同一内存被delete两次 也会报错
离线呆呆很呆
只看该作者 14楼 发表于: 2013-04-02
回 13楼(红森林) 的帖子
不是 是窗口关闭自动delete 和多文档没关系
离线红森林
只看该作者 13楼 发表于: 2013-04-02
setAttribute(Qt::WA_DeleteOnClose); 是多文档窗口时加的。
这里不能乱加啊,去掉就解决了。
离线红森林
只看该作者 12楼 发表于: 2013-04-02
谢谢各位版主,
之前加的一行,害人啊!
离线dbzhang800

只看该作者 11楼 发表于: 2013-04-02
哪些delete语句尽管有些多余,但还不至于导致错误
离线dbzhang800

只看该作者 10楼 发表于: 2013-04-02
你的主窗体是在堆上还是栈上? 为什么加     setAttribute(Qt::WA_DeleteOnClose);
离线jdwx

只看该作者 9楼 发表于: 2013-04-02
回 8楼(红森林) 的帖子
setAttribute(Qt::WA_DeleteOnClose);
在构造函数里的这句也要删除。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线红森林
只看该作者 8楼 发表于: 2013-04-02
回 6楼(jdwx) 的帖子
clear工程,再编译。后还是报同样的错误
离线红森林
只看该作者 7楼 发表于: 2013-04-02
回 5楼(jeffreylee) 的帖子
不delete,关闭时同样报错。见上图。
我把QSplitter增加到QMainWindow同样关闭时报错。
C++GUIQt4编程里的mailclient例子,是QSplitter增加到QMainWindow的,但他的QMainWindow没有UI
难道和UI有关吗?
离线jdwx

只看该作者 6楼 发表于: 2013-04-02
回 4楼(红森林) 的帖子
clear工程,再编译。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线jeffreylee

只看该作者 5楼 发表于: 2013-04-02
new时,已经加入parent的,就别delete了!!!!!!!!!!
离线红森林
只看该作者 4楼 发表于: 2013-04-02
回 3楼(jdwx) 的帖子
版主,感谢你的再次出现。
这些删除后,同样报错,只是内存地址不同了:
离线jdwx

只看该作者 3楼 发表于: 2013-04-02
回 2楼(红森林) 的帖子
把下面的代码从析构函数里删除。
   delete textRightBottom;
    delete textLeftBottom;
    delete textRightTop;
    delete textLeftTop;

    delete bottomSplitter;
    delete topSplitter;
    delete mainSplitter;
Qt有自己的内存管理方法,这些控件不需要自己写delete。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线红森林
只看该作者 2楼 发表于: 2013-04-02
http://www.qtcn.org/bbs/read-htm-tid-52738.html
参考此贴把QSplitter定义成    
QSplitter mainSplitter(Qt::Vertical);
    QSplitter topSplitter(Qt::Horizontal);
    QSplitter bottomSplitter(Qt::Horizontal);
仍然解决不了啊!
离线红森林
只看该作者 1楼 发表于: 2013-04-02
窗体显示:

关闭时报错:

快速回复
限100 字节
 
上一个 下一个