Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt5:QScrollArea保持Pixmap纵横比_Python_Pyqt_Pyqt5_Qpixmap_Qscrollarea - Fatal编程技术网

Python PyQt5:QScrollArea保持Pixmap纵横比

Python PyQt5:QScrollArea保持Pixmap纵横比,python,pyqt,pyqt5,qpixmap,qscrollarea,Python,Pyqt,Pyqt5,Qpixmap,Qscrollarea,基于此,我使用QAbstractButton创建了一组pixmap按钮(PicButton),并希望将它们添加到滚动区域中,以便用户可以水平滚动。然而,我需要 pixmap按钮的纵横比保持不变 pixmap按钮应始终占据高达200像素的窗口的整个高度 我当前代码的问题是,当高度变得太高时,pixmap按钮会被挤压 当高度足够小,所有按钮都可以放在窗口中时,我可以使纵横比保持不变。我在下面附上我的PicButton类 from PyQt5 import QtCore, QtGui, QtWidge

基于此,我使用QAbstractButton创建了一组pixmap按钮(PicButton),并希望将它们添加到滚动区域中,以便用户可以水平滚动。然而,我需要

  • pixmap按钮的纵横比保持不变
  • pixmap按钮应始终占据高达200像素的窗口的整个高度 我当前代码的问题是,当高度变得太高时,pixmap按钮会被挤压

    当高度足够小,所有按钮都可以放在窗口中时,我可以使纵横比保持不变。我在下面附上我的PicButton类

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    import sys
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QMainWindow, QApplication
    from PyQt5.QtGui import QPixmap, QPainter, QPen
    
    def testPixmap(r = 255,g = 0,b = 0, a = 255,size =(200,200)):
        px = QtGui.QPixmap(size[0],size[1])
        color = QtGui.QColor(r,g,b,a)
        px.fill(color) 
        return px
    
    class PicButton(QtWidgets.QAbstractButton):
        checked = QtCore.pyqtSignal(object, QtCore.QRect)
        def __init__(self, name, parent=None, w = 200, h = 200):
            self.w = w; self.h = h;  self.name = name
            super(PicButton, self).__init__(parent)
            pixmap = testPixmap(255,0,0)
            self.resetPixmaps(pixmap); self.pixmap = pixmap
            self.setCheckable(True);   self.setChecked(False)
            self.pressed.connect(self.update)
            self.released.connect(self.blank)
    
        def resetPixmaps(self, pixmap):
            self.pixmap_hover = testPixmap(20,125,200,128)
            self.pixmap_pressed = testPixmap(30,180,200,128)
    
        def blank(self):
            self.setChecked(True)    
    
        def paintEvent(self, event):        
            pix = self.pixmap_hover if self.underMouse() else self.pixmap        
            if self.isChecked():
                self.checked.emit( self.name, event.rect())    
                pix = self.pixmap_pressed
            size = self.size()        
            scaledPix = pix.scaledToHeight(size.height(), Qt.SmoothTransformation)
            # start painting the label from left upper corner
            point = QtCore.QPoint(0,0)
            point.setX((size.width() - scaledPix.width())/2)
            point.setY((size.height() - scaledPix.height())/2)
    
            painter = QPainter(self)
    
            painter.drawPixmap(point, scaledPix)
    
        def otherBoxChecked(self, func, rect):
            if self.isChecked():
                pix = self.pixmap; painter = QPainter(self); painter.drawPixmap(rect, pix)
                self.setChecked(False)            
    
        def enterEvent(self, event):
            self.update()
    
        def leaveEvent(self, event):
            self.update()
    
        def sizeHint(self):
            return QtCore.QSize(self.w, self.h)
    
    在场景中,当所有按钮的高度都太高而无法适应场景时,我想激活滚动条,并保持按钮的纵横比。有什么办法吗?为了完整起见,我附上下面的窗口代码

    已添加

    from PyQt5 import QtCore, QtGui, QtWidgets
    import sys
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QMainWindow, QApplication
    from PyQt5.QtGui import QPixmap, QPainter, QPen
    
    
    
    
    def testPixmap(r = 255,g = 0,b = 0, a = 255,size =(200,200)):
        px = QtGui.QPixmap(size[0],size[1])
        color = QtGui.QColor(r,g,b,a)
        px.fill(color) 
        return px
    
    
    
    class PicButton(QtWidgets.QAbstractButton):
        checked = QtCore.pyqtSignal(object, QtCore.QRect)
        def __init__(self, name, parent=None, w = 200, h = 200):
            self.w = w; self.h = h;  self.name = name
            super(PicButton, self).__init__(parent)
            pixmap = testPixmap(255,0,0)
            self.resetPixmaps(pixmap); self.pixmap = pixmap
            self.setCheckable(True);   self.setChecked(False)
            self.pressed.connect(self.update)
            self.released.connect(self.blank)
    
        def resetPixmaps(self, pixmap):
            self.pixmap_hover = testPixmap(20,125,200,128)
            self.pixmap_pressed = testPixmap(30,180,200,128)
    
        def blank(self):
            self.setChecked(True)    
    
        def paintEvent(self, event):        
            pix = self.pixmap_hover if self.underMouse() else self.pixmap        
            if self.isChecked():
                self.checked.emit( self.name, event.rect())    
                pix = self.pixmap_pressed
            size = self.size()        
            scaledPix = pix.scaledToHeight(size.height(), Qt.SmoothTransformation)
            # start painting the label from left upper corner
            point = QtCore.QPoint(0,0)
            point.setX((size.width() - scaledPix.width())/2)
            point.setY((size.height() - scaledPix.height())/2)
    
            painter = QPainter(self)
    
            painter.drawPixmap(point, scaledPix)
    
        def otherBoxChecked(self, func, rect):
            if self.isChecked():
                pix = self.pixmap; painter = QPainter(self); painter.drawPixmap(rect, pix)
                self.setChecked(False)            
    
        def enterEvent(self, event):
            self.update()
    
        def leaveEvent(self, event):
            self.update()
    
        def sizeHint(self):
            return QtCore.QSize(self.w, self.h)
    
    
    class View(QtWidgets.QGraphicsView):
        def __init__(self):
            super(View,self).__init__()        
            self.pic_scene = QtWidgets.QGraphicsScene()
            self.neighborhood = 200
            buttons = ['str(i)' for i in range(10)]
    
            self.maskButtons = [PicButton(button) for button in buttons]
            for maskButton, mb in zip(self.maskButtons , range(len(self.maskButtons ))):
                for maskConnect, mc in zip(self.maskButtons , range(len(self.maskButtons ))):
                    if mb!=mc:
                        maskButton.checked.connect(maskConnect.otherBoxChecked)
    
            self.pic_scene.setSceneRect(0,0,10000,200)
            for i,item in enumerate(self.maskButtons ):
                item.setGeometry(self.neighborhood*i,item.geometry().y(),item.geometry().width(),item.geometry().height())            
                self.pic_scene.addWidget(item)
    
            self.setScene(self.pic_scene)
            self.setMaximumHeight(200)
            self.setGeometry(500,500,5000,200)
        def paintEvent(self,event):
            for k,i in enumerate(self.maskButtons ):
    
                rect = i.geometry()         
                #eventually,width = height
                rect.setSize(QtCore.QSize(self.height(),self.height()))   
                self.neighborhood = self.height()               
                rect.setX(self.height()*k)
                rect.setY(rect.y())
                i.setGeometry(rect)   
                self.pic_scene.addWidget(i)     
            return QtWidgets.QGraphicsView.paintEvent(self,event)
    
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        window = View()
        window.setGeometry(500, 300, 800, 200)   
        window.show()
        sys.exit(app.exec_())
    
    很抱歉,我没有一次给出你想要的答案

    QAbstractButton版本。

    是的,我没有用QAbstractButton。这个挂在我头上。 这是QAbstractButton版本。您可以自定义所需的按钮

    从PyQt5导入QtCore、QtGui、QtWidgets

    import sys
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QMainWindow, QApplication
    from PyQt5.QtGui import QPixmap, QPainter, QPen
    
    class PicButton(QtWidgets.QAbstractButton):
        def __init__(self,x=0,y=0,width=200,height=200):
            super(PicButton,self).__init__()
            self.setGeometry(x,y,width,height)
    
        def paintEvent(self,event):        
            painter = QtGui.QPainter()
            if not painter.isActive():
                painter.begin(self)
            brush = QtGui.QBrush()     
            brush.setColor(QtGui.QColor(Qt.red))
            brush.setStyle(Qt.SolidPattern)        
            painter.setBrush(brush)
            painter.drawRect(QtCore.QRect(0,0,200,200))
            painter.end()
    
    
    class View(QtWidgets.QGraphicsView):
        def __init__(self):
            super(View,self).__init__()        
            self.pic_scene = QtWidgets.QGraphicsScene()
            self.neighborhood = 200
            self.rect_items = [PicButton() for i in range(10)]
            self.pic_scene.setSceneRect(0,0,10000,200)
            for i,item in enumerate(self.rect_items):
                item.setGeometry(self.neighborhood*i,item.geometry().y(),item.geometry().width(),item.geometry().height())            
                self.pic_scene.addWidget(item)
    
            self.setScene(self.pic_scene)
            self.setMaximumHeight(200)
            self.setGeometry(500,500,5000,200)
        def paintEvent(self,event):
            for k,i in enumerate(self.rect_items):
    
                rect = i.geometry()         
                #eventually,width = height
                rect.setSize(QtCore.QSize(self.height(),self.height()))   
                self.neighborhood = self.height()               
                rect.setX(self.height()*k)
                rect.setY(rect.y())
                i.setGeometry(rect)   
                self.pic_scene.addWidget(i)     
            return QtWidgets.QGraphicsView.paintEvent(self,event)
    
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        window = View()
        window.setGeometry(500, 300, 800, 200)   
        window.show()
        sys.exit(app.exec_())
    

    新的

    因为我接受了这些评论,所以我试图详细介绍QGraphicsView和QGraphicscene的场合

    但这只是结果。这段代码可能没有任何流行性。 无论如何,我希望你执行这段代码。 我希望你喜欢

    如果你想知道细节,请写评论

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    import sys
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QMainWindow, QApplication
    from PyQt5.QtGui import QPixmap, QPainter, QPen
    
    class PicRectItem(QtWidgets.QGraphicsRectItem):
        def __init__(self,x=0,y=0,width=200,height=200):
            super(PicRectItem,self).__init__()
            self.setRect(x,y,width,height)
            brush = QtGui.QBrush()        
            brush.setColor(QtGui.QColor(Qt.red))
            brush.setStyle(Qt.SolidPattern)        
            self.setBrush(brush)
    class View(QtWidgets.QGraphicsView):
        def __init__(self):
            super(View,self).__init__()        
            self.pic_scene = QtWidgets.QGraphicsScene()
            self.neighborhood = 200
            self.rect_items = [PicRectItem() for i in range(10)]
            for i,item in enumerate(self.rect_items):
                item.setRect(self.neighborhood*i,item.y(),item.rect().width(),item.rect().height())
            for i in self.rect_items:
                self.pic_scene.addItem(i)
            self.setScene(self.pic_scene)
            self.setMaximumHeight(200)
        def paintEvent(self,event):
            for k,i in enumerate(self.rect_items):
                rect = i.rect()
                #eventually,width = height
                rect.setSize(QtCore.QSizeF(self.height(),self.height()))   
                self.neighborhood = self.height()               
                i.setRect(rect)                 
                self.pic_scene.addItem(i)           
                rect = i.rect()
                rect.setX(self.height()*k)
                rect.setY(rect.y())
                i.setRect(rect)        
            return QtWidgets.QGraphicsView.paintEvent(self,event)
    
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        window = View()
        window.setGeometry(500, 300, 800, 200)   
        window.show()
        sys.exit(app.exec_())
    

    以前的

    我不知道你想要什么,你想这样做吗? 如果不是,我将删除此答案或重写

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    import sys
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QMainWindow, QApplication
    from PyQt5.QtGui import QPixmap, QPainter, QPen
    
    def testPixmap(r = 255,g = 0,b = 0, a = 255,size =(200,200)):
        px = QtGui.QPixmap(size[0],size[1])
        color = QtGui.QColor(r,g,b,a)
        px.fill(color) 
        return px
    
    class PicButton(QtWidgets.QAbstractButton):
        checked = QtCore.pyqtSignal(object, QtCore.QRect)
        def __init__(self, name, parent=None, w = 200, h = 200):
            self.w = w; self.h = h;  self.name = name
            super(PicButton, self).__init__(parent)
            pixmap = testPixmap(255,0,0)
            self.resetPixmaps(pixmap); self.pixmap = pixmap
            self.setCheckable(True);   self.setChecked(False)
            self.pressed.connect(self.update)
            self.released.connect(self.blank)
    
        def resetPixmaps(self, pixmap):
            self.pixmap_hover = testPixmap(20,125,200,128)
            self.pixmap_pressed = testPixmap(30,180,200,128)
    
        def blank(self):
            self.setChecked(True)    
    
        def paintEvent(self, event):        
            pix = self.pixmap_hover if self.underMouse() else self.pixmap        
            if self.isChecked():
                self.checked.emit( self.name, event.rect())    
                pix = self.pixmap_pressed
            size = self.size()        
            scaledPix = pix.scaledToHeight(size.height(), Qt.SmoothTransformation)
            # start painting the label from left upper corner
            point = QtCore.QPoint(0,0)
            point.setX((size.width() - scaledPix.width())/2)
            point.setY((size.height() - scaledPix.height())/2)
    
            painter = QPainter(self)
    
            painter.drawPixmap(point, scaledPix)
    
        def otherBoxChecked(self, func, rect):
            if self.isChecked():
                pix = self.pixmap; painter = QPainter(self); painter.drawPixmap(rect, pix)
                self.setChecked(False)            
    
        def enterEvent(self, event):
            self.update()
    
        def leaveEvent(self, event):
            self.update()
    
        def sizeHint(self):
            return QtCore.QSize(self.w, self.h)
    class Window(QtWidgets.QWidget):
        def __init__(self):
            super(Window, self).__init__()
    
            buttons = ['str(i)' for i in range(10)]
            HB2layout = QtWidgets.QHBoxLayout()
    
            self.maskButtons = [PicButton(button) for button in buttons]
            for maskButton, mb in zip(self.maskButtons, range(len(self.maskButtons))):
                for maskConnect, mc in zip(self.maskButtons, range(len(self.maskButtons))):
                    if mb!=mc:
                        maskButton.checked.connect(maskConnect.otherBoxChecked)
    
            for button in self.maskButtons:
                HB2layout.addWidget(button) 
            self.scrollChildArea = QtWidgets.QWidget()
            self.scrollChildArea.setLayout(HB2layout)
            self.scrollArea = QtWidgets.QScrollArea()
            self.scrollArea.setWidgetResizable(True)
            self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
            self.scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
            self.scrollArea.setMaximumHeight(200)
    
            self.scrollArea.setWidget(self.scrollChildArea)
            self.scrollArea.show()
            Vlayout = QtWidgets.QVBoxLayout()
            Vlayout.addWidget(self.scrollArea)
    
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        window = Window()
        window.setGeometry(500, 300, 800, 200)
    
        sys.exit(app.exec_())
    
    已添加

    from PyQt5 import QtCore, QtGui, QtWidgets
    import sys
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QMainWindow, QApplication
    from PyQt5.QtGui import QPixmap, QPainter, QPen
    
    
    
    
    def testPixmap(r = 255,g = 0,b = 0, a = 255,size =(200,200)):
        px = QtGui.QPixmap(size[0],size[1])
        color = QtGui.QColor(r,g,b,a)
        px.fill(color) 
        return px
    
    
    
    class PicButton(QtWidgets.QAbstractButton):
        checked = QtCore.pyqtSignal(object, QtCore.QRect)
        def __init__(self, name, parent=None, w = 200, h = 200):
            self.w = w; self.h = h;  self.name = name
            super(PicButton, self).__init__(parent)
            pixmap = testPixmap(255,0,0)
            self.resetPixmaps(pixmap); self.pixmap = pixmap
            self.setCheckable(True);   self.setChecked(False)
            self.pressed.connect(self.update)
            self.released.connect(self.blank)
    
        def resetPixmaps(self, pixmap):
            self.pixmap_hover = testPixmap(20,125,200,128)
            self.pixmap_pressed = testPixmap(30,180,200,128)
    
        def blank(self):
            self.setChecked(True)    
    
        def paintEvent(self, event):        
            pix = self.pixmap_hover if self.underMouse() else self.pixmap        
            if self.isChecked():
                self.checked.emit( self.name, event.rect())    
                pix = self.pixmap_pressed
            size = self.size()        
            scaledPix = pix.scaledToHeight(size.height(), Qt.SmoothTransformation)
            # start painting the label from left upper corner
            point = QtCore.QPoint(0,0)
            point.setX((size.width() - scaledPix.width())/2)
            point.setY((size.height() - scaledPix.height())/2)
    
            painter = QPainter(self)
    
            painter.drawPixmap(point, scaledPix)
    
        def otherBoxChecked(self, func, rect):
            if self.isChecked():
                pix = self.pixmap; painter = QPainter(self); painter.drawPixmap(rect, pix)
                self.setChecked(False)            
    
        def enterEvent(self, event):
            self.update()
    
        def leaveEvent(self, event):
            self.update()
    
        def sizeHint(self):
            return QtCore.QSize(self.w, self.h)
    
    
    class View(QtWidgets.QGraphicsView):
        def __init__(self):
            super(View,self).__init__()        
            self.pic_scene = QtWidgets.QGraphicsScene()
            self.neighborhood = 200
            buttons = ['str(i)' for i in range(10)]
    
            self.maskButtons = [PicButton(button) for button in buttons]
            for maskButton, mb in zip(self.maskButtons , range(len(self.maskButtons ))):
                for maskConnect, mc in zip(self.maskButtons , range(len(self.maskButtons ))):
                    if mb!=mc:
                        maskButton.checked.connect(maskConnect.otherBoxChecked)
    
            self.pic_scene.setSceneRect(0,0,10000,200)
            for i,item in enumerate(self.maskButtons ):
                item.setGeometry(self.neighborhood*i,item.geometry().y(),item.geometry().width(),item.geometry().height())            
                self.pic_scene.addWidget(item)
    
            self.setScene(self.pic_scene)
            self.setMaximumHeight(200)
            self.setGeometry(500,500,5000,200)
        def paintEvent(self,event):
            for k,i in enumerate(self.maskButtons ):
    
                rect = i.geometry()         
                #eventually,width = height
                rect.setSize(QtCore.QSize(self.height(),self.height()))   
                self.neighborhood = self.height()               
                rect.setX(self.height()*k)
                rect.setY(rect.y())
                i.setGeometry(rect)   
                self.pic_scene.addWidget(i)     
            return QtWidgets.QGraphicsView.paintEvent(self,event)
    
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        window = View()
        window.setGeometry(500, 300, 800, 200)   
        window.show()
        sys.exit(app.exec_())
    
    很抱歉,我没有一次给出你想要的答案

    QAbstractButton版本。

    是的,我没有用QAbstractButton。这个挂在我头上。 这是QAbstractButton版本。您可以自定义所需的按钮

    从PyQt5导入QtCore、QtGui、QtWidgets

    import sys
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QMainWindow, QApplication
    from PyQt5.QtGui import QPixmap, QPainter, QPen
    
    class PicButton(QtWidgets.QAbstractButton):
        def __init__(self,x=0,y=0,width=200,height=200):
            super(PicButton,self).__init__()
            self.setGeometry(x,y,width,height)
    
        def paintEvent(self,event):        
            painter = QtGui.QPainter()
            if not painter.isActive():
                painter.begin(self)
            brush = QtGui.QBrush()     
            brush.setColor(QtGui.QColor(Qt.red))
            brush.setStyle(Qt.SolidPattern)        
            painter.setBrush(brush)
            painter.drawRect(QtCore.QRect(0,0,200,200))
            painter.end()
    
    
    class View(QtWidgets.QGraphicsView):
        def __init__(self):
            super(View,self).__init__()        
            self.pic_scene = QtWidgets.QGraphicsScene()
            self.neighborhood = 200
            self.rect_items = [PicButton() for i in range(10)]
            self.pic_scene.setSceneRect(0,0,10000,200)
            for i,item in enumerate(self.rect_items):
                item.setGeometry(self.neighborhood*i,item.geometry().y(),item.geometry().width(),item.geometry().height())            
                self.pic_scene.addWidget(item)
    
            self.setScene(self.pic_scene)
            self.setMaximumHeight(200)
            self.setGeometry(500,500,5000,200)
        def paintEvent(self,event):
            for k,i in enumerate(self.rect_items):
    
                rect = i.geometry()         
                #eventually,width = height
                rect.setSize(QtCore.QSize(self.height(),self.height()))   
                self.neighborhood = self.height()               
                rect.setX(self.height()*k)
                rect.setY(rect.y())
                i.setGeometry(rect)   
                self.pic_scene.addWidget(i)     
            return QtWidgets.QGraphicsView.paintEvent(self,event)
    
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        window = View()
        window.setGeometry(500, 300, 800, 200)   
        window.show()
        sys.exit(app.exec_())
    

    新的

    因为我接受了这些评论,所以我试图详细介绍QGraphicsView和QGraphicscene的场合

    但这只是结果。这段代码可能没有任何流行性。 无论如何,我希望你执行这段代码。 我希望你喜欢

    如果你想知道细节,请写评论

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    import sys
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QMainWindow, QApplication
    from PyQt5.QtGui import QPixmap, QPainter, QPen
    
    class PicRectItem(QtWidgets.QGraphicsRectItem):
        def __init__(self,x=0,y=0,width=200,height=200):
            super(PicRectItem,self).__init__()
            self.setRect(x,y,width,height)
            brush = QtGui.QBrush()        
            brush.setColor(QtGui.QColor(Qt.red))
            brush.setStyle(Qt.SolidPattern)        
            self.setBrush(brush)
    class View(QtWidgets.QGraphicsView):
        def __init__(self):
            super(View,self).__init__()        
            self.pic_scene = QtWidgets.QGraphicsScene()
            self.neighborhood = 200
            self.rect_items = [PicRectItem() for i in range(10)]
            for i,item in enumerate(self.rect_items):
                item.setRect(self.neighborhood*i,item.y(),item.rect().width(),item.rect().height())
            for i in self.rect_items:
                self.pic_scene.addItem(i)
            self.setScene(self.pic_scene)
            self.setMaximumHeight(200)
        def paintEvent(self,event):
            for k,i in enumerate(self.rect_items):
                rect = i.rect()
                #eventually,width = height
                rect.setSize(QtCore.QSizeF(self.height(),self.height()))   
                self.neighborhood = self.height()               
                i.setRect(rect)                 
                self.pic_scene.addItem(i)           
                rect = i.rect()
                rect.setX(self.height()*k)
                rect.setY(rect.y())
                i.setRect(rect)        
            return QtWidgets.QGraphicsView.paintEvent(self,event)
    
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        window = View()
        window.setGeometry(500, 300, 800, 200)   
        window.show()
        sys.exit(app.exec_())
    

    以前的

    我不知道你想要什么,你想这样做吗? 如果不是,我将删除此答案或重写

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    import sys
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QMainWindow, QApplication
    from PyQt5.QtGui import QPixmap, QPainter, QPen
    
    def testPixmap(r = 255,g = 0,b = 0, a = 255,size =(200,200)):
        px = QtGui.QPixmap(size[0],size[1])
        color = QtGui.QColor(r,g,b,a)
        px.fill(color) 
        return px
    
    class PicButton(QtWidgets.QAbstractButton):
        checked = QtCore.pyqtSignal(object, QtCore.QRect)
        def __init__(self, name, parent=None, w = 200, h = 200):
            self.w = w; self.h = h;  self.name = name
            super(PicButton, self).__init__(parent)
            pixmap = testPixmap(255,0,0)
            self.resetPixmaps(pixmap); self.pixmap = pixmap
            self.setCheckable(True);   self.setChecked(False)
            self.pressed.connect(self.update)
            self.released.connect(self.blank)
    
        def resetPixmaps(self, pixmap):
            self.pixmap_hover = testPixmap(20,125,200,128)
            self.pixmap_pressed = testPixmap(30,180,200,128)
    
        def blank(self):
            self.setChecked(True)    
    
        def paintEvent(self, event):        
            pix = self.pixmap_hover if self.underMouse() else self.pixmap        
            if self.isChecked():
                self.checked.emit( self.name, event.rect())    
                pix = self.pixmap_pressed
            size = self.size()        
            scaledPix = pix.scaledToHeight(size.height(), Qt.SmoothTransformation)
            # start painting the label from left upper corner
            point = QtCore.QPoint(0,0)
            point.setX((size.width() - scaledPix.width())/2)
            point.setY((size.height() - scaledPix.height())/2)
    
            painter = QPainter(self)
    
            painter.drawPixmap(point, scaledPix)
    
        def otherBoxChecked(self, func, rect):
            if self.isChecked():
                pix = self.pixmap; painter = QPainter(self); painter.drawPixmap(rect, pix)
                self.setChecked(False)            
    
        def enterEvent(self, event):
            self.update()
    
        def leaveEvent(self, event):
            self.update()
    
        def sizeHint(self):
            return QtCore.QSize(self.w, self.h)
    class Window(QtWidgets.QWidget):
        def __init__(self):
            super(Window, self).__init__()
    
            buttons = ['str(i)' for i in range(10)]
            HB2layout = QtWidgets.QHBoxLayout()
    
            self.maskButtons = [PicButton(button) for button in buttons]
            for maskButton, mb in zip(self.maskButtons, range(len(self.maskButtons))):
                for maskConnect, mc in zip(self.maskButtons, range(len(self.maskButtons))):
                    if mb!=mc:
                        maskButton.checked.connect(maskConnect.otherBoxChecked)
    
            for button in self.maskButtons:
                HB2layout.addWidget(button) 
            self.scrollChildArea = QtWidgets.QWidget()
            self.scrollChildArea.setLayout(HB2layout)
            self.scrollArea = QtWidgets.QScrollArea()
            self.scrollArea.setWidgetResizable(True)
            self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
            self.scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
            self.scrollArea.setMaximumHeight(200)
    
            self.scrollArea.setWidget(self.scrollChildArea)
            self.scrollArea.show()
            Vlayout = QtWidgets.QVBoxLayout()
            Vlayout.addWidget(self.scrollArea)
    
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        window = Window()
        window.setGeometry(500, 300, 800, 200)
    
        sys.exit(app.exec_())
    


    谢谢你的帮助。你的代码部分是我想做的。但是,如果高度降低到200像素以下,我希望图片按钮的大小(高度和宽度)减小。@CSforStructuralEngineer早上好,我明白您的要求,我认为你应该使用
    QGraphicsView
    qgraphicscene
    。你把你的pixmap放在它们上面。pixmap缩放非常简单。
    QGraphicsView
    也有
    qcrollarea
    QHorizontalScrollBar
    。我不知道你为什么要用QWidgets做这件事。用
    QWidget
    做这件事,您需要将小部件调整大小事件连接到pixmap大小。现在,pixmaps仅在小部件上,但它们与
    QWidget
    没有连接。是否要使用QWidget执行此操作?谢谢您的输入。我不承诺使用QWidget,任何有效的都可以。我真的没有想过使用QGraphicsView。你能详细说明一下在这种情况下我将如何使用QGraphicsView吗?@csforStructuralEneer我更改了代码。我停止了ResizeEvent。因为当用户处理大小时,总是有时间延迟。所以当用户增加大小时,如果你把QQuiTrm改为qPixMaPiTe,你也可以这样做,也许在遭受了一些痛苦之后也会做同样的事情。谢谢你的帮助。你的代码部分是我想做的。但是,如果高度降低到200像素以下,我希望图片按钮的大小(高度和宽度)减小。@CSforStructuralEngineer早上好,我明白您的要求,我认为你应该使用
    QGraphicsView
    qgraphicscene
    。你把你的pixmap放在它们上面。pixmap缩放非常简单。
    QGraphicsView
    也有
    qcrollarea
    QHorizontalScrollBar
    。我不知道你为什么要用QWidgets做这件事。用
    QWidget
    做这件事,您需要将小部件调整大小事件连接到pixmap大小。现在,pixmaps仅在小部件上,但它们与
    QWidget
    没有连接。是否要使用QWidget执行此操作?谢谢您的输入。我不承诺使用QWidget,任何有效的都可以。我真的没有想过使用QGraphicsView。你能详细说明一下在这种情况下我将如何使用QGraphicsView吗?@csforStructuralEneer我更改了代码。我停止了ResizeEvent。因为当用户处理大小时,总是有时间延迟。所以当用户增加大小时,如果你改变QQuestMITEM到QPIXMAPITION,也可能在某些人之后做同样的事情。你能解释一下第二个PosiTes吗?我的意思是,如果用户把窗口的高度降低到200 px以下,pixmap的高度也应该减小以适应窗口,宽度应该减小以保持纵横比,如果高度大于200 px,应该怎么办?或者200px应该是按钮的最大高度?200px应该是最大高度不要担心,因为这很容易解决。你能解释第二点吗?是的,我的意思是,如果用户将窗口高度降低到200px以下,pixmap的高度也应该减小以适应窗口,宽度应该减小以保持纵横比,如果高度大于200 px,应该怎么办?或者200px应该是按钮的最大高度?200px应该是最大高度不要担心,因为