QT布局不正确添加

发布于 2025-01-26 01:22:23 字数 4275 浏览 3 评论 0原文

我目前正在通过制作一种“食谱”应用程序来学习QT。它具有当前仅应将布局从QMAP添加到我的主Qlayout的函数。不幸的是,上述错误发生:

“发生的错误”

它在添加最后一个布局时发生的大部分时间都会发生,但不是规则。我对此代码进行了很多尝试,所以很抱歉它太混乱了。当我启动RefilleReciPelayout函数时,语句是“ while(i!= enditerator),但行为相同。在下面,我向您发送我的代码:

mainwindow.cpp

void MainWindow::on_recalculateButton_clicked()
{
    currentRecipe.RefreshIngredientsInMap(deleteButtonToIngredientLayoutMap);
    RefillRecipeLayout();
}

void MainWindow::DeleteLayout(QLayout* layout)
{
    ClearLayout(layout);
    delete layout;
}

void MainWindow::ClearLayout(QLayout* layout)
{
    while (layout->count() != 0)
    {
        QLayoutItem* item = layout->takeAt(0);
        delete item->widget();
        delete item;
    }
}

void MainWindow::RefreshRecipeLayout()
{
   ClearLayout(recipeLayout);
}

void MainWindow::RefillRecipeLayout()
{
    ClearLayout(recipeLayout);
    int recipeCount= recipeLayout->count();
    int iCount=0;

    QMap<QPushButton*, QHBoxLayout*>::const_iterator i = deleteButtonToIngredientLayoutMap.constBegin();
    QMap<QPushButton*, QHBoxLayout*>::const_iterator endIterator = deleteButtonToIngredientLayoutMap.constEnd();
    int end = std::distance(i, endIterator);
        while (iCount < end)
        {
          QLayout* layout = i.value();
          int recipeCount = recipeLayout->count();
          auto isEmpty=recipeLayout->isEmpty();
          auto isEnabled = recipeLayout->isEnabled();
          bool exists = recipeLayout;
          recipeLayout->addLayout(layout);
          i++;
          iCount++;
        }
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QComboBox>
#include <QSpinBox>
#include <QTextEdit>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QScrollArea>
#include <QScrollBar>
#include "recipe.h"
#include "ingredient.h"
#include <vector>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_addIngredient_clicked();

    void on_ExitButton_clicked();

    void on_recalculateButton_clicked();

private:
    Ui::MainWindow *ui;
    QMap<QPushButton*, QHBoxLayout*> deleteButtonToIngredientLayoutMap;
    QComboBox* ingredientUnitComboBox=nullptr;
    QSpinBox* ingredientAmountSpinBox=nullptr;
    QTextEdit* ingredientNameText=nullptr;
    QLabel* recipeAmountLabel=nullptr;
    QLabel* recipeNameLabel=nullptr;
    QComboBox* recipeUnitCBox=nullptr;
    QComboBox* newRecipeUnitCBox=nullptr;
    QScrollArea* scrollArea=nullptr;
    QVBoxLayout* recipeLayout=nullptr;
    QSpinBox* recalculateSpinBox=nullptr;
    QComboBox* recalculateUnitCBox=nullptr;

    void PrepareComboBox(QComboBox* comboBox);
    void DeleteIngredient();
    void DeleteLayout(QLayout* layout);
    void ClearLayout(QLayout* layout);
    void RefillRecipeLayout();
    Unit GetUnitFromCBox(QComboBox* comboBox);
    void RefreshRecipeLayout();

};
#endif // MAINWINDOW_H

recipe.cpp。知道,我已经检查了断点)

void Recipe::RefreshIngredientsInMap(QMap<QPushButton*, QHBoxLayout*> OtherMap)
{


    QMap<QPushButton*, QHBoxLayout*>::const_iterator i = OtherMap.constBegin();
    QMap<QPushButton*, QHBoxLayout*>::const_iterator iteratorEnd = OtherMap.constEnd();
    int count=0;
    while (i != iteratorEnd)
    {
      QHBoxLayout* ingredientLayout=new QHBoxLayout();
      QHBoxLayout* layout = i.value();
      int end = std::distance(OtherMap.constBegin(), OtherMap.constEnd());
      int currentItemIndex=0;
      while(layout->count()>0)
      {
          QWidget* widget = layout->takeAt(0)->widget();

          if (QSpinBox* spinBox = qobject_cast<QSpinBox*>(widget))
              spinBox->setValue(13);

          ingredientLayout->addWidget(widget);



          currentItemIndex++;
      }
      delete layout;
      OtherMap.insert(i.key(), ingredientLayout);
      i++;
      count++;

    }
}

I'm currently learning Qt by making a sort of "RecipeBook" application. It has a function that currently should only add layouts from QMap to my main QLayout. Unfortunately, said error occurs:

error that occured

It happens most of the times when adding the last layout, but it's not a rule. I experimented much with this code, so I'm sorry it's so messy. When I started RefillRecipeLayout function the statement was "while(i != endIterator), but it behaved the same. Below I'm sending you my code:

mainwindow.cpp

