Skip to content

Commit 421510c

Browse files
committed
fix: fix DCI file engine compatibility issues in Qt6
1. Fixed DDciFileEngineIterator constructor signatures for Qt 6.8.0 and above 2. Updated file filtering logic to use new QDirListing::IteratorFlags in Qt 6.8.0+ 3. Modified fileName() method to return fileName() instead of baseName() for BaseName case in Qt6 4. Added m_listingFilters member to store iterator flags in Qt 6.8.0+ 5. Updated beginEntryList methods to pass path parameter to iterator constructor 6. Fixed conditional compilation for different Qt versions to ensure proper API usage The changes address unit test failures in Qt6 environment by adapting to API changes in Qt 6.8.0 and later versions. Specifically: - Qt 6.8.0 introduced new iterator constructors requiring path parameter - QDirListing::IteratorFlags replaced QDir::Filters for some APIs - BaseName behavior changed in Qt6 requiring different implementation - File filtering logic needed updates for new flag handling Log: Fixed DCI file engine compatibility with Qt6 Influence: 1. Test file listing operations with various filter combinations 2. Verify file name extraction for different file types 3. Test symlink handling in file listings 4. Verify directory traversal functionality 5. Test cross-version compatibility with different Qt versions 6. Validate file engine operations in unit tests fix: 修复DCI文件引擎在Qt6下的兼容性问题 1. 为Qt 6.8.0及以上版本修复DDciFileEngineIterator构造函数签名 2. 更新文件过滤逻辑以在Qt 6.8.0+中使用新的QDirListing::IteratorFlags 3. 修改fileName()方法,在Qt6中为BaseName情况返回fileName()而不是 baseName() 4. 添加m_listingFilters成员以在Qt 6.8.0+中存储迭代器标志 5. 更新beginEntryList方法以将路径参数传递给迭代器构造函数 6. 修复不同Qt版本的条件编译以确保正确的API使用 这些更改解决了Qt6环境中的单元测试失败问题,通过适配Qt 6.8.0及更高版本中 的API变更。具体包括: - Qt 6.8.0引入了需要路径参数的新迭代器构造函数 - QDirListing::IteratorFlags在某些API中替换了QDir::Filters - Qt6中BaseName行为变更需要不同的实现 - 文件过滤逻辑需要更新以适应新的标志处理方式 Log: 修复DCI文件引擎与Qt6的兼容性问题 Influence: 1. 测试使用各种过滤器组合的文件列表操作 2. 验证不同文件类型的文件名提取 3. 测试文件列表中的符号链接处理 4. 验证目录遍历功能 5. 测试与不同Qt版本的跨版本兼容性 6. 在单元测试中验证文件引擎操作
1 parent 1e1ff4e commit 421510c

File tree

2 files changed

+48
-23
lines changed

2 files changed

+48
-23
lines changed

src/dci/private/ddcifileengine.cpp

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -76,21 +76,20 @@ static DDciFileShared getDciFile(const QString &dciFilePath, bool usePath = true
7676
return shared;
7777
}
7878

79+
#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0)
7980
DDciFileEngineIterator::DDciFileEngineIterator(QDir::Filters filters, const QStringList &nameFilters)
80-
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
81-
: QAbstractFileEngineIterator(nullptr, filters, nameFilters)
82-
#else
8381
: QAbstractFileEngineIterator(filters, nameFilters)
84-
#endif
8582
{
86-
8783
}
88-
89-
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 1)
90-
DDciFileEngineIterator::DDciFileEngineIterator(QDirListing::IteratorFlags filters, const QStringList &nameFilters)
91-
: QAbstractFileEngineIterator(nullptr, filters, nameFilters)
84+
#else
85+
DDciFileEngineIterator::DDciFileEngineIterator(const QString &path, QDir::Filters filters, const QStringList &nameFilters)
86+
: QAbstractFileEngineIterator(path, filters, nameFilters)
9287
{
88+
}
9389

90+
DDciFileEngineIterator::DDciFileEngineIterator(const QString &path, QDirListing::IteratorFlags filters, const QStringList &nameFilters)
91+
: QAbstractFileEngineIterator(path, filters, nameFilters)
92+
{
9493
}
9594
#endif
9695

@@ -116,18 +115,33 @@ bool DDciFileEngineIterator::advance()
116115
list = file->list(paths.second);
117116
}
118117

