2013-02-20 4 views
0

클래스 MainWindow에는 이미지와 함께 작동하는 메뉴와 기능이 포함되어 있습니다. 선택한 그림을 보유하는 변수 self.image = QtGui.QImage()이 있습니다. QPixmapMainWindow에 사용하면 그림이 표시됩니다. 하지만 Splitter(QtGui.QWidget)QGraphicsView이 있는데 이것에 대한 그림을 표시하고 싶습니다. 을 Splitter 클래스 안에 선언하고 이것을 시도했습니다 : Splitter.scene.addPixmap(QtGui.QPixmap.fromImage(image)) MainWindow 클래스 내부에서 작동하지만 작동하지 않습니다. - AttributeError: type object 'Splitter' has no attribute 'scene'. 어떻게해야합니까?PyQt4 - 위젯에서 이미지 표시가 작동하지 않습니다.

class MainWindow(QtGui.QMainWindow): 

    def __init__(self, parent=None): 
     super(MainWindow, self).__init__() 
     self.form_widget = Splitter() 
     self.setCentralWidget(self.form_widget) 
     self.initUI() 

    def initUI(self):    

     self.filename = None 
     self.statusBar().showMessage('Ready') 


     openFile = QtGui.QAction(QtGui.QIcon('fileopen.png'), u'Otwórz plik', self) 
     openFile.setShortcut('Ctrl+O') 
     openFile.setStatusTip(u'Otwórz nowy plik') 
     openFile.triggered.connect(self.showDialog) 

     exitAction = QtGui.QAction(QtGui.QIcon('filequit.png'), 'Zamknij', self)   

     exitAction.setShortcut('Ctrl+Q') 
     exitAction.setStatusTip('Zamknij program') 
     exitAction.triggered.connect(QtGui.qApp.quit) 


     #utworzenie menu 
     menubar = self.menuBar() 
     #menu Plik 
     fileMenu = menubar.addMenu('&Plik') 
     fileMenu.addAction(openFile) 
     fileMenu.addAction(exitAction) 

     #menu Edycja 
     editMenu=menubar.addMenu('&Edycja') 

     #menu Pomoc 
     helpMenu=menubar.addMenu('&Pomoc') 
     helpAction=QtGui.QAction(QtGui.QIcon('icon.png'), u'O programie',self) 
     helpAction.triggered.connect(self.helpAbout) 
     helpMenu.addAction(helpAction) 
     helpMenu.addAction(u"Opis możliwości", self.helpAbout) #dopisać funkcję 


     self.setGeometry(200, 200, 500, 500) 
     self.setWindowTitle(u'System analizy rozkładu jasności obrazu')  
     self.show() 


    # do otwierania pliku  
    def showDialog(self): 

     dir1 = os.path.dirname(self.filename) \ 
       if self.filename is not None else "." 
     formats = ["*.%s" % unicode(format).lower() \ 
        for format in QtGui.QImageReader.supportedImageFormats()] 
     fname = unicode(QtGui.QFileDialog.getOpenFileName(self, 
          u"System analizy obrazów - Wybierz obraz", dir1, 
          u"Pliki obrazów (%s)" % " ".join(formats))) 
     if fname: 
      self.loadFile(fname) 

    def loadFile(self, fname=None): 
     if fname is None: 
      action = self.sender() 
      if isinstance(action, QtGui.QAction): 
       fname = unicode(action.data().toString()) 
       if not self.okToContinue(): 
        return 
       else: 
        return 
     if fname: 
      self.filename = None 
      image = QtGui.QImage(fname) 
     if image.isNull(): 
      message = u"Błąd odczytu %s" % fname 
     else: 
      self.image = QtGui.QImage() 
      self.image = image 
      self.filename = fname 
      self.showImage() 
      #self.dirty = False 
      #self.sizeLabel.setText("%d x %d" % (image.width(), image.height())) 
      message = u"Załadowano %s" % os.path.basename(fname) 
     self.updateStatus(message) 

     self.filename = None 
     image = QtGui.QImage(fname) 
     if image.isNull(): 
      message = u"Błąd odczytu %s" % fname 


    def updateStatus(self, message): 
     self.statusBar().showMessage(message, 5000)  

    def showImage(self, percent=None): 
     if self.image.isNull(): 
      return 
     #if percent is None: 
     # percent = self.zoomSpinBox.value() 
     percent=50 
     factor = percent/100.0 
     width = self.image.width() * factor 
     height = self.image.height() * factor 
     image = self.image.scaled(width, height, QtCore.Qt.KeepAspectRatio) 
     Splitter.scene.addPixmap(QtGui.QPixmap.fromImage(image)) #doesn't work 
     #self.imageLabelRight.setPixmap(QtGui.QPixmap.fromImage(image)) #works, but it's not on widget 