void MainWindow::on_recalculateButton_clicked()
{
    currentRecipe.RefreshIngredientsInMap(deleteButtonToIngredientLayoutMap);
    RefillRecipeLayout();
}

void MainWindow::DeleteLayout(QLayout* layout)
{
    ClearLayout(layout);
    delete layout;
}

void MainWindow::ClearLayout(QLayout* layout)
{
    while (layout->count() != 0)
    {
        QLayoutItem* item = layout->takeAt(0);
        delete item->widget();
        delete item;
    }
}

void MainWindow::RefreshRecipeLayout()
{
   ClearLayout(recipeLayout);
}

void MainWindow::RefillRecipeLayout()
{
    ClearLayout(recipeLayout);
    int recipeCount= recipeLayout->count();
    int iCount=0;

    QMap<QPushButton*, QHBoxLayout*>::const_iterator i = deleteButtonToIngredientLayoutMap.constBegin();
    QMap<QPushButton*, QHBoxLayout*>::const_iterator endIterator = deleteButtonToIngredientLayoutMap.constEnd();
    int end = std::distance(i, endIterator);
        while (iCount < end)
        {
          QLayout* layout = i.value();
          int recipeCount = recipeLayout->count();
          auto isEmpty=recipeLayout->isEmpty();
          auto isEnabled = recipeLayout->isEnabled();
          bool exists = recipeLayout;
          recipeLayout->addLayout(layout);
          i++;
          iCount++;
        }
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QComboBox>
#include <QSpinBox>
#include <QTextEdit>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QScrollArea>
#include <QScrollBar>
#include "recipe.h"
#include "ingredient.h"
#include <vector>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_addIngredient_clicked();

    void on_ExitButton_clicked();

    void on_recalculateButton_clicked();

private:
    Ui::MainWindow *ui;
    QMap<QPushButton*, QHBoxLayout*> deleteButtonToIngredientLayoutMap;
    QComboBox* ingredientUnitComboBox=nullptr;
    QSpinBox* ingredientAmountSpinBox=nullptr;
    QTextEdit* ingredientNameText=nullptr;
    QLabel* recipeAmountLabel=nullptr;
    QLabel* recipeNameLabel=nullptr;
    QComboBox* recipeUnitCBox=nullptr;
    QComboBox* newRecipeUnitCBox=nullptr;
    QScrollArea* scrollArea=nullptr;
    QVBoxLayout* recipeLayout=nullptr;
    QSpinBox* recalculateSpinBox=nullptr;
    QComboBox* recalculateUnitCBox=nullptr;

    void PrepareComboBox(QComboBox* comboBox);
    void DeleteIngredient();
    void DeleteLayout(QLayout* layout);
    void ClearLayout(QLayout* layout);
    void RefillRecipeLayout();
    Unit GetUnitFromCBox(QComboBox* comboBox);
    void RefreshRecipeLayout();

};
#endif // MAINWINDOW_H

RefreshIngredientsFunction from Recipe.cpp (works well as far as I know, I've checked with breakpoints)

void Recipe::RefreshIngredientsInMap(QMap<QPushButton*, QHBoxLayout*> OtherMap)
{


    QMap<QPushButton*, QHBoxLayout*>::const_iterator i = OtherMap.constBegin();
    QMap<QPushButton*, QHBoxLayout*>::const_iterator iteratorEnd = OtherMap.constEnd();
    int count=0;
    while (i != iteratorEnd)
    {
      QHBoxLayout* ingredientLayout=new QHBoxLayout();
      QHBoxLayout* layout = i.value();
      int end = std::distance(OtherMap.constBegin(), OtherMap.constEnd());
      int currentItemIndex=0;
      while(layout->count()>0)
      {
          QWidget* widget = layout->takeAt(0)->widget();

          if (QSpinBox* spinBox = qobject_cast<QSpinBox*>(widget))
              spinBox->setValue(13);

          ingredientLayout->addWidget(widget);



          currentItemIndex++;
      }
      delete layout;
      OtherMap.insert(i.key(), ingredientLayout);
      i++;
      count++;

    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

谁对谁错谁最难过 2025-02-02 01:22:23

除了某些代码样式问题(不相关的调试行,不要命名迭代器“ i”),

void Recipe::RefreshIngredientsInMap(QMap<QPushButton*, QHBoxLayout*> OtherMap)

您正在通过复制拍摄地图。然后,您正在尝试通过删除一些布局并插入其他布局来修改其内容。

delete layout;
OtherMap.insert(i.key(), ingredientLayout);

delete操作摧毁了您的映射指向的对象,然后在RefreshingRedredeDientsInmap返回之后,原始地图指向销毁的对象,因为插入是在副本上进行的。

Apart from some code style issues (irrelevant debug lines, don't name iterator "i") in your

void Recipe::RefreshIngredientsInMap(QMap<QPushButton*, QHBoxLayout*> OtherMap)

you are taking the map by copy. Then you are trying to modify it's content by deleting some layouts and inserting other layouts.

delete layout;
OtherMap.insert(i.key(), ingredientLayout);

The delete operation destroys the object your map was pointing to, and then after RefreshIngredientsInMap returns, the original map is pointing to destroyed objects, because the insertions were made on a copy.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文