2017-12-01 4 views
0

여는 중 이미지를 선택할 때 이미지 미리보기를 표시하는 Qt5 QFileDialog를 얻으려고합니다.QFileDialog 미리보기

방법 1 : QFileDialog
확장 나는 this implementation of the dialog 사용하고 Qt를 5.6.1로했다.

는 지금은 Qt는 5.9.2를 사용하고 있으며 다음과 같은 오류를주고, 더 이상 작동하지 않습니다

여기
Traceback (most recent call last): 
    File "main.py", line 74, in mouseDoubleClickEvent 
    self.openFileDialog() 
    File "main.py", line 123, in openFileDialog 
    openDialog = QFileDialogPreview(self, 'Open file', './', self.getDialogFilter()) 
    File "QFileDialogPreview.py", line 22, in __init__ 
    self.layout().addLayout(box, 1, 3, 1, 1) 
TypeError: addLayout(self, QLayout, stretch: int = 0): too many arguments 

번역 된 클래스입니다. 파이썬 3.5.2를 사용하고 있습니다 :

from PyQt5.QtWidgets import QFileDialog, QLabel, QVBoxLayout 
from PyQt5.QtGui import QPixmap 
from PyQt5.QtCore import Qt 

class QFileDialogPreview(QFileDialog): 
    def __init__(self, parent, caption, direcotry, filter): 
     super().__init__(parent, caption, direcotry, filter) 

     self.setObjectName("FileDialogPreview") 
     box = QVBoxLayout(self) 

     self.setFixedSize(self.width() + 250, self.height()) 

     self.mpPreview = QLabel("Preview", self) 
     self.mpPreview.setFixedSize(250, 250) 
     self.mpPreview.setAlignment(Qt.AlignCenter) 
     self.mpPreview.setObjectName("labelPreview") 
     box.addWidget(self.mpPreview) 

     box.addStretch() 

     self.layout().addLayout(box, 1, 3, 1, 1) 

     self.currentChanged.connect(self.onChange) 
     self.fileSelected.connect(self.onFileSelected) 
     self.filesSelected.connect(self.onFilesSelected) 

     self._fileSelected = None 
     self._filesSelected = None 

    def onChange(self, path): 
     pixmap = QPixmap(path) 

     if(pixmap.isNull()): 
      self.mpPreview.setText("Preview") 
     else: 
      self.mpPreview.setPixmap(pixmap.scaled(self.mpPreview.width(), self.mpPreview.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation)) 

    def onFileSelected(self, file): 
     self._fileSelected = file 

    def onFilesSelected(self, files): 
     self._filesSelected = files 

    def getFileSelected(self): 
     return self._fileSelected 

    def getFilesSelected(self): 
     return self._filesSelected 

방법 2 : 별도의 창을 나는 또한 미리보기에 대한 별도의 창을 추가하는 시도 미리보기

을 위해. 그것이 QFileDialog에서 선택되면 이미지를 보여 주지만 Dialog 자체에 붙이지는 않습니다.
dialog.gemoetry()에서 mapToGlobal 메서드를 사용하여 전역 화면 좌표에 매핑 된 대화 상자의 위치를 ​​가져올 수 없습니다. 대화 상자가 약 800x600이고 대략 2000, 500 인 동안이 경우 크기가 100x30 인 QRect가 있습니다.

+0

당신이 만약 당신이해야 할 것은 상자 문에서 자신을 제거하기이를 위해 우리는 이외에, DontUseNativeDialog 플래그를 수는 QFileDialog 자신의 Qt를를 사용하는 것입니다 예상 한 결과가 어떨지를 그릴 것입니다. 사람들이 당신을 더 쉽게 도울 수 있습니다. – user1767754

+0

오른쪽 위젯으로 확장 된 일반 파일 열기 대화 상자 또는 내 미리보기 위젯이 포함 된 대화 상자 오른쪽의 별도 창 – Hize75

답변

0

box = QVBoxLayout(self)을 입력하면 새 레이아웃을 배치하고,

class QFileDialogPreview(QFileDialog): 
    def __init__(self, *args, **kwargs): 
     QFileDialog.__init__(self, *args, **kwargs) 
     self.setOption(QFileDialog.DontUseNativeDialog, True) 

     box = QVBoxLayout() 

     self.setFixedSize(self.width() + 250, self.height()) 

     self.mpPreview = QLabel("Preview", self) 
     self.mpPreview.setFixedSize(250, 250) 
     self.mpPreview.setAlignment(Qt.AlignCenter) 
     self.mpPreview.setObjectName("labelPreview") 
     box.addWidget(self.mpPreview) 

     box.addStretch() 

     self.layout().addLayout(box, 1, 3, 1, 1) 

     self.currentChanged.connect(self.onChange) 
     self.fileSelected.connect(self.onFileSelected) 
     self.filesSelected.connect(self.onFilesSelected) 

     self._fileSelected = None 
     self._filesSelected = None 

    def onChange(self, path): 
     pixmap = QPixmap(path) 

     if(pixmap.isNull()): 
      self.mpPreview.setText("Preview") 
     else: 
      self.mpPreview.setPixmap(pixmap.scaled(self.mpPreview.width(), self.mpPreview.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation)) 

    def onFileSelected(self, file): 
     self._fileSelected = file 

    def onFilesSelected(self, files): 
     self._filesSelected = files 

    def getFileSelected(self): 
     return self._fileSelected 

    def getFilesSelected(self): 
     return self._filesSelected 

출력 :

enter image description here