Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QT-QPixmap未使用当前父级大小重新缩放_Qt_Python 3.x_Pyqt_Qt5_Pyqt5 - Fatal编程技术网

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
it
self
在垂直方向上不超过当前屏幕大小的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)