【问题标题】:How to adjust the size of picture in QLabel?如何在QLabel中调整图片的大小?
【发布时间】:2020-02-07 16:03:25
【问题描述】:

由于图片太大,无法根据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_())

这是得到的图片:

第二张和第三张图片太大了,第一张桌子太小了。但是我希望widget大小的比例分别是4:1:1。

【问题讨论】:

    标签: python image pyqt5 stretch


    【解决方案1】:

    如果没有为标签设置最小尺寸,则始终使用像素图尺寸。为避免这种情况,您可以设置任意最小尺寸:

        def showDotPlot(self):
            dotPng = QPixmap('big1.jpg')
            self.dotPlot.setPixmap(dotPng)
            self.dotPlot.setMinimumSize(1, 1)
            self.dotPlot.setScaledContents(True)
    

    很遗憾,这会导致图像被拉伸:

    在这种情况下,唯一的选择是子类化。
    在本例中,我继承自 QLabel,但如果您不需要该类提供的所有功能,则使用标准 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
    

    【讨论】:

    • 它有效。这哥们我好久了。非常感谢您的帮助!
    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2015-03-24
    • 1970-01-01
    • 2011-07-19
    • 2019-05-11
    • 1970-01-01
    相关资源
    最近更新 更多