Qt 6.8中QLineEdit触发QFileDialog后无限聚焦循环问题求助

QFileDialog关闭后重复打开的解决方法
我在Ubuntu 22.04系统下使用VS Code,基于Qt 6.8与C++23编写一个简易工具,其中包含两个只读QLineEdit控件,用于选择源目录和目标目录——用户聚焦控件时会打开QFileDialog,无需手动输入路径。但现在遇到问题:关闭QFileDialog后会立即重新打开,原因是焦点仍停留在QLineEdit上。
问题根源
自定义的DirectoryLineEdit重写了focusInEvent,在事件触发时打开模态QFileDialog。模态对话框关闭后,系统会自动将焦点返还给触发它的QLineEdit,导致focusInEvent被再次调用,对话框重复弹出。
修复方案
在打开对话框前主动让QLineEdit失去焦点,这样对话框关闭后焦点不会回到该控件,避免循环触发。修改后的focusInEvent代码如下:
void focusInEvent(QFocusEvent *event) { clearFocus(); // 强制控件失去焦点 QString currentPath = text(); const QString selectedDir = QFileDialog::getExistingDirectory( nullptr, fileDialogTitle, currentPath, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks ); // 用户取消选择时不修改原有路径 if (!selectedDir.isEmpty()) { setText(selectedDir); } }
额外优化
- 增加空路径判断,防止用户取消对话框时清空已选的目录路径,优化交互逻辑。
- 无需调用父类的
focusInEvent,因为我们已经通过clearFocus()终止了焦点事件的后续传递。
内容的提问来源于stack exchange,提问作者pacmaninbw
相关产品推荐
相关产品推荐

