Python PyQt5:QScrollArea保持Pixmap纵横比
基于此,我使用QAbstractButton创建了一组pixmap按钮(PicButton),并希望将它们添加到滚动区域中,以便用户可以水平滚动。然而,我需要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
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应该是最大高度不要担心,因为