Как просто удалить строку в QFormLayout программно

у меня есть этот код:

myEdit = QLineEdit()
myQFormLayout.addRow("myLabelText", myEdit)

теперь я должен удалить строку по ссылке на myEdit только:

myQformLayout.removeRow(myEdit)

но для этого нет API. Я могу использовать .takeAt(), но как я могу сделать то аргумента? Как найти индекс метки или индекс myEdit?

3 ответов


вы можете просто запланировать виджет и его метку (если она есть) для удаления, и пусть форма отрегулирует себя соответствующим образом. Ярлык для виджета можно получить с помощью labelForField.

код Qt Python:

    label = myQformLayout.labelForField(myEdit)
    if label is not None:
        label.deleteLater()
    myEdit.deleteLater()

мое решение...

в заголовочный файл:

QPointer<QFormLayout> propertiesLayout; 

в файле cpp:

// Remove existing info before re-populating.
while ( propertiesLayout->count() != 0) // Check this first as warning issued if no items when calling takeAt(0).
{
    QLayoutItem *forDeletion = propertiesLayout->takeAt(0);
    delete forDeletion->widget();
    delete forDeletion;
}

это на самом деле очень хороший момент... нет явной обратной функции для addRow().

чтобы удалить строку, вы можете сделать следующее:

QLineEdit *myEdit;
int row;
ItemRole role;
//find the row
myQFormLayout->getWidgetPosition( myEdit, &row, &role);
//stop if not found  
if(row == -1) return;

ItemRole otheritemrole;
if( role == QFormLayout::FieldRole){
    otheritemrole = QFormLayout::LabelRole;
}
else if( role == QFormLayout::LabelRole){
    otheritemrole = QFormLayout::FieldRole;
}

//get the item corresponding to the widget. this need to be freed
QLayoutItem* editItem = myQFormLayout->itemAt ( int row, role );

QLayoutItem* otherItem = 0;

//get the item corresponding to the other item. this need to be freed too
//only valid if the widget doesn't span the whole row
if( role != QFormLayout::SpanningRole){
    otherItem = myQFormLayout->itemAt( int row, role );
}

//remove the item from the layout
myQFormLayout->removeItem(editItem);
delete editItem;

//eventually remove the other item
if( role != QFormLayout::SpanningRole){
     myQFormLayout->removeItem(otherItem);
     delete otherItem 
}

обратите внимание, что я извлекаю все элементы перед их удалением. Это потому, что я не знаю, изменится ли их роль, когда элемент будет удален. Это поведение не указано, поэтому я перестраховаться. В Qt designer, когда вы удаляете элемент из формы, другой элемент на строка занимает все пространство (что означает его роль изменения...).

может быть, где-то есть функция, и я не только изобрел колесо, но и сделал сломанное...