PySide2 v5.12: создание FileDialog одним нажатием кнопки - PullRequest
2 голосов
/ 25 марта 2019

Я разработал базовый интерфейс в QtDesigner. Теперь я пытаюсь открыть простой файл диалога по нажатию кнопки, ниже дан мой код GUI:

from PySide2 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
 def setupUi(self, MainWindow):
.....
.....

  self.input_Image_GraphicsView = QtWidgets.QGraphicsView(self.centralwidget)
  self.input_Image_GraphicsView.setGeometry(QtCore.QRect(730, 110, 480, 320))
  self.input_Image_GraphicsView.setObjectName("input_Image_GraphicsView")
......
  self.output_Image_GraphicsView = QtWidgets.QGraphicsView(self.centralwidget)
  self.output_Image_GraphicsView.setGeometry(QtCore.QRect(730, 480, 480, 320))
  self.output_Image_GraphicsView.setObjectName("output_Image_GraphicsView")
......
  self.file_Select_Btn = QtWidgets.QPushButton(self.centralwidget)
  self.file_Select_Btn.setGeometry(QtCore.QRect(1082, 80, 121, 28))
  self.file_Select_Btn.setObjectName("file_Select_Btn")
  self.file_Select_Btn.clicked.connect(self.selectFile)
.....
.....
 def selectFile():
  self.path_To_File = QtWidgets.QFileDialog.getOpenFileName(self, QtCore.QObject.tr("Load Image"), QtCore.QObject.tr("~/Desktop/"), QtCore.QObject.tr("Images (*.jpg)"))
  print(self.path_To_File)
.....
.....

if __name__ == "__main__":
 import sys
 app = QtWidgets.QApplication(sys.argv)
 MainWindow = QtWidgets.QMainWindow()
 ui = Ui_MainWindow()
 ui.setupUi(MainWindow)
 MainWindow.show()
 sys.exit(app.exec_()) 

Это ошибка, которую я получаю:

TypeError: descriptor 'tr' requires a 'PySide2.QtCore.QObject' object but received a 'str'

Когда я не использовал 'tr', я получал:

TypeError: 'PySide2.QtWidgets.QFileDialog.getOpenFileName' called with wrong 
argument types:
PySide2.QtWidgets.QFileDialog.getOpenFileName(Ui_MainWindow, str, str, str)
Supported signatures:
PySide2.QtWidgets.QFileDialog.getOpenFileName(PySide2.QtWidgets.QWidget = None, str = '', str = '', str = '', str = '', PySide2.QtWidgets.QFileDialog.Options = Default(QFileDialog.Options))

Я прочитал документацию по Python для Qt ver 5.12, приведенную здесь: https://doc.qt.io/qtforpython/PySide2/QtWidgets/QFileDialog.html

Это тоже не помогло. Где я ошибся ??

В основном я хочу:

  1. Получить FileDialog -> Выбрать файл JPG
  2. Получить путь к файлу в коде Python -> Заполнить GraphicsView изображением в графическом интерфейсе

В настоящее время я борюсь с обоими аспектами

Любая помощь будет оценена ..

1 Ответ

2 голосов
/ 25 марта 2019

Не следует смешивать логику вашей программы с созданными файлами пользовательского интерфейса, вместо этого создайте оболочку класса QMainWindow и наследуйте от QMainWindow и от класса пользовательского интерфейса.

В соответствии с вашей реальной проблемой выпросто пропуская ссылку на объект (например, себя) перед передачей текста для перевода, я добавил небольшой вспомогательный метод для обработки этого в следующем примере:

import sys
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import QObject, QRectF, Qt
from PySide2.QtWidgets import QMainWindow, QFileDialog, QWidget, QVBoxLayout, QGraphicsScene, QGraphicsView
from PySide2.QtGui import QPixmap


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.centralWidget = QtWidgets.QWidget(MainWindow)
        self.gridLayout = QtWidgets.QGridLayout(self.centralWidget)
        self.file_Select_Btn = QtWidgets.QPushButton(self.centralWidget)
        self.file_Select_Btn.setGeometry(QtCore.QRect(1082, 80, 121, 28))
        self.file_Select_Btn.setObjectName("file_Select_Btn")
        self.file_Select_Btn.setText("Load Image")
        self.gridLayout.addWidget(self.file_Select_Btn)
        MainWindow.setCentralWidget(self.centralWidget)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        Ui_MainWindow.__init__(self)
        QMainWindow.__init__(self)

        # Initialize UI
        self.setupUi(self)
        self.file_Select_Btn.clicked.connect(self.showImage)

    def tr(self, text):
        return QObject.tr(self, text)

    def showImage(self):
        path_to_file, _ = QFileDialog.getOpenFileName(self, self.tr("Load Image"), self.tr("~/Desktop/"), self.tr("Images (*.jpg)"))

        self.image_viewer = ImageViewer(path_to_file)
        self.image_viewer.show()


class ImageViewer(QWidget):
    def __init__(self, image_path):
        super().__init__()

        self.scene = QGraphicsScene()
        self.view = QGraphicsView(self.scene)
        layout = QVBoxLayout()
        layout.addWidget(self.view)
        self.setLayout(layout)

        self.load_image(image_path)

    def load_image(self, image_path):
        pixmap = QPixmap(image_path)
        self.scene.addPixmap(pixmap)
        self.view.fitInView(QRectF(0, 0, pixmap.width(), pixmap.height()), Qt.KeepAspectRatio)
        self.scene.update()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...