QLabel中如何调整图片大小?
How to adjust the size of picture in QLabel?
由于图片太大,无法按照QLabel中设计的拉伸进行缩放
下面是我的代码:
class goShow(QMainWindow):
def __init__(self):
super().__init__()
self.initGUI()
self.filePath = os.path.dirname(__file__)
def initGUI(self):
# self.setAcceptDrops(True)
# self.resize(800, 600)
widget = QWidget()
self.setCentralWidget(widget)
self.resTable = QTableWidget()
# self.dotPlot = PictureLabel('****')
self.dotPlot = QLabel()
# self.dotPlot.setStyleSheet("background: rgb(255, 0, 0)")
self.barPlot = QLabel()
# self.barPlot.setStyleSheet("background: rgb(0, 255, 0)")
layout = QVBoxLayout()
widget.setLayout(layout)
self.mainLayout = layout
self.mainLayout.addWidget(self.resTable, stretch=4)
self.mainLayout.addWidget(self.dotPlot,stretch=1)
self.mainLayout.addWidget(self.barPlot,stretch=1)
self.show()
def showTable(self, input):
#show talbe
dim = input.shape
self.resTable.setRowCount(dim[0])
self.resTable.setColumnCount(dim[1])
for i in range(int(dim[0])):
for j in range(int(dim[1])):
print(i, j)
self.resTable.setItem(i, j, QTableWidgetItem(str(input.iloc[i, j])))
def showDotPlot(self):
dotPng = QPixmap(os.path.join('F:\job\projects\snpExplore\test\res_temp',"dotplot.png"))
self.dotPlot.setPixmap(dotPng)
self.dotPlot.setScaledContents(True)
def showBarPlot(self):
# show barplot
barPng = QPixmap(os.path.join('F:\job\projects\snpExplore\test\res_temp',"barplot.png"))
self.barPlot.setPixmap(barPng)
self.barPlot.setScaledContents(True)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = goShow()
goResTable = pd.read_csv("F:\job\projects\snpExplore\test\res_temp\go.csv", header=0)
w.showTable(goResTable)
w.showBarPlot()
w.showDotPlot()
sys.exit(app.exec_())
得到的图片如下:
第二张和第三张图片太大,第一张table小了很多。但是我希望小部件大小的比例分别是4:1:1。
如果没有为标签设置最小尺寸,将始终使用像素图尺寸。为避免这种情况,您可以设置任意最小尺寸:
def showDotPlot(self):
dotPng = QPixmap('big1.jpg')
self.dotPlot.setPixmap(dotPng)
self.dotPlot.setMinimumSize(1, 1)
self.dotPlot.setScaledContents(True)
不幸的是,这会导致图像被拉伸:
在这种情况下,唯一的选择是 subclassing。
在此示例中,我继承自 QLabel,但如果您不需要 class 提供的所有功能,使用标准 QWidget 就足够了(但您可能需要添加用于设置像素图和对齐方式的方法) .
class ScaledPixmapLabel(QLabel):
scaled = None
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# if no minimum size is set, it will always use the image size
self.setMinimumSize(1, 1)
def resizeEvent(self, event):
if self.pixmap() and not self.pixmap().isNull():
self.scaled = self.pixmap().scaled(
self.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
def paintEvent(self, event):
if self.pixmap() and not self.pixmap().isNull():
if not self.scaled:
self.scaled = self.pixmap().scaled(
self.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
# the available rectangle
available = self.rect()
# the pixmap rectangle that will be used as a reference to paint into
rect = self.scaled.rect()
# move to the center of the available rectangle
rect.moveCenter(available.center())
# then move the rectangle according to the alingment
align = self.alignment()
if align & Qt.AlignLeft:
rect.moveLeft(available.left())
elif align & Qt.AlignRight:
rect.moveRight(available.right())
if align & Qt.AlignTop:
rect.moveTop(available.top())
elif align & Qt.AlignBottom:
rect.moveBottom(available.bottom())
qp = QPainter(self)
qp.drawPixmap(rect, self.scaled)
class goShow(QMainWindow):
def initGUI(self):
# ...
self.dotPlot = ScaledPixmapLabel(alignment=Qt.AlignCenter)
self.barPlot = ScaledPixmapLabel(alignment=Qt.AlignCenter)
# ...
def showDotPlot(self):
dotPng = QPixmap(os.path.join('F:\job\projects\snpExplore\test\res_temp',"dotplot.png"))
self.dotPlot.setPixmap(dotPng)
# no need to set other options
由于图片太大,无法按照QLabel中设计的拉伸进行缩放
下面是我的代码:
class goShow(QMainWindow):
def __init__(self):
super().__init__()
self.initGUI()
self.filePath = os.path.dirname(__file__)
def initGUI(self):
# self.setAcceptDrops(True)
# self.resize(800, 600)
widget = QWidget()
self.setCentralWidget(widget)
self.resTable = QTableWidget()
# self.dotPlot = PictureLabel('****')
self.dotPlot = QLabel()
# self.dotPlot.setStyleSheet("background: rgb(255, 0, 0)")
self.barPlot = QLabel()
# self.barPlot.setStyleSheet("background: rgb(0, 255, 0)")
layout = QVBoxLayout()
widget.setLayout(layout)
self.mainLayout = layout
self.mainLayout.addWidget(self.resTable, stretch=4)
self.mainLayout.addWidget(self.dotPlot,stretch=1)
self.mainLayout.addWidget(self.barPlot,stretch=1)
self.show()
def showTable(self, input):
#show talbe
dim = input.shape
self.resTable.setRowCount(dim[0])
self.resTable.setColumnCount(dim[1])
for i in range(int(dim[0])):
for j in range(int(dim[1])):
print(i, j)
self.resTable.setItem(i, j, QTableWidgetItem(str(input.iloc[i, j])))
def showDotPlot(self):
dotPng = QPixmap(os.path.join('F:\job\projects\snpExplore\test\res_temp',"dotplot.png"))
self.dotPlot.setPixmap(dotPng)
self.dotPlot.setScaledContents(True)
def showBarPlot(self):
# show barplot
barPng = QPixmap(os.path.join('F:\job\projects\snpExplore\test\res_temp',"barplot.png"))
self.barPlot.setPixmap(barPng)
self.barPlot.setScaledContents(True)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = goShow()
goResTable = pd.read_csv("F:\job\projects\snpExplore\test\res_temp\go.csv", header=0)
w.showTable(goResTable)
w.showBarPlot()
w.showDotPlot()
sys.exit(app.exec_())
得到的图片如下:
第二张和第三张图片太大,第一张table小了很多。但是我希望小部件大小的比例分别是4:1:1。
如果没有为标签设置最小尺寸,将始终使用像素图尺寸。为避免这种情况,您可以设置任意最小尺寸:
def showDotPlot(self):
dotPng = QPixmap('big1.jpg')
self.dotPlot.setPixmap(dotPng)
self.dotPlot.setMinimumSize(1, 1)
self.dotPlot.setScaledContents(True)
不幸的是,这会导致图像被拉伸:
在这种情况下,唯一的选择是 subclassing。
在此示例中,我继承自 QLabel,但如果您不需要 class 提供的所有功能,使用标准 QWidget 就足够了(但您可能需要添加用于设置像素图和对齐方式的方法) .
class ScaledPixmapLabel(QLabel):
scaled = None
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# if no minimum size is set, it will always use the image size
self.setMinimumSize(1, 1)
def resizeEvent(self, event):
if self.pixmap() and not self.pixmap().isNull():
self.scaled = self.pixmap().scaled(
self.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
def paintEvent(self, event):
if self.pixmap() and not self.pixmap().isNull():
if not self.scaled:
self.scaled = self.pixmap().scaled(
self.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
# the available rectangle
available = self.rect()
# the pixmap rectangle that will be used as a reference to paint into
rect = self.scaled.rect()
# move to the center of the available rectangle
rect.moveCenter(available.center())
# then move the rectangle according to the alingment
align = self.alignment()
if align & Qt.AlignLeft:
rect.moveLeft(available.left())
elif align & Qt.AlignRight:
rect.moveRight(available.right())
if align & Qt.AlignTop:
rect.moveTop(available.top())
elif align & Qt.AlignBottom:
rect.moveBottom(available.bottom())
qp = QPainter(self)
qp.drawPixmap(rect, self.scaled)
class goShow(QMainWindow):
def initGUI(self):
# ...
self.dotPlot = ScaledPixmapLabel(alignment=Qt.AlignCenter)
self.barPlot = ScaledPixmapLabel(alignment=Qt.AlignCenter)
# ...
def showDotPlot(self):
dotPng = QPixmap(os.path.join('F:\job\projects\snpExplore\test\res_temp',"dotplot.png"))
self.dotPlot.setPixmap(dotPng)
# no need to set other options