我曾经在我的应用程序中基于treewidget添加功能。

当右键单击一个项目时,我可以在使用USB的FS上创建一个文件夹。

那主要是说,当在TreeWidget上选择一个项目时,我得到它的名称并检查它是否是一个文件夹,如果是,我创建一个孩子并添加一个新文件夹并命名。

在FS上完成文件夹创建,我使用的是:

void TreeView::onAddFolderAction() {
    char *parent_folder_name;
    QList<QTreeWidgetItem *> item;
    bool isFolder;

    item = this->selectedItems();
    if (item.empty())
        parent_folder_name = NULL;
    else {
        QString str = item[0]->text(0);
        QByteArray latin_str = str.toLatin1();
        parent_folder_name = latin_str.data();
    }
    setParentFolder(parent_folder_name);

    if(!item.empty())
        isFolder = m_device.isParentFolder(parent_folder_name);
        if(isFolder == false)
            return;

    QTreeWidgetItem* child = new QTreeWidgetItem();
    child->setText(0, "New Folder");
    child->setText(1, "--");
    child->setText(2, "--");
    child->setFlags(child->flags() | Qt::ItemIsEditable);
    if(!item.empty()) {
        item[0]->addChild(child);
        item[0]->setExpanded(true);
    }
    else
        addTopLevelItem(child);

    this->editItem(child);
    this->setCurrentItem(child);
    connect(this, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this,  SLOT(onTreeItemChanged()));
    }


当选择左键单击操作并添加文件夹时,此代码将连接到CONNECT。

我这样做是为了避免重命名时使用对话框。我在执行的操作中添加了一个名为“新文件夹”的项目,使其可编辑,并允许用户对其进行更改。当用户按下Enter键时,itemChanged信号被触发,我开始onTreeItemChanged。

QList<QTreeWidgetItem *> items;
bool isFolderCreated;
items = this->selectedItems();
QString str = items[0]->text(0);
QByteArray latin_str = str.toLatin1();
char *newFolder = latin_str.data();
char *parent = getParentFolder();

isFolderCreated = m_device.CreateFolder(newFolder, parent);


我的问题是父级不包含绑定名称。

我正在使用onAddFolderAction备份它

setParentFolder(parent_folder_name);


并使用

getParentFolder();


两者都声明如下

void TreeView::setParentFolder(char *name) {
    this->ParentFolder = name;
}

char *TreeView::getParentFolder() {
    return this->ParentFolder;
}


使用getParent时,返回的值不正确。但似乎值早已损坏。

在AddFolderACtion()上,我有:

   else {
        QString str = item[0]->text(0);
        QByteArray latin_str = str.toLatin1();
        parent_folder_name = latin_str.data();
    }
    setParentFolder(parent_folder_name);


parent_folder_name包含“ BLABLA”,但在setParentFolder上逐步移动时,parent_folder_name更改为“ XFZV”奇怪的角色。

知道为什么吗?

最佳答案

在代码中

else {
    QString str = item[0]->text(0);
    QByteArray latin_str = str.toLatin1();
    parent_folder_name = latin_str.data();
}
setParentFolder(parent_folder_name);


变量latin_strelse块内是局部的,一旦else块结束,它将超出范围并被破坏。这给您留下了迷离的指针,指向现在已破坏和未分配的内存,当您取消引用它时会导致undefined behavior

我的建议是尽可能使用QString,并且仅在实际需要时才转换为指针(即使您需要多次执行此操作)。或者,或者将其余代码更改为接受QString(这将是IMO的更好解决方案)。

09-06 13:42