QT-QPixmap未使用当前父级大小重新缩放
我正试图构建一个QT-QPixmap未使用当前父级大小重新缩放,qt,python-3.x,pyqt,qt5,pyqt5,Qt,Python 3.x,Pyqt,Qt5,Pyqt5,我正试图构建一个顶栏以放入其他小部件布局,但我不知道为什么`QPixmap在更改应用程序窗口大小时没有重新缩放。代码如下: QPixmap位于QMainWindow的centralWidget的QLabel内 Qt5.8-Python3.6 我已于2017年3月24日更新了此代码并删除了以前的版本 0-依赖关系 from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * import sys
顶栏
以放入其他小部件布局
,但我不知道为什么`QPixmap在更改应用程序窗口大小时没有重新缩放。代码如下:
QPixmap
位于QMainWindow的centralWidget
的QLabel
内
Qt5.8-Python3.6
我已于2017年3月24日更新了此代码并删除了以前的版本
0-依赖关系
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
def resizeHandler(self,event):
print(" I've been in resizeHandler")
if self.objectName() == "topBar":
print("I've been resizing the topBar")
logo = QPixmap('some_Image')
# Debug
# You'll be able to see that it does re-scale, but it's not updating the Pixmap.
logo.scaled(event.size(),Qt.KeepAspectRatio).save("pixmap.png")
# ...
logoContainer = QLabel()
logoContainer.setPixmap(logo.scaled(event.size(),Qt.KeepAspectRatio,Qt.FastTransformation))
logoContainer.setMaximumSize(logo.width(),logo.height())
containerLayout = QHBoxLayout()
containerLayout.addWidget(logoContainer,0)
container = QWidget()
container.setLayout(containerLayout)
# Layout
layout = QHBoxLayout()
layout.addWidget(container,0)
self.setLayout(layout)
main.setCentralWidget(self)
1-主窗口
class MainWindow(QMainWindow):
def __init__(self):
print("I've been in main window")
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("I'm here, the main window")
2-顶栏
class topBar(QWidget):
def __init__(self):
print("I've been in topBar")
super().__init__()
self.initUI()
def initUI(self):
self.setObjectName("topBar")
self.setStyleSheet("""
QWidget {background-color: pink;}
QLabel {background-color: green; }""")
def resizeEvent(self,event):
resizeHandler(self,event) # You'll see this little dude right next
3-resizeEvent
处理程序就是这样,我认为问题是
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
def resizeHandler(self,event):
print(" I've been in resizeHandler")
if self.objectName() == "topBar":
print("I've been resizing the topBar")
logo = QPixmap('some_Image')
# Debug
# You'll be able to see that it does re-scale, but it's not updating the Pixmap.
logo.scaled(event.size(),Qt.KeepAspectRatio).save("pixmap.png")
# ...
logoContainer = QLabel()
logoContainer.setPixmap(logo.scaled(event.size(),Qt.KeepAspectRatio,Qt.FastTransformation))
logoContainer.setMaximumSize(logo.width(),logo.height())
containerLayout = QHBoxLayout()
containerLayout.addWidget(logoContainer,0)
container = QWidget()
container.setLayout(containerLayout)
# Layout
layout = QHBoxLayout()
layout.addWidget(container,0)
self.setLayout(layout)
main.setCentralWidget(self)
4-测试
if __name__ == '__main__':
print("I've been in __main__")
app = 0
app = QApplication(sys.argv)
app.aboutToQuit.connect(app.deleteLater)
app.setWindowIcon(QIcon('someIcon'))
main = MainWindow()
main.layout().setSizeConstraint(QLayout.SetNoConstraint)
bar = topBar()
main.setCentralWidget(bar)
main.show()
app.exec_()
如果可能的话,我还想限制topBar
itself
在垂直方向上不超过当前屏幕大小的20%(setMaximumHeight
?但基于什么?),但我不确定如何设置
谢谢 要让小部件填充容器,您需要将垂直和水平大小策略设置为最小、展开、最小展开或忽略
至于第二个问题,它不是Qt小部件的内置功能。使用QML或Web引擎可能会更幸运。您可以创建QWidget的一个子类,该子类使用setGeometry()和一些窗口计算来约束其大小。我认为您在尝试诊断问题时看到的是错误的 你最后的评论是 真正的问题是QPixmap没有更新其大小 这是因为显示它的
QLabel
没有被调整大小。回到您的原始代码,我认为您需要做的就是在容器
和QLabel
徽标
之间插入一个布局
class topBar(QWidget):
def __init__(self,parent):
super().__init__()
container = QWidget()
container.setMaximumSize(587,208)
container.setMinimumSize(0,0)
## Logo
logo = QLabel(container)
#logo = QLabel(container_layout)
logo.setPixmap(QPixmap('.some_image_in_the_current_working_dir.png'))
logo.setScaledContents(1)
# G.M.
container_layout = QHBoxLayout(container)
container_layout.addWidget(logo)
# Layout
## to center content horizontally in wrapper w/o preventing rescale
layout = QHBoxLayout(self)
layout.addWidget(container)
self.setStyleSheet("""
QWidget {background-color: red;}
QLabel {background-color: green; Qt::KeepAspectRatio;}""")
if __name__ == '__main__':
app = 0
app = QApplication(sys.argv)
app.aboutToQuit.connect(app.deleteLater)
test = topBar(None)
test.show()
app.exec_()
(寻找通用汽车的评论)
上面的代码只是为
容器
创建一个布局容器
,并将徽标
作为它的子项。这似乎解决了我想您正在描述的问题。经过大量的调试和阅读,我想出了以下解决方案(使用numpy
帮助重新缩放):
def resizeHandler(自身,事件):
如果self.objectName()=“topBar”:
#擦除旧布局
temp=QWidget()
临时设置布局(self.layout())
#像素地图
logoPixmap=QPixmap('./img/exampleImage.png')
#标签
logolable=QLabel()
logolable.setPixmap(logoPixmap)
logoLabel.setScaledContents(真)
##标签容器布局
containerLayout=QHBoxLayout()
containerLayout.addWidget(logoLabel,0)
#标签容器
logoContainer=QWidget()
logoContainer.setLayout(容器布局)
#查找缩放框的宽度和高度
#图像单位向量
imageSize=np.array((logoPixmap.width(),logoPixmap.height())
screenSize=np.array((event.size().width(),event.size().height())
#每个尺寸相对于最小边的比例
#请注意,一个始终是单位向量,另一个大于单位
screenUVec=screenSize/screenSize.min()
imageUVec=imageSize/imageSize.min()
#minBorder 11是应用程序垂直边框和中心小部件之间的距离
#22是中心Widget开始出现的最小高度
#应根据Qmain窗口菜单栏和statsbar的高度而变化
minBorder=np.array([11,22])*2
屏幕大小-=最小边框
对于轴,枚举中的大小(屏幕大小):
如果尺寸小于0:
屏幕大小[轴]=0
maxSize=np.零(2)
#基于maxSide的理想比率
比率=整数(圆形(屏幕大小[imageUVec.argmax()]/imageUVec.max()-0.4999999))
如果比率>=1且0不在屏幕大小中:#图像在当前屏幕上可缩放
maxSize[imageUVec.argmin()]=min(屏幕大小[imageUVec.argmin()],比率)#如果要将maxSize限制为图像的最大大小,我们应该添加imageSize[imageUVec.argmin()]
maxSize[imageUVec.argmax()]=maxSize[imageUVec.argmin()]*imageUVec.max()
sizeUVec=maxSize/maxSize.min()
#布局
布局=QHBoxLayout()
layout.addWidget(logoContainer,0)
logolable.setMaximumSize(QSize(maxSize[0],maxSize[1]))
self.setLayout(布局)
特别感谢,他告诉我,我们应该首先删除旧布局。当我开始观看globals
时,我发现有几个布局是堆叠的
至于重新缩放部分,我仍然走了一条非常规的道路,但它的行为符合我的要求。尝试了
[*]。设置izepolicy([policy 1],[policy 2])
策略是一对QSizePolicy.MinimumExpanding
和QSizePolicy.Expanding
但它仍然没有重新缩放。我不知道QLabel
是否没有重新缩放,或者它是否是容器
QWidget
。谢谢你的回复!是什么让你认为容器不可伸缩?将self.setStyleSheet(“”
更改为container.setStyleSheet(“”)
你会看到container
一直在缩放,直到达到你设定的最大大小。真正的问题不是logo
没有缩放吗?有一段时间,我认为随着当前屏幕的缩小或扩展,container没有被调整大小。在过去3天里,我一直在尝试许多方法来解决这个非常简单的问题,但是我无法解决它。最新的方法是删除setScaledContents(True)
,并尝试重新定义resizeEvent
,将pixmap更新为pixmap.scaled(main.width(),main.height(),Qt.KeepA)