C++ 如何在QScrollArea中对QWidget列表进行排序

C++ 如何在QScrollArea中对QWidget列表进行排序,c++,list,qt,sorting,qwidget,C++,List,Qt,Sorting,Qwidget,我有很多行,有图像、文本和一堆数据。每行都是一个单独的QWidget。每个都有一个分配给它的唯一编号(由用户输入,使用setObjectName(“rzad”+编号))。我需要做的是在每次添加新的行时按降序对行进行排序 我该怎么做 编辑: 我尝试了一个全局QListWidget,但在检索小部件时它崩溃了。将QWidget添加到QListWidget后,我可以立即执行以下操作: ui->scrollAreaWidgetContentsZdjeciaButow->layout()->

我有很多行,有图像、文本和一堆数据。每行都是一个单独的
QWidget
。每个都有一个分配给它的唯一编号(由用户输入,使用
setObjectName(“rzad”+编号)
)。我需要做的是在每次添加新的行时按降序对行进行排序

我该怎么做

编辑: 我尝试了一个全局
QListWidget
,但在检索小部件时它崩溃了。将
QWidget
添加到
QListWidget
后,我可以立即执行以下操作:

ui->scrollAreaWidgetContentsZdjeciaButow->layout()->addWidget(listaWidget->findChild<QWidget*>("rzadKontener_" + poziom));
ui->ScrollAreaWidgetContentszdJociaButow->layout()->addWidget(listaWidget->findChild(“RzadContenner_uuz”+poziom));
它会将小部件添加到该区域,但之后,当我调用sortRows方法时

std::sort(poziomyNachylenia.begin(), poziomyNachylenia.end(), std::greater<int>());

QWidget* nowyZestawRzedow = new QWidget; //new widget for sorted rows
QVBoxLayout* nowyZestawRzedowLayout = new QVBoxLayout;
nowyZestawRzedowLayout->setContentsMargins(-5, -5, -5, -5);
nowyZestawRzedowLayout->setAlignment(Qt::AlignLeft);
nowyZestawRzedowLayout->setAlignment(Qt::AlignTop);
nowyZestawRzedow->setLayout(nowyZestawRzedowLayout);

qDebug() << ui->scrollAreaWidgetContentsZdjeciaButow->layout()->count() << "count";

for (int i = 0; i < ui->scrollAreaWidgetContentsZdjeciaButow->layout()->count(); ++i) {
    QString numerRzedu = QString::number(poziomyNachylenia[i]);

    //this crashes the app
    nowyZestawRzedow->layout()->addWidget(listaWidget->findChild<QWidget*>("rzadKontener_" + numerRzedu)); 
    //and so does this.
    QString nameT = listaWidget->findChild<QWidget*>("rzadKontener_" + numerRzedu)->objectName();  
    qDebug() << "added" << nameT;
}
std::sort(pozimynachylenia.begin()、pozimynachylenia.end()、std::greater());
QWidget*nowyZestawRzedow=新的QWidget//用于排序行的新窗口小部件
QVBoxLayout*nowyZestawRzedowLayout=新的QVBoxLayout;
nowyZestawRzedowLayout->setContentsMargins(-5,-5,-5);
nowyZestawRzedowLayout->setAlignment(Qt::AlignLeft);
nowyZestawRzedowLayout->setAlignment(Qt::AlignTop);
nowyZestawRzedow->setLayout(nowyZestawRzedowLayout);
qDebug()滚动区域WidgetContentszdjeciabutow->layout()->count()滚动区域WidgetContentszdjeciabutow->layout()->count()++(一){
QString numerzedu=QString::number(pozimynachylenia[i]);
//这会使应用程序崩溃
nowyZestawRzedow->layout()->addWidget(listaWidget->findChild(“rzadKontener_uu”+numerzedu));
//这也一样。
QString nameT=listaWidget->findChild(“rzadKontener_uu”+numerzedu)->objectName();

qDebug()您不能只使用
QListWidget
(可能将自定义小部件作为项目,请参见
QListWidget::setItemWidget
)?@Rostislav尝试过,在排序方法中检索小部件会使应用程序崩溃这不是你如何使用
QListWidget
!如果你使用
setItemWidget
,则列表小部件会管理小部件,并且它们不能在布局中。排序列表小部件是一件小事,你一定做错了什么,但你没有显示代码。是的,e很明显,我完全忽略了
ListWidget
的要点。它现在可以工作了,几个小时前就解决了。我所做的是
setText(elevationLevel)
到每个与用户需要输入的“elevationLevel”相对应的项目,我只需调用
->sortItems(Qt::degendingorder)
。效果非常好。现在我有一个新问题-当用户想要手动更改标高时(通过
LineEdit
),我如何更改
QListWidget
中项目的顺序?如果我执行
takeItem
和/或
setText(newLevel)
,带有所有图片和按钮的自定义QWidget将消失。