PySide2 отображает тот же значок в диалоговом окне файла, что и в главном окне

У меня есть простое приложение pyside2, которое выглядит примерно так:

import sys
from PySide2.QtWidgets import QApplication, QDialog, QPushButton, QFileDialog, QVBoxLayout
from PySide2 import QtGui

class Form(QDialog):

    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        self.setWindowTitle("My Form")
        self.setWindowIcon(QtGui.QIcon("myicon.png"))
        layout = QVBoxLayout()
        self.button = QPushButton("Open dialog")
        self.button.clicked.connect(self.browse)
        layout.addWidget(self.button)
        self.setLayout(layout)

    def browse(self):
        qfd = QFileDialog()
        qfd.setWindowIcon(QtGui.QIcon("myicon.png"))
        filename, _ = qfd.getOpenFileName(None, "Load Data", ".", "*.txt")



if __name__ == '__main__':
    # Create the Qt Application
    app = QApplication(sys.argv)
    # Create and show the form
    form = Form()
    form.show()
    # Run the main Qt loop
    sys.exit(app.exec_())

Я хочу установить тот же значок для QFileDialog, что и значок главного окна, но по какой-то причине он не работает. Есть ли способ установить его, как я пытаюсь выше? Спасибо за идеи, указатели и помощь заранее! (Я использую Ubuntu 20.04)


person Blind0ne    schedule 07.12.2020    source источник


Ответы (1)


Метод getOpenFileName является статическим методом, который создает внутренний QFileDialog, отличный от qfd, поэтому значок не применяется. Один из возможных вариантов — не использовать getOpenFileName, а создать логику только с использованием класса QFileDialog, а другое решение — получить доступ к объекту QFileDialog, созданному внутри getOpenFileName, с использованием характеристики верхнего уровня:

import sys

from PySide2 import QtCore, QtGui, QtWidgets


class Form(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        self.setWindowTitle("My Form")
        self.setWindowIcon(QtGui.QIcon("myicon.png"))
        layout = QtWidgets.QVBoxLayout(self)
        self.button = QtWidgets.QPushButton("Open dialog")
        self.button.clicked.connect(self.browse)
        layout.addWidget(self.button)

    def browse(self):
        QtCore.QTimer.singleShot(0, self.handle_timeout)
        filename, _ = QtWidgets.QFileDialog.getOpenFileName(
            None,
            "Load Data",
            ".",
            "*.txt",
            options=QtWidgets.QFileDialog.DontUseNativeDialog,
        )

    def handle_timeout(self):
        for w in QtWidgets.QApplication.topLevelWidgets():
            if isinstance(w, QtWidgets.QFileDialog):
                w.setWindowIcon(QtGui.QIcon("myicon.png"))


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    form = Form()
    form.show()

    sys.exit(app.exec_())
person eyllanesc    schedule 07.12.2020
comment
По какой-то причине фрагмент кода не работает у меня в Ubuntu 20.04. Значок в QFileDialog по-прежнему отличается от основного диалогового окна. Как создать логику, используя только класс QFileDialog? - person Blind0ne; 07.12.2020
comment
@Blind0ne попробуйте мой код обновления - person eyllanesc; 07.12.2020
comment
Да это работает! Но почему я не могу использовать окно NativeDialog? - person Blind0ne; 07.12.2020
comment
@Blind0ne Не знаю, может это баг - person eyllanesc; 07.12.2020
comment
Да может быть. Но при использовании флага DontUseNativeDialog handle_timeout не требуется. Он автоматически назначает значок главного окна диалоговому окну. - person Blind0ne; 07.12.2020