Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Qt for Python
  4. Pixelator example for PySide2
Qt 6.11 is out! See what's new in the release blog

Pixelator example for PySide2

Scheduled Pinned Locked Moved Solved Qt for Python
4 Posts 2 Posters 1.2k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • alomA Offline
    alomA Offline
    alom
    wrote on last edited by alom
    #1

    I'm trying to recreate the Pixelator example for PySide2
    https://doc.qt.io/qtforpython/overviews/qtwidgets-itemviews-pixelator-example.html#pixelator-example

    Unfortunately something is broken and I'm not getting errors nor and pixel painted. If some one can take a look at the code below and help out that would be very much appreciated.
    Thanks

    
    from PySide2 import QtGui, QtCore, QtWidgets
    
    
    class ImageModel(QtCore.QAbstractTableModel):
        def __init__(self, parent=None):
            super(ImageModel, self).__init__(parent)
            self.model_image = QtGui.QImage('art_image.jpeg') # you will have to replace this
    
        def rowCount(self, *args, **kwargs):
            return self.model_image.height()
    
        def columnCount(self, *args, **kwargs):
            return self.model_image.width()
    
        def data(self, index, role):
            if not index.isValid() or role != QtCore.Qt.DisplayRole:
                return None
            return QtGui.qGray(self.model_image.pixel(index.column(), index.row()))
    
        def headerData(self, section, orientation, role):
            if role == QtCore.Qt.SizeHintRole:
                return QtCore.QSize(1,1)
    
    
    
    class PixelDelegate(QtWidgets.QAbstractItemDelegate):
        def __init__(self, parent=None):
            super(PixelDelegate, self).__init__(parent)
            self.pixel_size = 12
    
        def paint(self, painter, option, index):
            #if option.state and QtWidgets.QStyle.State_Selected:
             #   painter.fillRect(option.rect, option.palette.highlight())
    
            size = min(option.rect.width(), option.rect.height())
            brightness = int(index.model().data(index, QtCore.Qt.DisplayRole))
            radius = (size/2.0) - (brightness/255.0 * size/2.0)
            if radius == 0.0:
                return
    
            painter.save()
            painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
            painter.setPen(QtCore.Qt.NoPen)
    
            #if option.state and QtWidgets.QStyle.State_Selected:
              #  painter.setBrush(option.palette.highlightedText())
         
            painter.setBrush(QtGui.QBrush(QtCore.Qt.black))
            painter.drawEllipse(QtCore.QRectF(option.rect.x() + option.rect.width() / 2 - radius,
                                           option.rect.y() + option.rect.height() / 2 - radius,
                                           2 * radius, 2 * radius))
            painter.restore()
    
        def sizeHint(self, option, index):
            return QtCore.QSize(self.pixel_size, self.pixel_size)
    
        def setPixelSize(self, size):
            self.pixel_size = size
    
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self):
            super(MainWindow, self).__init__()
    
            self.model = ImageModel(self)
    
            centralWidget = QtWidgets.QWidget()
    
            self.view = QtWidgets.QTableView()
            self.view.setShowGrid(False)
            self.view.horizontalHeader().hide()
            self.view.verticalHeader().hide()
            self.view.horizontalHeader().setMinimumSectionSize(1)
            self.view.verticalHeader().setMinimumSectionSize(1)
            self.view.horizontalHeader().setDefaultSectionSize(4)
            self.view.verticalHeader().setDefaultSectionSize(4)
            self.view.setModel(self.model)
    
            delegate = PixelDelegate(self)
            self.view.setItemDelegate(delegate)
    
            mainLayout = QtWidgets.QVBoxLayout()
            mainLayout.addWidget(self.view)
            centralWidget.setLayout(mainLayout)
    
            self.setCentralWidget(centralWidget)
            self.setWindowTitle("Pixelator")
            self.resize(self.model.columnCount(), self.model.rowCount())
    
        def updateView(self):
            self.view.resizeColumnsToContents()
            self.view.resizeRowsToContents()
    
    
    if __name__ == '__main__':
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        window = MainWindow()
        window.show()
        sys.exit(app.exec_())
    
    
    JonBJ 1 Reply Last reply
    0
    • alomA alom

      I'm trying to recreate the Pixelator example for PySide2
      https://doc.qt.io/qtforpython/overviews/qtwidgets-itemviews-pixelator-example.html#pixelator-example

      Unfortunately something is broken and I'm not getting errors nor and pixel painted. If some one can take a look at the code below and help out that would be very much appreciated.
      Thanks

      
      from PySide2 import QtGui, QtCore, QtWidgets
      
      
      class ImageModel(QtCore.QAbstractTableModel):
          def __init__(self, parent=None):
              super(ImageModel, self).__init__(parent)
              self.model_image = QtGui.QImage('art_image.jpeg') # you will have to replace this
      
          def rowCount(self, *args, **kwargs):
              return self.model_image.height()
      
          def columnCount(self, *args, **kwargs):
              return self.model_image.width()
      
          def data(self, index, role):
              if not index.isValid() or role != QtCore.Qt.DisplayRole:
                  return None
              return QtGui.qGray(self.model_image.pixel(index.column(), index.row()))
      
          def headerData(self, section, orientation, role):
              if role == QtCore.Qt.SizeHintRole:
                  return QtCore.QSize(1,1)
      
      
      
      class PixelDelegate(QtWidgets.QAbstractItemDelegate):
          def __init__(self, parent=None):
              super(PixelDelegate, self).__init__(parent)
              self.pixel_size = 12
      
          def paint(self, painter, option, index):
              #if option.state and QtWidgets.QStyle.State_Selected:
               #   painter.fillRect(option.rect, option.palette.highlight())
      
              size = min(option.rect.width(), option.rect.height())
              brightness = int(index.model().data(index, QtCore.Qt.DisplayRole))
              radius = (size/2.0) - (brightness/255.0 * size/2.0)
              if radius == 0.0:
                  return
      
              painter.save()
              painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
              painter.setPen(QtCore.Qt.NoPen)
      
              #if option.state and QtWidgets.QStyle.State_Selected:
                #  painter.setBrush(option.palette.highlightedText())
           
              painter.setBrush(QtGui.QBrush(QtCore.Qt.black))
              painter.drawEllipse(QtCore.QRectF(option.rect.x() + option.rect.width() / 2 - radius,
                                             option.rect.y() + option.rect.height() / 2 - radius,
                                             2 * radius, 2 * radius))
              painter.restore()
      
          def sizeHint(self, option, index):
              return QtCore.QSize(self.pixel_size, self.pixel_size)
      
          def setPixelSize(self, size):
              self.pixel_size = size
      
      
      class MainWindow(QtWidgets.QMainWindow):
          def __init__(self):
              super(MainWindow, self).__init__()
      
              self.model = ImageModel(self)
      
              centralWidget = QtWidgets.QWidget()
      
              self.view = QtWidgets.QTableView()
              self.view.setShowGrid(False)
              self.view.horizontalHeader().hide()
              self.view.verticalHeader().hide()
              self.view.horizontalHeader().setMinimumSectionSize(1)
              self.view.verticalHeader().setMinimumSectionSize(1)
              self.view.horizontalHeader().setDefaultSectionSize(4)
              self.view.verticalHeader().setDefaultSectionSize(4)
              self.view.setModel(self.model)
      
              delegate = PixelDelegate(self)
              self.view.setItemDelegate(delegate)
      
              mainLayout = QtWidgets.QVBoxLayout()
              mainLayout.addWidget(self.view)
              centralWidget.setLayout(mainLayout)
      
              self.setCentralWidget(centralWidget)
              self.setWindowTitle("Pixelator")
              self.resize(self.model.columnCount(), self.model.rowCount())
      
          def updateView(self):
              self.view.resizeColumnsToContents()
              self.view.resizeRowsToContents()
      
      
      if __name__ == '__main__':
          import sys
      
          app = QtWidgets.QApplication(sys.argv)
          window = MainWindow()
          window.show()
          sys.exit(app.exec_())
      
      
      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by JonB
      #2

      @alom
      Probably completely irrelevant, I haven't looked at the example, but why is your painter.restore() in an else and not correctly paired with the painter.save()? And the drawEllipse() is also else-only? This is Python! Isn't the if else just supposed to be for picking the brush?

      1 Reply Last reply
      1
      • alomA Offline
        alomA Offline
        alom
        wrote on last edited by alom
        #3

        Ah, Thanks! I had an incorrect indent with :

        painter.drawEllipse(QtCore.QRectF(option.rect.x() + option.rect.width() / 2 - radius,
                                           option.rect.y() + option.rect.height() / 2 - radius,
                                           2 * radius, 2 * radius))
        painter.restore()
        

        Looks like i had to add code below to correctly set my cell size :

        self.view.horizontalHeader().setDefaultSectionSize(4)
        self.view.verticalHeader().setDefaultSectionSize(4)
        

        Yeah, I was just trying to match what the example had,
        I got rid of that unnecessary "else" ...also not why we need to manage the option.state and QtWidgets.QStyle.State_Selected ?
        i remove that and was able to get the black and white image as expected.

        Thanks so much!

        JonBJ 1 Reply Last reply
        1
        • alomA alom

          Ah, Thanks! I had an incorrect indent with :

          painter.drawEllipse(QtCore.QRectF(option.rect.x() + option.rect.width() / 2 - radius,
                                             option.rect.y() + option.rect.height() / 2 - radius,
                                             2 * radius, 2 * radius))
          painter.restore()
          

          Looks like i had to add code below to correctly set my cell size :

          self.view.horizontalHeader().setDefaultSectionSize(4)
          self.view.verticalHeader().setDefaultSectionSize(4)
          

          Yeah, I was just trying to match what the example had,
          I got rid of that unnecessary "else" ...also not why we need to manage the option.state and QtWidgets.QStyle.State_Selected ?
          i remove that and was able to get the black and white image as expected.

          Thanks so much!

          JonBJ Offline
          JonBJ Offline
          JonB
          wrote on last edited by
          #4

          @alom said in Pixelator example for PySide2:

          I had an incorrect indent with :

          Indeed! And being my non-favorite language of Python, that was the consequence of those few extra whitespaces :)

          1 Reply Last reply
          0

          • Login

          • Login or register to search.
          • First post
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • Users
          • Groups
          • Search
          • Get Qt Extensions
          • Unsolved