gpt4 book ai didi

c++ - Qt Crash SIGSEGV Fault while dynamically adding widgets to scrollArea (ui->scrollArea->setWidget(...))

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:47:12 24 4
gpt4 key购买 nike

我的意图

  • 我想创建一个 QWidget 并将其添加到 scrollArea
    然后

  • 为该QWidget 创建并设置网格布局

  • 然后用按钮填充网格布局,每个按钮有一个文本,其值来自输入 int* 数组

我的代码概述:
我有一个带有 UI 表单QDialog 应用程序。
在我的 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

对话框.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 错误。
我还相应地更新了问题标题。

最佳答案

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

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

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);
}

关于c++ - Qt Crash SIGSEGV Fault while dynamically adding widgets to scrollArea (ui->scrollArea->setWidget(...)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36206966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com