Dateiauswahl Gnome statt KDE

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
pExplorer
User
Beiträge: 9
Registriert: Dienstag 21. Mai 2019, 19:54

Hallo,

damit öffne ich einen File-Dialog zur Auswahl eines Verzeichnisses:

Code: Alles auswählen

from PyQt5 import QtGui, QtCore, QtWidgets

self.app_path = QtCore.QDir.homePath()

dir_source = QtWidgets.QFileDialog.getExistingDirectory(
            self, "Quell-Ordner", self.app_path)
Auf einem ubuntu 22 hatte ich von früher her PyQt so installiert:

Code: Alles auswählen

apt install python3-pyqt5
Nun habe ich für die App ein python-env eingerichet und PyQt so installiert:

Code: Alles auswählen

python3 -m pipenv install pyqt5
Starte ich meine App mit dem via apt installierten PyQt, öffnet QFileDialog den Gmome-File-Dialog.

Starte ich meine App mit dem via env installierten PyQt, öffnet QFileDialog den KDE-File-Dialog.

Letzteren finde ich umständlich und unübersichtlich.

Wie kann ich erreichen, dass die App via env den Gnome-File-Dialog verwendet?
Benutzeravatar
DeaD_EyE
User
Beiträge: 1243
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Schau dir mal QtWidgets.QFileDialog.Options() und QtWidgets.QFileDialog.DontUseNativeDialog an.

Möglicher Ansatz:

Code: Alles auswählen

import sys
from pathlib import Path

from PyQt5 import QtWidgets


class MainWindow(QtWidgets.QWidget):
    def __init__(self, native=False):
        super().__init__()

        self.button = QtWidgets.QPushButton("Verzeichnis auswählen")
        self.button.clicked.connect(self.choose_directory)

        self.close_button = QtWidgets.QPushButton("Beenden")
        self.close_button.clicked.connect(QtWidgets.QApplication.quit)

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.button)
        layout.addWidget(self.close_button)

        # name mangling
        self.__native = native

    def choose_directory(self):
        # alternativ QtCore.QDir.homePath()
        # ein Path objekt kann man nicht direkt verwenden
        # falls doch -> crash
        downloads = str(Path.home().joinpath("Downloads"))
        options = QtWidgets.QFileDialog.Options()

        if self.__native:
            options |= QtWidgets.QFileDialog.DontUseNativeDialog
        else:
            options &= ~QtWidgets.QFileDialog.DontUseNativeDialog

        folder = QtWidgets.QFileDialog.getExistingDirectory(
            self, "Wähle ein Verzeichnis", downloads, options=options
        )

        if folder:
            QtWidgets.QMessageBox.information(self, "Auswahl", f"Gewählt: {folder}")


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow(native=True)
    window.show()
    sys.exit(app.exec_())

Ich bin jetzt zu faul eine Gnome-Session zu starten, um das zu testen. Da ich den KDE Plasma Desktop nutze, wird in beiden Fällen ein nativer Dialog angezeigt. Ich konnte jedenfalls keinen Unterschied erkennen.

PS: ChatGPT hat den Code zuerst falsch ausgegeben. Jedenfalls ist mir aufgefallen, dass die Doku von PyQt5 nicht aufzufinden ist. Damit meine ich so etwas wie eine Referenz, wie man es bei PySide6 präsentiert bekommt.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
pExplorer
User
Beiträge: 9
Registriert: Dienstag 21. Mai 2019, 19:54

Danke für den Tipp, DeaD_EyE!

Diese Option bewirkt allerdings das Gegenteil von dem, was ich erreichen möchte.

Statt der Gnome-Pfad-Wahl wird nun auch die KDE/QT-Pfad-Wahl benutzt, wenn ich das Programm nicht im env starte.
Benutzeravatar
snafu
User
Beiträge: 6873
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Da hat er sich auch vertan. Wenn du bei dem ``if`` Test ein ``not`` einsetzt, sollte es funktionieren.
pExplorer
User
Beiträge: 9
Registriert: Dienstag 21. Mai 2019, 19:54

snafu hat geschrieben: Dienstag 12. August 2025, 08:57 Da hat er sich auch vertan. Wenn du bei dem ``if`` Test ein ``not`` einsetzt, sollte es funktionieren.
Hm, mein Programm ist über 10 Jahre alt, ich *steck'* da nicht mehr so drin...
Die Definition der Class ist so

Code: Alles auswählen

class DaisyCopy(QtWidgets.QMainWindow, daisy_creator_mag_ui.Ui_DaisyMain):
    """
    mainClass
    The second parent must be 'Ui_<obj. name of main widget class>'.
    """

    process_validator_error_signal = QtCore.pyqtSignal(str)
    process_validator_output_signal = QtCore.pyqtSignal(str)

    def __init__(self, parent=None):
        """Settings"""
        super(DaisyCopy, self).__init__(parent)
        
Wenn ich da ergänze

Code: Alles auswählen

def __init__(self, parent=None, native=False):

erhalte ich beim Aufruf des Dialogs:
'DaisyCopy' object has no attribute '_DaisyCopy__native'
Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pExplorer: Sicherlich hast Du noch mehr ergänzt als nur dieses Argument. Du wirst irgendwo Code ergänzt haben, der auf ``self.__native`` zugreift, aber das nirgends gesetzt haben, oder zumindest nicht bevor darauf zugegriffen wird.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
DeaD_EyE
User
Beiträge: 1243
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

__blackjack__ hat geschrieben: Dienstag 12. August 2025, 14:07 ``self.__native``
Den Code hab ich gepostet. Doppelte Unterstriche, um Namenskollisionen zu vermeiden.

Aber ja, wenn man das Attribut nicht zuweist, kann man es auch nicht lesen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
pExplorer
User
Beiträge: 9
Registriert: Dienstag 21. Mai 2019, 19:54

DeaD_EyE hat geschrieben: Dienstag 12. August 2025, 14:42
__blackjack__ hat geschrieben: Dienstag 12. August 2025, 14:07 ``self.__native``
Den Code hab ich gepostet. Doppelte Unterstriche, um Namenskollisionen zu vermeiden.

Aber ja, wenn man das Attribut nicht zuweist, kann man es auch nicht lesen.
Ah, ja das hatte ich vergessen, danke.

Das bringt zwar noch einen anderen Pfad-Datei-Auswahldialog, aber es ist nicht der native Gnome-Dialog, oder ein veralteter.

Neben der unschöneren Darstellung finde ich weder mit dem, noch mit dem QT-Dialog z.B. einen Weg, um temporäre Samba-Freigaben zu wählen... Arrgh
Antworten