bounty还有6天到期。回答此问题可获得+100声望奖励。Michael Clerx希望引起更多关注此问题。
我曾经能够在PyQt 5,PyQt 6,PySide 2等中为本地打开文件对话框设置初始目录,使用如下代码:
QtWidgets.QFileDialog.getOpenFileName(
self,
'Open file',
'/home/michael/last_path',
)
其中,3d参数是指定对话框的初始目录的str
。
在Fedora的最新版本(运行wayland或X11)上,目录参数被默默忽略。
奇怪的是,它仍然适用于getSaveFileName
。
有人知道发生了什么吗?或者我可以在哪里报告这个问题?(Qt?Fedora devs?)或者类似地,我可以在哪里开始自己修复这个问题?
更新更多版本信息:
目前在Fedora 37上运行Gnome 43.3,但问题已经存在了一段时间,如果我没记错的话,至少可以追溯到Fedora 33。在两台不同的机器上都有同样的问题。在不是我写的软件中也看到过,但也使用了Python和Qt(例如Veusz)。
一开始以为这是Wayland的事情,但在@rede95下面的评论后检查,实际上也发生在X11上。
1条答案
按热度按时间lztngnrs1#
您描述的行为可能与Qt中的已知问题有关,Qt是QFileDialog类使用的框架。Qt使用平台插件与底层操作系统交互,此插件可能无法在某些系统或配置上正常工作。
在GNOME与Wayland的情况下,问题可能与Wayland使用与X11不同的协议来在应用程序和显示服务器之间进行通信的事实有关。这可能导致与Qt和其他依赖X11的应用程序的兼容性问题。
**第一种方式-**使用
zenity
或kdialog
要使用
zenity
或kdialog
作为回退,请执行以下操作:zenity
和kdialog
分别是用于在GNOME和KDE中创建对话框的命令行实用程序。如果QFileDialog不正确,我们可以使用这些实用程序作为后备。下面是一个示例:此函数检查用户是否使用Wayland显示服务器运行Linux系统。如果是,则检查
zenity
或kdialog
命令行实用程序是否可用。如果是,则运行相应的命令以显示文件对话框并返回所选文件路径。如果两个实用程序都不可用,则如果用户没有运行带有Wayland显示服务器的Linux系统,或者如果文件对话框由于任何原因失败,它会回退到使用QFileDialog。第二种方式-
QtWebEngineWidgets.QWebEngineView
使用
QtWebEngineWidgets.QWebEnginePage
显示自定义文件对话框:QtWebEngineWidgets.QWebEnginePage
提供了一种在QWebEngineView
小部件中显示自定义HTML页面的方法。我们可以使用它来显示一个自定义文件对话框,该对话框允许我们设置初始目录。下面是一个示例:这段代码定义了一个CustomFileDialog类,它继承自QtWebEngineWidgets. QWebEngineView。它将视图的HTML内容设置为一个带有“打开目录”按钮的简单文件对话框。当用户单击此按钮时,它将打开设置了目录标志的本机文件对话框,允许用户选择目录。一旦用户选择了目录,downloadRequested信号将由QWebEngineProfile发出。而_on_download_requested方法将文件对话框的初始目录设置为用户选择的目录。
您可以像这样使用此CustomFileDialog类:
第三路-
xdg-desktop-portal
xdg-desktop-portal
是一个门户,允许应用程序在桌面环境(如GNOME)上显示本机文件对话框。我们可以使用xdg-desktop-portal
Python库通过xdg-desktop-portal显示文件对话框。下面是一个示例:set_initial_directory
函数设置文件对话框的初始目录,show_file_dialog_with_portal
函数使用xdg-desktop-portal
显示文件对话框。此方法允许您在GNOME中使用本机文件对话框第四路-
QPlatformFileDialogHelper
使用QPlatformFileDialogHelper:QPlatformFileDialogHelper是Qt中的一个低级类,它提供了一种在不同平台上实现自定义文件对话框行为的方法。您可以使用它来创建一个自定义文件对话框实现,该实现可以在GNOME上与Wayland一起正常工作。下面是一个示例:
在这个例子中,i自定义文件对话框类使用QPlatformFileDialogHelper来设置初始目录。如果设置了
DontUseNativeDialog
选项,我们将创建QPlatformFileDialogHelper
的新示例并设置初始目录。否则,我们将在QPlatformFileDialogHelper
的现有示例中设置初始目录。**第五种方式-**Qt QML FileDialog
使用Qt QML FileDialog组件:Qt QML FileDialog组件提供了一个独立于平台的文件对话框,您可以在使用PyQt或PySide的Python应用程序中使用该对话框。下面是一个示例:
这段QML代码定义了一个FileDialog组件,你可以在PyQt或PySide应用程序中使用它。它将文件对话框的初始目录设置为/home/michael/last_path。当用户选择一个文件时,会发出onAccepted信号,其中包含所选文件的URL。当用户取消文件对话框或选择一个目录时,会发出onRejected信号。
在PyQt或PySide应用程序中嵌入QML文件对话框:您可以使用QQuickWidget类在PyQt或PySide应用程序中嵌入QML文件对话框。下面是一个示例:
这段代码定义了一个MainWindow类,用于加载QML文件对话框组件并使用QQuickWidget将其添加到主窗口。