Skip to content

Commit 49dcdec

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 d3b2ef9 commit 49dcdec

File tree

2 files changed

+46
-23
lines changed

2 files changed

+46
-23
lines changed

src/dci/private/ddcifileengine.cpp

Lines changed: 36 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,29 @@ bool DDciFileEngineIterator::advance()
116115
list = file->list(paths.second);
117116
}
118117

118+
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
119+
const auto filters = this->m_listingFilters;
120+
const bool excludeDirs = filters.testFlag(QDirListing::IteratorFlag::ExcludeDirs);
121+
const bool excludeFiles = filters.testFlag(QDirListing::IteratorFlag::ExcludeFiles);
122+
const bool excludeSymlinks = filters.testFlag(QDirListing::IteratorFlag::ExcludeSpecial) && !filters.testFlag(QDirListing::IteratorFlag::ResolveSymlinks);
123+
#else
124+
const auto filters = this->filters();
125+
const bool excludeDirs = !filters.testFlag(QDir::Dirs);
126+
const bool excludeFiles = !filters.testFlag(QDir::Files);
127+
const bool excludeSymlinks = filters.testFlag(QDir::NoSymLinks);
128+
#endif
129+
119130
for (int i = current + 1; i < list.count(); ++i) {
120131
// 先检查文件类型
121-
const auto filters = this->filters();
122132
const auto fileType = file->type(list.at(i));
123133
if (fileType == DDciFile::Directory) {
124-
if (!filters.testFlag(QDir::Files))
134+
if (excludeDirs)
125135
continue;
126136
} else if (fileType == DDciFile::File) {
127-
if (!filters.testFlag(QDir::Files))
137+
if (excludeFiles)
128138
continue;
129139
} else if (fileType == DDciFile::Symlink) {
130-
if (filters.testFlag(QDir::NoSymLinks))
140+
if (excludeSymlinks)
131141
continue;
132142
} else { // DDciFile::UnknowFile
133143
continue;
@@ -527,7 +537,8 @@ QString DDciFileEngine::fileName(QAbstractFileEngine::FileName file) const
527537
case AbsolutePathName:
528538
return QDir::cleanPath(DCI_FILE_SCHEME + dciFilePath);
529539
case BaseName:
530-
return QFileInfo(subfilePath).baseName();
540+
// QFileInfo::fileName selects FileEngine's BaseName in qt6.
541+
return QFileInfo(subfilePath).fileName();
531542
#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)
532543
case AbsoluteLinkTarget:
533544
#else
@@ -572,22 +583,28 @@ QDateTime DDciFileEngine::fileTime(QAbstractFileEngine::FileTime time) const
572583
return QFileInfo(dciFilePath).fileTime(static_cast<QFile::FileTime>(time));
573584
}
574585
#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)
586+
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
578587
QAbstractFileEngine::IteratorUniquePtr DDciFileEngine::beginEntryList(const QString &path, QDir::Filters filters, const QStringList &filterNames)
579588
#else
580589
DDciFileEngine::Iterator *DDciFileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames)
581590
#endif
582591
{
583592
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
584-
Q_UNUSED(path);
585-
return QAbstractFileEngine::IteratorUniquePtr(new DDciFileEngineIterator(filters, filterNames));
593+
return QAbstractFileEngine::IteratorUniquePtr(new DDciFileEngineIterator(path, filters, filterNames));
586594
#else
587595
return new DDciFileEngineIterator(filters, filterNames);
588596
#endif
589597
}
590598

599+
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
600+
QAbstractFileEngine::IteratorUniquePtr DDciFileEngine::beginEntryList(const QString &path, QDirListing::IteratorFlags filters, const QStringList &filterNames)
601+
{
602+
auto iterator = new DDciFileEngineIterator(path, filters, filterNames);
603+
iterator->m_listingFilters = filters;
604+
return QAbstractFileEngine::IteratorUniquePtr(iterator);
605+
}
606+
#endif
607+
591608
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
592609
QAbstractFileEngine::IteratorUniquePtr DDciFileEngine::endEntryList()
593610
#else

src/dci/private/ddcifileengine_p.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,22 @@ class DDciFileEngineHandler : public QAbstractFileEngineHandler
3333

3434
class DDciFile;
3535
using DDciFileShared = QSharedPointer<DDciFile>;
36+
class DDciFileEngine;
3637
class DDciFileEngineIterator : public QAbstractFileEngineIterator
3738
{
3839
friend class DDciFileEngine;
3940
public:
41+
#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0)
4042
DDciFileEngineIterator(QDir::Filters filters, const QStringList &nameFilters);
43+
#else
44+
DDciFileEngineIterator(const QString& path, QDir::Filters filters, const QStringList &nameFilters);
45+
DDciFileEngineIterator(const QString& path, QDirListing::IteratorFlags filters, const QStringList &nameFilters);
46+
#endif
4147

4248
#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0)
4349
QString next() override;
4450
bool hasNext() const override;
4551
#else
46-
DDciFileEngineIterator(QDirListing::IteratorFlags filters, const QStringList &nameFilters);
4752
bool advance() override;
4853
#endif
4954

@@ -54,6 +59,9 @@ class DDciFileEngineIterator : public QAbstractFileEngineIterator
5459
mutable QStringList list;
5560
mutable int nextValid = -1;
5661
int current = -1;
62+
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
63+
QDirListing::IteratorFlags m_listingFilters {QDirListing::IteratorFlag::Default};
64+
#endif
5765
};
5866

5967
class DDciFileEngine : public QAbstractFileEngine
@@ -111,10 +119,8 @@ class DDciFileEngine : public QAbstractFileEngine
111119
#endif
112120

113121
typedef DDciFileEngineIterator Iterator;
114-
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 1)
122+
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
115123
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)
118124
IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters, const QStringList &filterNames) override;
119125
IteratorUniquePtr endEntryList() override;
120126
#else

0 commit comments

Comments
 (0)