pyqt5小部件未显示所需大小

时间:2018-02-19 05:45:30

标签: python pyqt

我想实现一个类,用一个滚动条创建一个固定大小的简单小部件,同时显示一个或多个(对问题至关重要)的图像。这是(但完整但有效)代码:

from PyQt5 import QtCore, QtWidgets, QtGui


class ImageViewWidget(QtWidgets.QScrollArea):
    def __init__(self, parent = None):
        super(ImageViewWidget, self).__init__(parent)

        self.w = QtWidgets.QFrame()
        self.l = QtWidgets.QVBoxLayout()
        self.w.setLayout(self.l)
        self.setWidget(self.w)

    def setImages(self, *images):
        self.imageLabel = QtWidgets.QLabel()
        self.imageLabel.setScaledContents(True)
        self.l.addWidget(self.imageLabel)

        if not images[0].isNull():
            self.imageLabel.setPixmap(QtGui.QPixmap.fromImage(images[0]))

        self.normalSize()

        ## event = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, QtCore.Qt.Key_N, QtCore.Qt.NoModifier)
        ## QtWidgets.QApplication.sendEvent(self, event)

    def normalSize(self):
        self.w.adjustSize()

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_N:
            self.normalSize()



if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    imageViewer = ImageViewWidget()
    imageViewer.resize(800, 600)
    imageViewer.show()
    image1 = QtGui.QImage('test.png')
    imageViewer.setImages(image1)
    sys.exit(app.exec_())

问题是,图像在启动时未显示resp没有所需的大小。一个人必须按" n"首先,然后以自然尺寸显示图像。当然,我希望从一开始就拥有自然尺寸,而无需按下" n"第一。 按下" n"对我来说似乎很奇怪。并且调用self.normalSize()没有相同的效果,甚至通过setImages中的两个注释轮廓模拟关键事件与按下" n"的效果不同物理上。

有两个"解决方案":

  1. 设置图片后显示窗口小部件,即将行imageViewer.show()向下移动2行。

  2. 将方法setImages的前3行移至__init__方法。

  3. 两者都不合理,因为我想动态添加和删除QLabels(尚未实现)以显示不同的图像,以及图像的数量(同时显示)可以变化

    有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您好我修改了您的代码。 添加了这2行。

self.timerSingleShot = QtCore.QTimer()
self.timerSingleShot.singleShot(1, self.normalSize)

与PyQt5语法一起使用。此语法适用于PyQt4

from PyQt5 import QtCore, QtWidgets, QtGui

class ImageViewWidget(QtWidgets.QScrollArea):
  def __init__(self, parent = None):
    super(ImageViewWidget, self).__init__(parent)

    self.w = QtWidgets.QFrame()
    self.l = QtWidgets.QVBoxLayout()
    self.w.setLayout(self.l)
    self.setWidget(self.w)

    # Added this lines
    self.timerSingleShot = QtCore.QTimer()
    self.timerSingleShot.singleShot(1, self.normalSize)


  def setImages(self, *images):
    self.imageLabel = QtWidgets.QLabel()
    self.imageLabel.setScaledContents(True)
    self.l.addWidget(self.imageLabel)

    if not images[0].isNull():
        self.imageLabel.setPixmap(QtGui.QPixmap.fromImage(images[0]))

    #self.normalSize()

    ## event = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, QtCore.Qt.Key_N, QtCore.Qt.NoModifier)
    ## QtWidgets.QApplication.sendEvent(self, event)

  def normalSize(self):
    self.w.adjustSize()

  def keyPressEvent(self, event):
    if event.key() == QtCore.Qt.Key_N:
        self.normalSize()



if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    imageViewer = ImageViewWidget()
    imageViewer.resize(800, 600)
    imageViewer.show()
    image1 = QtGui.QImage('test.png')
    imageViewer.setImages(image1)
    sys.exit(app.exec_())

答案 1 :(得分:0)

这也有效。移位线:

imageViewer.show()

代码。

from PyQt5 import QtCore, QtWidgets, QtGui


class ImageViewWidget(QtWidgets.QScrollArea):
    def __init__(self, parent = None):
        super(ImageViewWidget, self).__init__(parent)

        self.w = QtWidgets.QFrame()
        self.l = QtWidgets.QVBoxLayout()
        self.w.setLayout(self.l)
        self.setWidget(self.w)

    def setImages(self, *images):
        self.imageLabel = QtWidgets.QLabel()
        self.imageLabel.setScaledContents(True)
        self.l.addWidget(self.imageLabel)

        if not images[0].isNull():
            self.imageLabel.setPixmap(QtGui.QPixmap.fromImage(images[0]))

        #self.normalSize()

        ## event = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, QtCore.Qt.Key_N, QtCore.Qt.NoModifier)
        ## QtWidgets.QApplication.sendEvent(self, event)

    def normalSize(self):
        self.w.adjustSize()

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_N:
            self.normalSize()


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    imageViewer = ImageViewWidget()
    imageViewer.resize(800, 600)
    image1 = QtGui.QImage('test.png')
    imageViewer.setImages(image1)
    imageViewer.show()
    sys.exit(app.exec_())