Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Using QFileSystemModel, QTreeView, and QSortFilterProxyModel

Using QFileSystemModel, QTreeView, and QSortFilterProxyModel

Scheduled Pinned Locked Moved Solved General and Desktop
30 Posts 6 Posters 1.9k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • jeremy_kJ Offline
    jeremy_kJ Offline
    jeremy_k
    wrote on last edited by
    #9

    It would help to have a minimal working example program to look at. This functions for me as I expect with Qt 6.9 on macOS:

    #include <QApplication>
    #include <QFileSystemModel>
    #include <QSortFilterProxyModel>
    #include <QTreeView>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QFileSystemModel model;
        model.setRootPath("/tmp");
    
        QSortFilterProxyModel proxyModel;
        proxyModel.setSourceModel(&model);
    
        QTreeView view;
        view.setModel(&proxyModel);
        view.show();
    
        return a.exec();
    }
    

    Asking a question about code? http://eel.is/iso-c++/testcase/

    1 Reply Last reply
    3
    • Z Offline
      Z Offline
      Zbigniew-Sch
      wrote on last edited by
      #10

      Sorry, but you didn't read the question. It's about the following: renaming a directory and
      deleting a file from that directory, but the file item isn't being deleted from QTreeView.

      JonBJ jeremy_kJ 2 Replies Last reply
      0
      • Z Zbigniew-Sch

        Sorry, but you didn't read the question. It's about the following: renaming a directory and
        deleting a file from that directory, but the file item isn't being deleted from QTreeView.

        JonBJ Online
        JonBJ Online
        JonB
        wrote on last edited by JonB
        #11

        @Zbigniew-Sch
        You still need to provide a minimal example of code you use which shows this behaviour:

        • We need to see exactly what your code is.
        • If someone wants to test behaviour why should they have to write code from scratch? (I did read your question yesterday, but no code => I'm not going to try anything.)

        So... can you confirm that if you try precisely the code in @jeremy_k's code the problem arises for you? Assuming so, then: as I understand it, you are performing a directory rename and then a delete file within the renamed directory, both of these actions from the QTreeView? (You are not doing these file operations externally to your program on the file system, are you?) So someone else needs to do that while running the same code as you. I don't know whether the QTreeView bound to a file system offers you "rename" and "delete" automatically, but if not then we need you add whatever minimal for that to the code for people to try.

        1 Reply Last reply
        2
        • Z Zbigniew-Sch

          Sorry, but you didn't read the question. It's about the following: renaming a directory and
          deleting a file from that directory, but the file item isn't being deleted from QTreeView.

          jeremy_kJ Offline
          jeremy_kJ Offline
          jeremy_k
          wrote on last edited by
          #12

          @Zbigniew-Sch said in Using QFileSystemModel, QTreeView, and QSortFilterProxyModel:

          Sorry, but you didn't read the question. It's about the following: renaming a directory and
          deleting a file from that directory, but the file item isn't being deleted from QTreeView.

          Yes, I did read the question. The MWE I posted behaves as I expect, given an out-of-process directory renaming and file deletion.

          There may be a bug. Without a program to examine, it's unclear whether it is likely to lie in the OS, library, application code, or understanding of how each behaves.

          Asking a question about code? http://eel.is/iso-c++/testcase/

          JonBJ 1 Reply Last reply
          1
          • jeremy_kJ jeremy_k

            @Zbigniew-Sch said in Using QFileSystemModel, QTreeView, and QSortFilterProxyModel:

            Sorry, but you didn't read the question. It's about the following: renaming a directory and
            deleting a file from that directory, but the file item isn't being deleted from QTreeView.

            Yes, I did read the question. The MWE I posted behaves as I expect, given an out-of-process directory renaming and file deletion.

            There may be a bug. Without a program to examine, it's unclear whether it is likely to lie in the OS, library, application code, or understanding of how each behaves.

            JonBJ Online
            JonBJ Online
            JonB
            wrote on last edited by JonB
            #13

            @jeremy_k said in Using QFileSystemModel, QTreeView, and QSortFilterProxyModel:

            given an out-of-process directory renaming and file deletion

            Oh, I had thought it more likely OP was doing in-process operations via code on the QTreeView! Shows how simple details matter :)

            jeremy_kJ 1 Reply Last reply
            0
            • JonBJ JonB

              @jeremy_k said in Using QFileSystemModel, QTreeView, and QSortFilterProxyModel:

              given an out-of-process directory renaming and file deletion

              Oh, I had thought it more likely OP was doing in-process operations via code on the QTreeView! Shows how simple details matter :)

              jeremy_kJ Offline
              jeremy_kJ Offline
              jeremy_k
              wrote on last edited by
              #14

              @JonB said in Using QFileSystemModel, QTreeView, and QSortFilterProxyModel:

              @jeremy_k said in Using QFileSystemModel, QTreeView, and QSortFilterProxyModel:

              given an out-of-process directory renaming and file deletion

              Oh, I had thought it more likely OP was doing in-process operations via code on the QTreeView! Shows how simple details matter :)

              +1 on details mattering. I didn't see a point in guessing and complicating the code for an example of a MWE.

              Asking a question about code? http://eel.is/iso-c++/testcase/

              JonBJ 1 Reply Last reply
              0
              • jeremy_kJ jeremy_k

                @JonB said in Using QFileSystemModel, QTreeView, and QSortFilterProxyModel:

                @jeremy_k said in Using QFileSystemModel, QTreeView, and QSortFilterProxyModel:

                given an out-of-process directory renaming and file deletion

                Oh, I had thought it more likely OP was doing in-process operations via code on the QTreeView! Shows how simple details matter :)

                +1 on details mattering. I didn't see a point in guessing and complicating the code for an example of a MWE.

                JonBJ Online
                JonBJ Online
                JonB
                wrote on last edited by JonB
                #15

                @jeremy_k
                OP is Windows, you are MacOS. I am Linux but not tested. May have to await a Windows user. If it's out-of-process it relies on the QFileSystemWatcher and the OS behaviour for notifications, that might or might not be relevant. If it's that area OP could debug-out to confirm the QFSW signals being emitted.

                If it's a fault in higher-level Qt logic instead we should be able to reproduce, but OP may have to confirm exactly what he does in outside world.

                And if it is an issue only when there is a QSortFilterProxyModel we need to know whether OP has set any sorting or filtering on it.

                jeremy_kJ 1 Reply Last reply
                0
                • JonBJ JonB

                  @jeremy_k
                  OP is Windows, you are MacOS. I am Linux but not tested. May have to await a Windows user. If it's out-of-process it relies on the QFileSystemWatcher and the OS behaviour for notifications, that might or might not be relevant. If it's that area OP could debug-out to confirm the QFSW signals being emitted.

                  If it's a fault in higher-level Qt logic instead we should be able to reproduce, but OP may have to confirm exactly what he does in outside world.

                  And if it is an issue only when there is a QSortFilterProxyModel we need to know whether OP has set any sorting or filtering on it.

                  jeremy_kJ Offline
                  jeremy_kJ Offline
                  jeremy_k
                  wrote on last edited by
                  #16

                  @JonB said in Using QFileSystemModel, QTreeView, and QSortFilterProxyModel:

                  If it's out-of-process it relies on the QFileSystemWatcher and the OS behaviour for notifications, that might or might not be relevant.

                  This seems unlikely to be relevant. The original post says that connecting the file system model directly to the view does what is expected. I don't expect to find any file or operating system specific code in the proxy model.

                  Asking a question about code? http://eel.is/iso-c++/testcase/

                  1 Reply Last reply
                  0
                  • Z Offline
                    Z Offline
                    Zbigniew-Sch
                    wrote on last edited by
                    #17

                    I wrote a small program and I'm having the same problem.
                    This is definitely a bug in Qt, without QSortFilterProxyModel, everything works correctly.
                    I renamed the directory in my program and deleted a file from that directory
                    using Windows Explorer – it works correctly now. I'm out of ideas.

                    1 Reply Last reply
                    0
                    • jeremy_kJ Offline
                      jeremy_kJ Offline
                      jeremy_k
                      wrote on last edited by
                      #18

                      The general advice from this thread remains valid:

                      • The existence of a test program doesn't help confirm or deny if nobody else can see the program.
                      • Bug reports can be filed at https://bugreports.qt.io/. Chances are high that whoever responds will also ask for a demonstrator.

                      Asking a question about code? http://eel.is/iso-c++/testcase/

                      Christian EhrlicherC 1 Reply Last reply
                      0
                      • jeremy_kJ jeremy_k

                        The general advice from this thread remains valid:

                        • The existence of a test program doesn't help confirm or deny if nobody else can see the program.
                        • Bug reports can be filed at https://bugreports.qt.io/. Chances are high that whoever responds will also ask for a demonstrator.
                        Christian EhrlicherC Online
                        Christian EhrlicherC Online
                        Christian Ehrlicher
                        Lifetime Qt Champion
                        wrote on last edited by
                        #19

                        @jeremy_k said in Using QFileSystemModel, QTreeView, and QSortFilterProxyModel:

                        Chances are high that whoever responds will also ask for a demonstrator.

                        Higher than high - otherwise it will be closed sooner or later with 'Needs more information'

                        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                        Visit the Qt Academy at https://academy.qt.io/catalog

                        1 Reply Last reply
                        0
                        • Z Offline
                          Z Offline
                          Zbigniew-Sch
                          wrote on last edited by
                          #20

                          How can I upload an entire example project as a ZIP file?

                          JonBJ 1 Reply Last reply
                          0
                          • Z Zbigniew-Sch

                            How can I upload an entire example project as a ZIP file?

                            JonBJ Online
                            JonBJ Online
                            JonB
                            wrote on last edited by JonB
                            #21

                            @Zbigniew-Sch
                            People don't like looking at external and zip files. The forum does not offer this. We don't need a project for this issue.

                            People are expecting a minimal reproducible example. Like a hundred lines. Stripped of anything and everything not required to show the behaviour, which you spend time doing. You have @jeremy_k's starting point code earlier in 20-odd lines. How much do you need to add to that to show it goes wrong for you?

                            1 Reply Last reply
                            0
                            • Z Offline
                              Z Offline
                              Zbigniew-Sch
                              wrote on last edited by
                              #22

                              Here is my example program to reproduce the problem:

                              Header of QMainWindow:

                              class LZImageViewerTest : public QMainWindow
                              {
                                  Q_OBJECT
                              
                              public:
                                  LZImageViewerTest(QWidget *parent = nullptr);
                                  ~LZImageViewerTest();
                              
                                  QLZFileSystemModel *pcoGetFileSystemModel() { return m_pcoFileSystemModel; };
                                  QSortFilterProxyModel *pcoSortFilterProxyModel() { return m_pcoSortFilterProxyModel;}
                              
                                  static LZImageViewerTest* pcoGetMainWindow() { return m_stMainWindow; }
                              
                                  static LZImageViewerTest* m_stMainWindow;
                              
                              private:
                                  Ui::LZImageViewerTestClass ui;
                              
                                  QModelIndex m_coRootModelIndex;
                                  QLZTreeView *m_pcoTreeView;
                                  QHBoxLayout *m_pcoMainLayout;
                                  QLZMainWidget *m_pcoMainWidget;
                                  QLZFileSystemModel *m_pcoFileSystemModel;
                                  QSortFilterProxyModel *m_pcoSortFilterProxyModel;
                              };
                              
                              
                              

                              QMainWindow cpp file:

                              LZImageViewerTest *LZImageViewerTest::m_stMainWindow = nullptr;
                              
                              LZImageViewerTest::LZImageViewerTest(QWidget *parent)
                                  : QMainWindow(parent)
                              {
                                  ui.setupUi(this);
                              
                                  m_stMainWindow = this;
                                  QScreen* pcoScreen = QGuiApplication::primaryScreen();
                                  QRect coScreenGeometry = pcoScreen->geometry();
                                  resize(QSize(coScreenGeometry.width() - 1400, coScreenGeometry.height() - 600));
                              
                                  // Center main window 
                                  QRect mainFrameViewRect = frameGeometry();
                                  QPoint centerPoint = screen()->availableGeometry().center();
                              
                                  mainFrameViewRect.moveCenter(centerPoint);
                                  move(mainFrameViewRect.topLeft());
                              
                                  m_pcoTreeView = new QLZTreeView();
                                  m_pcoFileSystemModel = new QLZFileSystemModel();
                                  m_coRootModelIndex= m_pcoFileSystemModel->setRootPath("D:\\Test");
                              
                                  m_pcoSortFilterProxyModel = new QSortFilterProxyModel();
                                  m_pcoSortFilterProxyModel->setSourceModel(m_pcoFileSystemModel);
                                  m_pcoSortFilterProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
                                  m_pcoSortFilterProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
                              
                                  m_pcoTreeView->setModel(m_pcoSortFilterProxyModel);
                                  m_pcoTreeView->setRootIndex(m_pcoSortFilterProxyModel->mapFromSource(m_coRootModelIndex));
                              
                                  m_pcoMainWidget = new QLZMainWidget(this);
                                  m_pcoMainWidget->setContentsMargins(3, 4, 4, 4);
                                  m_pcoMainLayout = new QHBoxLayout(this);
                              
                                  m_pcoMainLayout->addWidget(m_pcoTreeView);
                                  m_pcoMainWidget->setLayout(m_pcoMainLayout);
                                  setCentralWidget(m_pcoMainWidget);
                              }
                              
                              LZImageViewerTest::~LZImageViewer
                              {}
                              

                              QLZFileSystemModel cpp file:

                              
                              QLZFileSystemModel::QLZFileSystemModel(QObject* parent)
                                  : QFileSystemModel(parent)
                              {
                              
                              }
                              
                              Qt::ItemFlags QLZFileSystemModel::flags(const QModelIndex& index) const
                              {
                                  Qt::ItemFlags flags = QFileSystemModel::flags(index);
                                  flags |= Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
                                  return flags;
                              }
                              
                              QLZFileSystemModel::~QLZFileSystemModel()
                              {
                              }
                              

                              QLZTreeView cpp file:

                              QLZTreeView::QLZTreeView(QWidget* parent): QTreeView(parent)
                              {
                              	setContextMenuPolicy(Qt::CustomContextMenu);
                              	connect(this, &QWidget::customContextMenuRequested, this, &QLZTreeView::customContextMenu);
                              }
                              
                              QLZTreeView::~QLZTreeView()
                              {
                              }
                              
                              void QLZTreeView::customContextMenu(const QPoint& point)
                              {
                              	QMenu coContextMenu;
                              	QModelIndex coCurrentIndex = currentIndex();
                              
                              	if (!coCurrentIndex.isValid())
                              		return;
                              
                              	QAction* pcoRenameObjectsAction = coContextMenu.addAction(tr("Rename"));
                              	connect(pcoRenameObjectsAction, &QAction::triggered, this, [this, coCurrentIndex] { renameCurrentObject(coCurrentIndex); });
                              
                              	QAction* pcoDeleteObjectsAction = coContextMenu.addAction(tr("Delete"));
                              	connect(pcoDeleteObjectsAction, &QAction::triggered, this, [this, coCurrentIndex] { deleteCurrentObject(coCurrentIndex); });
                              
                              	coContextMenu.exec(viewport()->mapToGlobal(point));
                              
                              	QList<QAction*> coActionsList = coContextMenu.actions();
                              	foreach(QAction * pcoAction, coActionsList)
                              		delete pcoAction;
                              }
                              
                              void QLZTreeView::renameCurrentObject(QModelIndex coCurrentIndex)
                              {
                              	if (!coCurrentIndex.isValid())
                              		return;
                              
                              	int iCurrentRow = coCurrentIndex.column();
                              	if (iCurrentRow != 0)
                              		return;
                              
                              	edit(currentIndex());
                              
                              	QList<QLineEdit*> coEditorList = findChildren<QLineEdit*>();
                              	if (coEditorList.size() == 0)
                              		return;
                              
                              	coEditorList[0]->installEventFilter(this);
                              	coEditorList[0]->setAlignment(Qt::AlignCenter);
                              }
                              
                              void QLZTreeView::closeEditor(QWidget* coEditor, QAbstractItemDelegate::EndEditHint hint)
                              {
                              	QSortFilterProxyModel* pcoSortFilterProxyModel = LZImageViewerTest::pcoGetMainWindow()->pcoSortFilterProxyModel();
                              	pcoSortFilterProxyModel->invalidate();
                              	QTreeView::closeEditor(coEditor, hint);
                              }
                              
                              void QLZTreeView::deleteCurrentObject(QModelIndex coCurrentIndex)
                              {
                              	if (!coCurrentIndex.isValid())
                              		return;
                              
                              	int iCurrentRow = coCurrentIndex.column();
                              	if (iCurrentRow != 0)
                              		return;
                              
                              	QList<QString> coSelectedIndexesPathList;
                              	QModelIndexList coIndexesList = selectedIndexes();
                              	QFileSystemModel *pcoFileSystemModel = LZImageViewerTest::pcoGetMainWindow()->pcoGetFileSystemModel();
                              	QSortFilterProxyModel *pcoSortFilterProxyModel = LZImageViewerTest::pcoGetMainWindow()->pcoSortFilterProxyModel();
                              
                              	for (int i = 0; i < coIndexesList.size(); i++)
                              	{
                              		if (coIndexesList[i].column() == 0)
                              		{
                                                      // Delete file using "QFile::moveToTrash()"
                              			//QString coSelectedObjectPath = pcoFileSystemModel->filePath(pcoSortFilterProxyModel->mapToSource(coIndexesList[i]));
                              			//bool bRes = QFile::moveToTrash(coSelectedObjectPath);
                                                     
                                                      // Delete file using "pcoFileSystemModel->remove()"
                              			bool bRes = pcoFileSystemModel->remove(pcoSortFilterProxyModel->mapToSource(coIndexesList[i]));
                              			pcoSortFilterProxyModel->invalidate();
                              		}
                              	}
                              }
                              
                              1 Reply Last reply
                              0
                              • Christian EhrlicherC Online
                                Christian EhrlicherC Online
                                Christian Ehrlicher
                                Lifetime Qt Champion
                                wrote on last edited by
                                #23

                                This is to much. No need for an ui file , no context menu stuff and other stuff.

                                Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                                Visit the Qt Academy at https://academy.qt.io/catalog

                                1 Reply Last reply
                                0
                                • Z Offline
                                  Z Offline
                                  Zbigniew-Sch
                                  wrote on last edited by
                                  #24

                                  Sorry, I don't understand you. This is a minimal example to reproduce the problem.
                                  If I completely reduce the source code, you won't see the dependencies and you won't be able to reproduce the problem.

                                  GrecKoG 1 Reply Last reply
                                  0
                                  • Christian EhrlicherC Online
                                    Christian EhrlicherC Online
                                    Christian Ehrlicher
                                    Lifetime Qt Champion
                                    wrote on last edited by
                                    #25

                                    If you can't provide a real mre then I am out, sorry.

                                    Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                                    Visit the Qt Academy at https://academy.qt.io/catalog

                                    1 Reply Last reply
                                    0
                                    • Z Offline
                                      Z Offline
                                      Zbigniew-Sch
                                      wrote on last edited by
                                      #26

                                      Does nobody have any suggestions as to what the error could be, or is this actually a Qt bug?

                                      1 Reply Last reply
                                      0
                                      • Z Zbigniew-Sch

                                        I'm using Windows 11 and Qt 6.10. I think this is a bug, or does anyone have a solution?
                                        I've tried various changes, but it doesn't work.

                                        JonBJ Online
                                        JonBJ Online
                                        JonB
                                        wrote last edited by
                                        #27

                                        @Zbigniew-Sch said in Using QFileSystemModel, QTreeView, and QSortFilterProxyModel:

                                        I'm using Windows 11 and Qt 6.10. I think this is a bug, or does anyone have a solution?

                                        Is there any chance what you are seeing using 6.10 turns out to be caused by https://forum.qt.io/topic/164009/qsortfilterproxy-sorting-works-on-linux-but-fails-on-windows/6 and https://qt-project.atlassian.net/browse/QTBUG-141830 ? But I think that only occurs when using a static build? Yours isn't a static build is it?

                                        1 Reply Last reply
                                        0
                                        • Z Offline
                                          Z Offline
                                          Zbigniew-Sch
                                          wrote last edited by
                                          #28

                                          I am using Qt 6.10.1 under Windows 11
                                          Static build - NO

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved