use*_*177 4 python resize pyqt qt-designer qlabel
我们正在使用PyQt和Qt Designer制作GUI.现在我们需要放置在QLabel中的图像(像素图)在调整窗口大小时很好地保持比例.
我一直在阅读其他问题/答案,但他们都使用扩展课程.由于我们在UI中不断进行更改,并且使用Qt Creator创建,因此会自动生成.ui和(相应的).py文件,因此,如果我没有错,使用类解决方案不是一个好的选择.我们因为每次更新ui时都应该手动更改类的名称.
是否有任何选项可以自动调整QLAbel中的像素图,保持比率并避免使用扩展的clases?
谢谢.
有几种方法可以做到这一点.
首先,您可以将Qt Designer中的QLabel提升为使用python编写的自定义子类.右键单击QLabel并选择"Promote to ...",然后为该类命名(例如"ScaledLabel")并将头文件设置为将从其导入自定义子类的python模块(例如'mylib.班).
然后,自定义子类将重新实现resizeEvent如下:
class ScaledLabel(QtGui.QLabel):
def __init__(self, *args, **kwargs):
QtGui.QLabel.__init__(self)
self._pixmap = QtGui.QPixmap(self.pixmap())
def resizeEvent(self, event):
self.setPixmap(self._pixmap.scaled(
self.width(), self.height(),
QtCore.Qt.KeepAspectRatio))
Run Code Online (Sandbox Code Playgroud)
为了使其正常工作,QLabel应将其大小策略设置为扩展或最小扩展,并且最小大小应设置为小的非零值(因此可以缩小图像).
第二种方法避免使用子类并使用事件过滤器来处理resize事件:
class MainWindow(QtGui.QMainWindow):
def __init__(self):
...
self._pixmap = QtGui.QPixmap(self.label.pixmap())
self.label.installEventFilter(self)
def eventFilter(self, widget, event):
if (event.type() == QtCore.QEvent.Resize and
widget is self.label):
self.label.setPixmap(self._pixmap.scaled(
self.label.width(), self.label.height(),
QtCore.Qt.KeepAspectRatio))
return True
return QtGui.QMainWindow.eventFilter(self, widget, event)
Run Code Online (Sandbox Code Playgroud)