如何以编程方式简单地删除QFormLayout中的行

时间:2012-12-12 12:36:40

标签: qt layout pyqt

我有这段代码:

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

现在我必须通过仅引用myEdit删除该行:

myQformLayout.removeRow(myEdit)

但是没有API。我可以使用.takeAt(),但我怎么能得到这个论点?如何找到标签索引或myEdit的索引?

3 个答案:

答案 0 :(得分:9)

您可以只安排窗口小部件及其标签(如果有)进行删除,然后让窗体自行调整。可以使用labelForField检索窗口小部件的标签。

Python Qt代码:

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

答案 1 :(得分:1)

我的解决方案......

头文件中的

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;
}

答案 2 :(得分:0)

这实际上是一个非常好的观点...... 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中,当您从表单中删除项目时,其他项目就在上面 该行占用了所有空间(这意味着他的角色改变了......)。

也许在某个地方有一个功能,不仅我重新发明了轮子,而且我做了一个破碎的...