使用 takeAt() 时小部件故障
Widget malfunction when use takeAt()
我在 QListWidgetItem 中有一个小部件,其中有 5 个元素:
- QLabel
- SpacerItem
- QWidget(包含QLabel和QLineEdit)
- SpacerItem
- QWidget(包含QLabel和QLineEdit)
我想访问外部小部件,为此我使用 QWidget* selectedWidget = dynamic_cast<QWidget*>(ui->listWidget->itemWidget(ui->listWidget->item(1)));
然后 QWidget* SelectedEdit = selectedWidget->layout()->takeAt(2)->widget();
访问内部小部件(包含 QLineEdit),最后访问 lineEdit i'我使用 QLineEdit* ThisEdit = dynamic_cast<QLineEdit*>(SelectedEdit->layout()->takeAt(1)->widget());
。
每次选择后,我都会读取主小部件内的元素数量,并在执行 SelectedEdit
后将数字变为 4
header代码:
#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
源代码:
#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代码:
<?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>
初始状态:
最终状态:
如您所见,最大和最小标签彼此重叠
您正在使用 QLayout::takeAt
,从布局中删除 小部件。我不认为你有意这样做...
我在 QListWidgetItem 中有一个小部件,其中有 5 个元素:
- QLabel
- SpacerItem
- QWidget(包含QLabel和QLineEdit)
- SpacerItem
- QWidget(包含QLabel和QLineEdit)
我想访问外部小部件,为此我使用 QWidget* selectedWidget = dynamic_cast<QWidget*>(ui->listWidget->itemWidget(ui->listWidget->item(1)));
然后 QWidget* SelectedEdit = selectedWidget->layout()->takeAt(2)->widget();
访问内部小部件(包含 QLineEdit),最后访问 lineEdit i'我使用 QLineEdit* ThisEdit = dynamic_cast<QLineEdit*>(SelectedEdit->layout()->takeAt(1)->widget());
。
每次选择后,我都会读取主小部件内的元素数量,并在执行 SelectedEdit
后将数字变为 4
header代码:
#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
源代码:
#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代码:
<?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>
初始状态:
最终状态:
如您所见,最大和最小标签彼此重叠
您正在使用 QLayout::takeAt
,从布局中删除 小部件。我不认为你有意这样做...