class Splitter(QtGui.QWidget): 

    def __init__(self): 
     super(Splitter, self).__init__() 

     self.initUI() 

    def initUI(self):  

     #napisy wejściowe 
     label_up_box = QtGui.QHBoxLayout() 
     napis1=QtGui.QLabel(u"OBRAZ WEJŚCIOWY") 
     napis1.setStyleSheet("font: 14pt \"MS Shell Dlg 2\";") 
     napis1.setAlignment(QtCore.Qt.AlignCenter) 

     napis2=QtGui.QLabel(u"OBRAZ WYJŚCIOWY") 
     napis2.setStyleSheet("font: 14pt \"MS Shell Dlg 2\";") 
     napis2.setAlignment(QtCore.Qt.AlignCenter) 
     label_up_box.addWidget(napis1) 
     label_up_box.addWidget(napis2) 


     #dwa górne okna 
     hbox = QtGui.QHBoxLayout() 
     up_left = QtGui.QGraphicsView(self) 
     up_right = QtGui.QGraphicsView(self) 
     hbox.addWidget(up_left) 
     hbox.addWidget(up_right) 

     #napisy do slidera 
     label_slider = QtGui.QHBoxLayout() 
     napis1=QtGui.QLabel(u"\n\nREGULACJA JASNOŚCI") 
     napis1.setStyleSheet("font: 14pt \"MS Shell Dlg 2\";") 
     napis1.setAlignment(QtCore.Qt.AlignCenter) 
     label_slider.addWidget(napis1) 


     #slider i licznik 
     hbox2 = QtGui.QHBoxLayout() 
     sld = QtGui.QSlider(QtCore.Qt.Horizontal, self) 
     lcd = QtGui.QLCDNumber(self) 
     hbox2.addWidget(sld) 
     hbox2.addWidget(lcd) 
     sld.valueChanged.connect(lcd.display) 

     #napisy do histogramów 
     label_down_box = QtGui.QHBoxLayout() 
     napis1=QtGui.QLabel(u"\n\nHISTOGRAM WEJŚCIOWY") 
     napis1.setStyleSheet("font: 14pt \"MS Shell Dlg 2\";") 
     napis1.setAlignment(QtCore.Qt.AlignCenter) 

     napis2=QtGui.QLabel(u"\n\nHISTOGRAM WYJŚCIOWY") 
     napis2.setStyleSheet("font: 14pt \"MS Shell Dlg 2\";") 
     napis2.setAlignment(QtCore.Qt.AlignCenter) 
     label_down_box.addWidget(napis1) 
     label_down_box.addWidget(napis2) 

     #dwa dolne okna 
     hbox3 = QtGui.QHBoxLayout() 
     down_left = QtGui.QGraphicsView(self) 
     down_right = QtGui.QGraphicsView(self) 
     hbox3.addWidget(down_left) 
     hbox3.addWidget(down_right) 

     #layout całości 
     vbox = QtGui.QVBoxLayout() 
     vbox.addLayout(label_up_box) 
     vbox.addLayout(hbox) 
     vbox.addLayout(label_slider) 
     vbox.addLayout(hbox2) 
     vbox.addLayout(label_down_box) 
     vbox.addLayout(hbox3) 


     self.setLayout(vbox) 
     scene = QtGui.QGraphicsScene() 
     scene2 = QtGui.QGraphicsScene() 

     scene.addPixmap(QtGui.QPixmap('icon.png')) 
     #scene2.addPixmap(QtGui.QPixmap.fromImage(image)) #doesn't work 

     up_left.setScene(scene) 
     up_right.setScene(scene2) 
     down_left.setScene(scene) 
     down_right.setScene(scene) 
     up_left.show() 

     self.show() 


def main(): 

    app = QtGui.QApplication([]) 
    app.setWindowIcon(QtGui.QIcon('icon.png')) 

    mm = MainWindow() 
    mm.show() 

    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main()  

답변

0

해결! MainWindow에서 Widget으로 내가 할 수있는 모든 것을 (거의 모든 것) 옮겼습니다. 코드를 약간 변경 한 후에 모든 것이 작동합니다.

관련 문제