Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Widget malfunction when use takeAt()

I have a widget inside a QListWidgetItem in which I have 5 elements:

  • QLabel
  • SpacerItem
  • QWidget (containing QLabel and QLineEdit)
  • SpacerItem
  • QWidget (containing QLabel and QLineEdit)

I want to access the outter widget, in order to do that I used QWidget* selectedWidget = dynamic_cast<QWidget*>(ui->listWidget->itemWidget(ui->listWidget->item(1))); then QWidget* SelectedEdit = selectedWidget->layout()->takeAt(2)->widget(); to access the inner widget(containing the QLineEdit) and then finally to access the lineEdit i’m using QLineEdit* ThisEdit = dynamic_cast<QLineEdit*>(SelectedEdit->layout()->takeAt(1)->widget());.
after each selection I’m reading the number of element inside the main widget and after executing SelectedEdit the number is turnig to 4

header code:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

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_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

source code:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QListWidgetItem>
#include <QLabel>
#include <QLineEdit>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QListWidgetItem* list = new QListWidgetItem();
    QWidget* listwidget = new QWidget;
    QHBoxLayout* listLayout = new QHBoxLayout(listwidget);
    listwidget->setMaximumSize(QSize(ui->listWidget->width(), 20));
    listwidget->setMinimumSize(QSize(ui->listWidget->width(), 20));
    QLabel* NameLabel = new QLabel("Test Name");
    NameLabel->setMaximumWidth(200);
    NameLabel->setMinimumWidth(200);
    QFrame* line = new QFrame();
    line->setFrameShape(QFrame::VLine);
    line->setFrameShadow(QFrame::Sunken);
    QLabel* MaxLabel = new QLabel("Max");
    QFrame* line2 = new QFrame();
    line2->setFrameShape(QFrame::VLine);
    line2->setFrameShadow(QFrame::Sunken);
    QLabel* MinLabel = new QLabel("Min");
    listLayout->addWidget(NameLabel);
    listLayout->addWidget(line);
    listLayout->addWidget(MaxLabel);
    listLayout->addWidget(line2);
    listLayout->addWidget(MinLabel);
    listLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
    list->setSizeHint(listwidget->sizeHint());
    listLayout->setMargin(0);
    list->setSizeHint(QSize(listwidget->width(), listwidget->height()));
    ui->listWidget->addItem(list);
    ui->listWidget->setItemWidget(list, listwidget);
    ui->listWidget->item(0)->setFlags(ui->listWidget->item(0)->flags() & ~Qt::ItemIsSelectable);
    ui->listWidget->item(0)->setFlags(ui->listWidget->item(0)->flags() & ~Qt::ItemIsEnabled);

    for(int i = 0; i < 10; i++){
        list = new QListWidgetItem();
        QWidget* wid = new QWidget();
        wid->setMaximumSize(QSize(ui->listWidget->width(), 20));
        wid->setMinimumSize(QSize(ui->listWidget->width(), 20));
        QHBoxLayout* lay = new QHBoxLayout(wid);
        lay->setMargin(0);
        QLabel* lab = new QLabel("Name " + QString::number(i + 1));
        lab->setMaximumWidth(NameLabel->width());
        lab->setMinimumWidth(NameLabel->width());
        QWidget* maxContainer = new QWidget();
        maxContainer->setObjectName("MaxWidget" + QString::number(i));
        QHBoxLayout* maxLay = new QHBoxLayout(maxContainer);
        maxLay->setMargin(0);
        QLabel* maxLab = new QLabel("Max: ");
        QLineEdit* maxedit = new QLineEdit();
        maxedit->setObjectName("MaxEdit" + QString::number(i));
        maxedit->setText("1000");
        maxedit->setMinimumWidth(60);
        maxedit->setMaximumWidth(60);
        maxLay->addWidget(maxLab);
        maxLay->addWidget(maxedit);
        maxLay->setSizeConstraint(QLayout::SetMinAndMaxSize);
        QWidget* minContainer = new QWidget();
        minContainer->setObjectName("MinWidget");
        QHBoxLayout* minLay = new QHBoxLayout(minContainer);
        minLay->setMargin(0);
        QLabel* minLab = new QLabel("Min: ");
        QLineEdit* minedit = new QLineEdit();
        minedit->setText("50");
        minedit->setMinimumWidth(60);
        minedit->setMaximumWidth(60);
        minLay->addWidget(minLab);
        minLay->addWidget(minedit);
        minLay->setSizeConstraint(QLayout::SetMinAndMaxSize);
        maxContainer->setMaximumWidth(MaxLabel->width());
        maxContainer->setMinimumWidth(MaxLabel->width());
        minContainer->setMaximumWidth(MinLabel->width());
        minContainer->setMinimumWidth(MinLabel->width());
        QSpacerItem* FirstSpace = new QSpacerItem(line->width(), 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
        QSpacerItem* SecondSpace = new QSpacerItem(line2->width(), 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
        lay->addWidget(lab);
        lay->addSpacerItem(FirstSpace);
        lay->addWidget(maxContainer);
        lay->addSpacerItem(SecondSpace);
        lay->addWidget(minContainer);
        lay->setSizeConstraint(QLayout::SetMinAndMaxSize);
        list->setSizeHint(QSize(wid->width(), wid->height()));
        ui->listWidget->addItem(list);
        ui->listWidget->setItemWidget(list, wid);
    }
}

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


void MainWindow::on_pushButton_clicked()
{
    int numwid = ui->listWidget->count();
    QWidget* selectedWidget = dynamic_cast<QWidget*>(ui->listWidget->itemWidget(ui->listWidget->item(1)));
    int selectednum = selectedWidget->layout()->count(); // selectednum = 5
    QWidget* SelectedEdit = selectedWidget->layout()->takeAt(2)->widget();
    selectednum = selectedWidget->layout()->count(); // selectednum = 4
    QLineEdit* ThisEdit = dynamic_cast<QLineEdit*>(SelectedEdit->layout()->takeAt(1)->widget());
    selectednum = selectedWidget->layout()->count(); selectednum = 4
    ThisEdit->setText("600");
    selectednum = selectedWidget->layout()->count(); selectednum = 4
}

ui code:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>445</width>
    <height>358</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QListWidget" name="listWidget"/>
    </item>
    <item>
     <widget class="QPushButton" name="pushButton">
      <property name="text">
       <string>PushButton</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>445</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

initial state:
enter image description here

final state:
enter image description here

as you see max and min labels are on top of each other

>Solution :

You are using QLayout::takeAt, which removes the widget from the layout. I don’t think you mean to do that…

Use QLayout::itemAt instead.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading