背景:最近用到了treeView控件,来显示指定文件夹里的所有文件,文件因为有更新,因此实现了一个右键菜单点击刷新列表的功能。

本来以为这个功能很简单,只需要把原来的treeview或者model删除了,重新加载一次就好了,也看到有网友提供这样类似的方法,但是自己尝试了多次都没有实现,清空model->clear()后,程序直接崩溃,貌似原因是这样做了model将不能再次被使用。。。在网上看了很多资料,都没有找到一种合适的解决办法。

解决办法:最终自己只能用笨方法解决了。 思路:遍历文件夹中的文件与treeview中的项,把两者作比较,如果列表中已经存在了文件,就不再添加,否则才添加文件,即可以达到更新列表的功能需求 。(虽然复杂了许多的感觉,但至少功能实现了)

下面是实现该功能的代码,我是在工作目录下的lxjcData文件夹里查找txt文件,并添加到treeview列表里。

QString filePath1 = ".//lxjcData";
    QDir *dir1 = new QDir(filePath1);
    QStringList filter1;
    filter1 << "*.txt";        //用来文件过滤用的,如果你要指定文件后缀名,这样写filter<<"*.dat"  就好了,如果要指定多个后缀名,这样写filter<<"*.dat"<<"*.txt"就行了
    dir1->setNameFilters(filter1);
    QList<QFileInfo> *fileInfo1 = new QList<QFileInfo>(dir1->entryInfoList(filter1));
    if(!model->item(0)->hasChildren())          //先判断之前添加的固定项item(0)下面有没有子项,没有就添加所有文件
        for(int i = 0; i<fileInfo1->count(); i++)
            model->item(0)->appendRow(new QStandardItem(fileInfo1->at(i).fileName()));
    else    //如果有子项,表示已经存在一些文件在列表中,需要遍历文件夹与所有子项作比较,列表里没有的就添加进去
        Q_ASSERT(model->item(0));
        for(int i = 0; i<fileInfo1->count(); i++)                       //遍历文件夹
            bool isExist = false;                                       //用作表明文件在列表是否已经存在,若存在则为true
            QString s1 = fileInfo1->at(i).fileName();
            for(int j = 0; j < model->item(0)->rowCount(); j++)         //遍历item(0)下的子项,即已经显示的文件
                QStandardItem * childitem = model->item(0)->child(j);
                QString s2 = childitem->text();
                if(s1.compare(s2) == 0)                                 //将文件夹下的文件与列表里的所有作比较,相等返回0,有一个相对就表明已经存在
                    isExist = true;                                     //存在就改为true
            if(isExist == false)                                        //与列表比较忘了仍然为假的话,表示列表里没有这个文件,则添加进去
                model->item(0)->appendRow(new QStandardItem(s1));
                    背景:最近用到了treeView控件,来显示指定文件夹里的所有文件,文件因为有更新,因此实现了一个右键菜单点击刷新列表的功能。本来以为这个功能很简单,只需要把原来的treeview或者model删除了,重新加载一次就好了,也看到有网友提供这样类似的方法,但是自己尝试了多次都没有实现,清空model-&gt;clear()后,程序直接崩溃,貌似原因是这样做了model将不能再次被使用。。。在网上看了很多资料,都没有找到一种合适的解决办法。解决办法:最终自己只能用笨方法解决了。思路:遍历文件夹中的文件与tr
QTreeView一般和相应的QXXModel合用,形成Model/View结构.
QTreeView是一个视图类,你需要手动给其指定模型类,才能够显示数据。QTreeWidget继承自QTreeView,是封闭了默认Model的QTreeView,应用了模型/视图的编程方法,将数据和显示分开了。
就灵活性来讲,QTreeView要灵活些。
QTreewidg.
1. 首先,创建一个新的 Qt Widgets 应用程序项目。
2. 在主窗口中添加一个 QTreeView 控件,并在其上方添加一个 QPushButton 控件,用于触发导出操作。
3. 在 QPushButton 的 clicked() 信号的槽函数中,编写导出操作的代码。
下面是一个简单的示例代码,用于将 QTreeView 中的数据导出为 XML 文件:
```cpp
#include <QMainWindow>
#include <QTreeView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QPushButton>
#include <QXmlStreamWriter>
#include <QFileDialog>
class MainWindow : public QMainWindow
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr)
        : QMainWindow(parent)
        treeView = new QTreeView(this);
        setCentralWidget(treeView);
        model = new QStandardItemModel(this);
        model->setHorizontalHeaderLabels({"Name", "Value"});
        QStandardItem *rootItem = new QStandardItem("Root");
        model->appendRow(rootItem);
        QStandardItem *childItem1 = new QStandardItem("Child 1");
        childItem1->setData("Value 1", Qt::DisplayRole);
        rootItem->appendRow(childItem1);
        QStandardItem *childItem2 = new QStandardItem("Child 2");
        childItem2->setData("Value 2", Qt::DisplayRole);
        rootItem->appendRow(childItem2);
        treeView->setModel(model);
        treeView->expandAll();
        QPushButton *exportButton = new QPushButton("Export", this);
        connect(exportButton, &QPushButton::clicked, this, &MainWindow::exportXml);
        setToolBarButton(exportButton);
private slots:
    void exportXml()
        QString fileName = QFileDialog::getSaveFileName(this, "Save XML File", "", "XML Files (*.xml)");
        if (!fileName.isEmpty())
            QFile file(fileName);
            if (file.open(QIODevice::WriteOnly))
                QXmlStreamWriter writer(&file);
                writer.setAutoFormatting(true);
                writer.writeStartDocument();
                writer.writeStartElement("tree");
                for (int i = 0; i < model->rowCount(); ++i)
                    QStandardItem *item = model->item(i, 0);
                    writeItem(writer, item);
                writer.writeEndElement();
                writer.writeEndDocument();
                file.close();
private:
    void writeItem(QXmlStreamWriter &writer, QStandardItem *item)
        writer.writeStartElement("item");
        writer.writeAttribute("name", item->text());
        if (item->rowCount() > 0)
            for (int i = 0; i < item->rowCount(); ++i)
                QStandardItem *childItem = item->child(i);
                writeItem(writer, childItem);
            writer.writeAttribute("value", item->data(Qt::DisplayRole).toString());
        writer.writeEndElement();
    QTreeView *treeView;
    QStandardItemModel *model;
在此示例中,我们创建了一个简单的 QTreeView,并为其添加了一些数据。点击导出按钮时,将打开文件对话框,用户可以选择要保存的文件路径和名称。然后,将 QTreeView 中的数据遍历,并将其写入 XML 文件中。在写入 XML 文件时,我们使用了 QXmlStreamWriter 类来处理 XML 内容的编写。
在这个示例中,我们只是将 QTreeView 中的数据导出为 XML 文件,并没有实现将 XML 文件导入回 QTreeView 的功能。如果需要实现这个功能,需要编写另一个函数来读取 XML 文件并将其转换为 QTreeView 中的数据。