118+
bool excludeDirs = false, excludeFiles = false, excludeSymlinks = false;
119+
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
120+
if (this->m_listingFilters) {
121+
const auto filters = this->m_listingFilters.value();
122+
excludeDirs = filters.testFlag(QDirListing::IteratorFlag::ExcludeDirs);
123+
excludeFiles = filters.testFlag(QDirListing::IteratorFlag::ExcludeFiles);
124+
excludeSymlinks = filters.testFlag(QDirListing::IteratorFlag::ExcludeSpecial) && !filters.testFlag(QDirListing::IteratorFlag::ResolveSymlinks);
125+
} else
126+
#endif
127+
{
128+
const auto filters = this->filters();
129+
excludeDirs = !filters.testFlag(QDir::Dirs);
130+
excludeFiles = !filters.testFlag(QDir::Files);
131+
excludeSymlinks = filters.testFlag(QDir::NoSymLinks);
132+
}
133+
119134
for (int i = current + 1; i < list.count(); ++i) {
120135
// 先检查文件类型
121-
const auto filters = this->filters();
122136
const auto fileType = file->type(list.at(i));
123137
if (fileType == DDciFile::Directory) {
124-
if (!filters.testFlag(QDir::Files))
138+
if (excludeDirs)
125139
continue;
126140
} else if (fileType == DDciFile::File) {
127-
if (!filters.testFlag(QDir::Files))
141+
if (excludeFiles)
128142
continue;
129143
} else if (fileType == DDciFile::Symlink) {
130-
if (filters.testFlag(QDir::NoSymLinks))
144+
if (excludeSymlinks)
131145
continue;
132146
} else { // DDciFile::UnknowFile
133147
continue;
@@ -527,7 +541,7 @@ QString DDciFileEngine::fileName(QAbstractFileEngine::FileName file) const
527541
case AbsolutePathName:
528542
return QDir::cleanPath(DCI_FILE_SCHEME + dciFilePath);
529543
case BaseName:
530-
return QFileInfo(subfilePath).baseName();
544+
return QFileInfo(subfilePath).fileName();
531545
#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)
532546
case AbsoluteLinkTarget:
533547
#else
@@ -572,22 +586,28 @@ QDateTime DDciFileEngine::fileTime(QAbstractFileEngine::FileTime time) const
572586
return QFileInfo(dciFilePath).fileTime(static_cast<QFile::FileTime>(time));
573587
}
574588
#endif
575-
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 1)
576-
QAbstractFileEngine::IteratorUniquePtr DDciFileEngine::beginEntryList(const QString &path, QDirListing::IteratorFlags filters, const QStringList &filterNames)
577-
#elif QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
589+
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
578590
QAbstractFileEngine::IteratorUniquePtr DDciFileEngine::beginEntryList(const QString &path, QDir::Filters filters, const QStringList &filterNames)
579591
#else
580592
DDciFileEngine::Iterator *DDciFileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames)
581593
#endif
582594
{
583595
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
584-
Q_UNUSED(path);
585-
return QAbstractFileEngine::IteratorUniquePtr(new DDciFileEngineIterator(filters, filterNames));
596+
return QAbstractFileEngine::IteratorUniquePtr(new DDciFileEngineIterator(path, filters, filterNames));
586597
#else
587598
return new DDciFileEngineIterator(filters, filterNames);
588599
#endif
589600
}
590601

602+
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
603+
QAbstractFileEngine::IteratorUniquePtr DDciFileEngine::beginEntryList(const QString &path, QDirListing::IteratorFlags filters, const QStringList &filterNames)
604+
{
605+
auto iterator = new DDciFileEngineIterator(path, filters, filterNames);
606+
iterator->m_listingFilters = filters;
607+
return QAbstractFileEngine::IteratorUniquePtr(iterator);
608+
}
609+
#endif
610+
591611
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
592612
QAbstractFileEngine::IteratorUniquePtr DDciFileEngine::endEntryList()
593613
#else

src/dci/private/ddcifileengine_p.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,17 @@ class DDciFileEngineIterator : public QAbstractFileEngineIterator
3737
{
3838
friend class DDciFileEngine;
3939
public:
40+
#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0)
4041
DDciFileEngineIterator(QDir::Filters filters, const QStringList &nameFilters);
42+
#else
43+
DDciFileEngineIterator(const QString &path, QDir::Filters filters, const QStringList &nameFilters);
44+
DDciFileEngineIterator(const QString &path, QDirListing::IteratorFlags filters, const QStringList &nameFilters);
45+
#endif
4146

4247
#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0)
4348
QString next() override;
4449
bool hasNext() const override;
4550
#else
46-
DDciFileEngineIterator(QDirListing::IteratorFlags filters, const QStringList &nameFilters);
4751
bool advance() override;
4852
#endif
4953

@@ -54,6 +58,9 @@ class DDciFileEngineIterator : public QAbstractFileEngineIterator
5458
mutable QStringList list;
5559
mutable int nextValid = -1;
5660
int current = -1;
61+
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
62+
std::optional<QDirListing::IteratorFlags> m_listingFilters {std::nullopt};
63+
#endif
5764
};
5865

5966
class DDciFileEngine : public QAbstractFileEngine
@@ -111,10 +118,8 @@ class DDciFileEngine : public QAbstractFileEngine
111118
#endif
112119

113120
typedef DDciFileEngineIterator Iterator;
114-
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 1)
121+
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
115122
IteratorUniquePtr beginEntryList(const QString &path, QDirListing::IteratorFlags filters, const QStringList &filterNames) override;
116-
IteratorUniquePtr endEntryList() override;
117-
#elif QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
118123
IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters, const QStringList &filterNames) override;
119124
IteratorUniquePtr endEntryList() override;
120125
#else

0 commit comments

Comments
 (0)