【问题标题】:Qt Crash SIGSEGV Fault while dynamically adding widgets to scrollArea (ui->scrollArea->setWidget(...))Qt Crash SIGSEGV Fault 动态添加小部件到 scrollArea (ui->scrollArea->setWidget(...))
【发布时间】:2016-03-24 18:00:18
【问题描述】:

我的意图

  • 我想创建一个QWidget 并将其添加到scrollArea
    那么

  • 为该QWidget 创建并设置一个grid layout

  • 然后用push buttons填充grid layout 有一个文本,其值来自输入 int* array

我的代码概述:
我有一个带有UI formQDialog 应用程序。
在我的 UI 表单中,我使用 QtDesigner 添加了一个 scrollArea
在我的程序中,当某些事件发生时,我会调用以下函数:

void View::setUpBatteryTypes(int* array,int size)
{
    QGridLayout* gl=new QGridLayout();
    QWidget *viewport = new QWidget;
    viewport->setLayout(gl);
    qDebug()<<"debug test 1";
    ui->scrollArea->setWidget(viewport); //crashes here in 2nd call of func
    qDebug()<<"debug test 2";

    QPushButton* pushButtons=new QPushButton[size];
    for(int i=0;i<size;i++)
    {
        pushButtons[i].setText(QVariant(array[i]).toString());
        pushButtons[i].setMinimumSize(200,100);
        pushButtons[i].setMaximumSize(400,200);
        pushButtons[i].setStyleSheet("background-color: rgb(170,170,197);");
        gl->addWidget(&pushButtons[i],(int)floor(i/3),i%3);

    }  
}

问题
我的问题是,当我在我的应用程序中第一次调用函数 setUpBatteryTypes 时,一切正常,并且该函数执行了我打算执行的操作。但是,当在我的应用程序中第二次调用该函数时,它会在两个 qDebug() 语句之间的注释行中崩溃。


这是我的代码
dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
public:
    void setUpBatteryTypes(int*,int);
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QGridLayout>
#include <QDebug>
#include <QPushButton>

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::setUpBatteryTypes(int* array,int size)
{

    QGridLayout* gl=new QGridLayout();
    QWidget *viewport = new QWidget;
    viewport->setLayout(gl );
    qDebug()<<"debug test 1";
    qDebug()<<ui->scrollArea->children();
    ui->scrollArea->setWidget(viewport);
    qDebug()<<ui->scrollArea->children();
    qDebug()<<"debug test 2";

    QPushButton* pushButtons=new QPushButton[size];

    for(int i=0;i<size;i++)
    {
        pushButtons[i].setText(QVariant(array[i]).toString());
        pushButtons[i].setMinimumSize(200,100);
        pushButtons[i].setMaximumSize(400,200);
        pushButtons[i].setStyleSheet("background-color: rgb(170,170,197);");
        gl->addWidget(&pushButtons[i],(int)floor(i/3),i%3);
    }
}

ma​​in.cpp

#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog* w=new Dialog();
    w->show();
    int size=4;
    int* array=new int[size];
    for(int i=0;i<size;i++)
    {
        array[i]=i;
    }

    w->setUpBatteryTypes(array,size);
    w->setUpBatteryTypes(array,size);

    return a.exec();
}

dialog.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QScrollArea" name="scrollArea">
     <property name="widgetResizable">
      <bool>true</bool>
     </property>
     <widget class="QWidget" name="scrollAreaWidgetContents">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>380</width>
        <height>280</height>
       </rect>
      </property>
     </widget>
    </widget>
   </item>
  </layout>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>



我调试了我的代码,它显示了一个 SIGSEGV 错误。
我还相应地更新了问题标题。

【问题讨论】:

  • ui-&gt;scrollAreaui 为 NULL 或未定义。把你的代码的其余部分。或者干脆重新检查一遍,找到第一次调用后可能丢失定义值的位置。
  • 您有崩溃消息吗?你试过一步步调试,检查变量吗?
  • @llya crash message 程序意外完成。我一步步调试,发现哪里崩溃了。
  • 我编辑了我的问题并包含了我的代码。

标签: c++ qt crash


【解决方案1】:

您添加了本地对象的地址作为参数。

在这里你创建一个对象数组,它是这个函数的本地对象

QPushButton* pushButtons=new QPushButton[size];

在这里你传递他们的地址,函数结束后最终无效

gl->addWidget(&pushButtons[i],(int)floor(i/3),i%3);

编辑: 试试

for(int i=0;i<size;i++)
{
    QPushButton* pushButtons=new QPushButton;
    pushButtons=new QPushbutton;
    ...
    gl->addWidget(pushButtons,(int)floor(i/3),i%3);
}

【讨论】:

    猜你喜欢
    • 2013-05-23
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多