鱼C论坛

 找回密码
 立即注册
查看: 1841|回复: 16

[已解决]Pyqt Qlabel 图像缩放问题

[复制链接]
发表于 2021-4-10 21:52:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
from PyQt5.QtCore import QTimer, QStringListModel, Qt
pix = QPixmap.fromImage(qimage)
pix_scaled = pix.scaled(pix.width(), pix.height(), aspectRatioMode=Qt.KeepAspectRatio)
self.label_10.setPixmap(pix_scaled)

想要实现 图片的比例随着界面的拉伸缩小而不破坏长宽比例 ,然鹅不尽人意。
KeepAspectRatio 参数根本没起作用 这是什么原因?
最佳答案
2021-4-11 00:39:21
本帖最后由 hrp 于 2021-4-11 01:15 编辑
昨非 发表于 2021-4-10 23:40
你说的这个我今天debug的时候试了(巧了思路完全一样)
但是有问题,就是init初始化后,在槽函数里修改 ...


简单写了个例子:
# coding: utf-8

import sys

from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QLabel,
    QLineEdit,
    QPushButton,
    QVBoxLayout,
    QWidget,
)


class MainWin(QWidget):
    """主窗口类"""

    def __init__(self):
        super().__init__()
        self.resize(500, 100)
        # 初始化一个属性用于测试
        self.my_string = None
        self.label = QLabel("文字显示位置")
        self.pb = QPushButton("显示子窗口")
        self.setup_ui()
        self.show()

    def setup_ui(self):
        """设置主窗口布局"""
        hlayout = QHBoxLayout()
        hlayout.addWidget(self.label)
        hlayout.addWidget(self.pb)
        self.setLayout(hlayout)

    def set_label_text(self, string):
        """接收一个字符串参数并在主窗口显示"""
        self.label.setText(string)
        # 顺便测试更新my_string属性
        self.my_string = string
        print("当前my_string属性值为:%s" % self.my_string)


class ChildWin(QWidget):
    """子窗口类"""

    # 发射字符串的自定义信号
    xinhao = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.setWindowTitle("输入然后点击")
        self.resize(300, 100)
        # 设置子窗口打开后主窗口不可点击
        self.setWindowModality(Qt.ApplicationModal)
        self.pb1 = QPushButton("主窗显示文字")
        self.pb2 = QPushButton("主窗显示文字并关闭子窗")
        self.line_edit = QLineEdit()
        self.setup_ui()
        self.connect_signal_slot()

    def connect_signal_slot(self):
        self.pb1.clicked.connect(self.fashezifu)
        self.pb2.clicked.connect(self.fashezifu)
        self.pb2.clicked.connect(self.close)
        # 自定义信号xinhao连接主窗口的set_label_text方法
        self.xinhao.connect(main_win.set_label_text)
        # 主窗口的按钮点击信号连接子窗口的show方法
        main_win.pb.clicked.connect(self.show)

    def setup_ui(self):
        """设置子窗口布局"""
        hlayout = QHBoxLayout()
        hlayout.addWidget(self.pb1)
        hlayout.addWidget(self.pb2)
        vlayout = QVBoxLayout()
        vlayout.addWidget(self.line_edit)
        vlayout.addLayout(hlayout)
        self.setLayout(vlayout)

    def fashezifu(self):
        """发射xinhao信号,发射一个字符串"""
        self.xinhao.emit(self.line_edit.text())


app = QApplication(sys.argv)
main_win = MainWin()
child_win = ChildWin()
sys.exit(app.exec_())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-10 21:58:14 | 显示全部楼层
本帖最后由 591821661 于 2021-4-11 16:13 编辑

问题解决了

发现ScaledContents的优先级要大于KeepAspectRatio。。

把这两个设置为False即可

2021-04-11_16-12-24 by Sharpstar_kylin.png
2021-04-10_21-57-58 by Sharpstar_kylin.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-10 22:13:04 | 显示全部楼层
591821661 发表于 2021-4-10 21:58
问题解决了,长宽比例能够保持,但是图片不缩放了!

发现ScaledContents的优先级要大于KeepAspectRatio ...

兄弟,我最近也在用pyqt5(初学,现学现卖哈)
请问有无多窗口参数传递经验呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-10 22:13:13 | 显示全部楼层
解决了,害。。。有人教我怎么删帖吗。。。自己解决了1个半小时+搜索 解决不了 发个论坛 结果自己解决了 原来论坛发帖还有这魔力?

不瞎扯了,聊聊正事:
发下菜鸡的代码 供参考和抨击
            qr_code_content = self.MovieUrlList[sel_num-1]
            qr_code_maker = qrcode.QRCode(version=5,
                                          error_correction=qrcode.constants.ERROR_CORRECT_M,
                                          box_size=8,
                                          border=4,
                                          )
            qr_code_maker.add_data(data=qr_code_content)
            qr_code_maker.make(fit=True)
            img = qr_code_maker.make_image(fill_color="black", back_color="white")
            qimage = ImageQt.ImageQt(img.get_image())
            pix = QPixmap.fromImage(qimage)
            min_label_len = min(self.label_10.width(), self.label_10.height())
            pix_scaled = pix.scaled(min_label_len, min_label_len, aspectRatioMode=Qt.KeepAspectRatio)
            self.label_10.setPixmap(pix_scaled)

目前感觉还是比较蠢的实现方法 因为自己设置的图片长宽  (我希望它本希望它。。如图)
9e31678cgy1fqkn8pymbbj20bp07laab.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-10 22:17:23 | 显示全部楼层
昨非 发表于 2021-4-10 22:13
兄弟,我最近也在用pyqt5(初学,现学现卖哈)
请问有无多窗口参数传递经验呢?

没有,我也是刚学会点皮毛,不然也不会困扰那么久了
所有功能都在单窗口实现  但是我帮你@hrp

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
昨非 + 5 + 5 + 3 没事,一起学习哈

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-10 22:28:10 From FishC Mobile | 显示全部楼层
591821661 发表于 2021-4-10 22:17
没有,我也是刚学会点皮毛,不然也不会困扰那么久了
所有功能都在单窗口实现  但是我帮你@hr ...

其实我也差不多,没有系统地学过pyqt5,只是遇到问题在百度搜方法而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-10 22:33:03 From FishC Mobile | 显示全部楼层
昨非 发表于 2021-4-10 22:13
兄弟,我最近也在用pyqt5(初学,现学现卖哈)
请问有无多窗口参数传递经验呢?

多窗口参数传递可以利用pyqt5的信号和槽函数机制,可以跨窗口传递信号(python中的数据类型都可以传递)、连接槽函数,也可以跨线程传递信号和连接槽函数,可以先了解一下pyqt5的信号与槽函数。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
昨非 + 5 + 5 + 3 仰仗了

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-4-10 22:51:37 | 显示全部楼层
hrp 发表于 2021-4-10 22:33
多窗口参数传递可以利用pyqt5的信号和槽函数机制,可以跨窗口传递信号(python中的数据类型都可以传递)、 ...

我知道这个传递,但是从子窗口传过去的信号在接受的时候我是赋值给了一个属性了
这就必然导致这一属性定义不在主窗口类的__init__上,后面会有些影响(抱歉暂时说不清楚哈)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-10 22:56:49 | 显示全部楼层
hrp 发表于 2021-4-10 22:33
多窗口参数传递可以利用pyqt5的信号和槽函数机制,可以跨窗口传递信号(python中的数据类型都可以传递)、 ...

之前对多窗口编程毫无经验,也没有多文件编程的实战经验
这次从框架上就是自己硬着头皮想出来的,没有现有项目参考
真就是自己比葫芦画瓢,好几个瓢硬是往一起拼
我尽量先自己找找资料吧(如果老哥有推荐的书或教程、项目之类的话,还望分享下)
后续有啥问题自己解决不了还要仰仗老哥指个方向
提前谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-10 23:31:36 From FishC Mobile | 显示全部楼层
昨非 发表于 2021-4-10 22:51
我知道这个传递,但是从子窗口传过去的信号在接受的时候我是赋值给了一个属性了
这就必然导致这一属性定 ...


你说的应该是信号发射的数据,在主窗口类x中赋值给一个属性了吧,你可以在主窗口类x初始化方法init中初始该属性值为None,当发射信号时更改该属性值,使用该属性的地方,先判断属性值是否为None。不知道你说的是不是这个意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-10 23:40:28 From FishC Mobile | 显示全部楼层
hrp 发表于 2021-4-10 23:31
你说的应该是信号发射的数据,在主窗口类x中赋值给一个属性了吧,你可以在主窗口类x初始化方法init中初 ...

你说的这个我今天debug的时候试了(巧了思路完全一样)
但是有问题,就是init初始化后,在槽函数里修改不了这个属性值,测试多次还是初始值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-10 23:47:47 | 显示全部楼层
昨非 发表于 2021-4-10 22:56
之前对多窗口编程毫无经验,也没有多文件编程的实战经验
这次从框架上就是自己硬着头皮想出来的,没有现 ...

我自己之前并没有打算学gui,但是后来又有需要,所以都是靠百度现学现卖,没有系统地学过pyqt。
之前看到过一个用pyqt5写的阅读器,可以看看:lector 不过都是英文。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-11 00:08:35 From FishC Mobile | 显示全部楼层
hrp 发表于 2021-4-10 23:47
我自己之前并没有打算学gui,但是后来又有需要,所以都是靠百度现学现卖,没有系统地学过pyqt。
之前看 ...

嗯,谢了老哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-11 00:39:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hrp 于 2021-4-11 01:15 编辑
昨非 发表于 2021-4-10 23:40
你说的这个我今天debug的时候试了(巧了思路完全一样)
但是有问题,就是init初始化后,在槽函数里修改 ...


简单写了个例子:
# coding: utf-8

import sys

from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QLabel,
    QLineEdit,
    QPushButton,
    QVBoxLayout,
    QWidget,
)


class MainWin(QWidget):
    """主窗口类"""

    def __init__(self):
        super().__init__()
        self.resize(500, 100)
        # 初始化一个属性用于测试
        self.my_string = None
        self.label = QLabel("文字显示位置")
        self.pb = QPushButton("显示子窗口")
        self.setup_ui()
        self.show()

    def setup_ui(self):
        """设置主窗口布局"""
        hlayout = QHBoxLayout()
        hlayout.addWidget(self.label)
        hlayout.addWidget(self.pb)
        self.setLayout(hlayout)

    def set_label_text(self, string):
        """接收一个字符串参数并在主窗口显示"""
        self.label.setText(string)
        # 顺便测试更新my_string属性
        self.my_string = string
        print("当前my_string属性值为:%s" % self.my_string)


class ChildWin(QWidget):
    """子窗口类"""

    # 发射字符串的自定义信号
    xinhao = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.setWindowTitle("输入然后点击")
        self.resize(300, 100)
        # 设置子窗口打开后主窗口不可点击
        self.setWindowModality(Qt.ApplicationModal)
        self.pb1 = QPushButton("主窗显示文字")
        self.pb2 = QPushButton("主窗显示文字并关闭子窗")
        self.line_edit = QLineEdit()
        self.setup_ui()
        self.connect_signal_slot()

    def connect_signal_slot(self):
        self.pb1.clicked.connect(self.fashezifu)
        self.pb2.clicked.connect(self.fashezifu)
        self.pb2.clicked.connect(self.close)
        # 自定义信号xinhao连接主窗口的set_label_text方法
        self.xinhao.connect(main_win.set_label_text)
        # 主窗口的按钮点击信号连接子窗口的show方法
        main_win.pb.clicked.connect(self.show)

    def setup_ui(self):
        """设置子窗口布局"""
        hlayout = QHBoxLayout()
        hlayout.addWidget(self.pb1)
        hlayout.addWidget(self.pb2)
        vlayout = QVBoxLayout()
        vlayout.addWidget(self.line_edit)
        vlayout.addLayout(hlayout)
        self.setLayout(vlayout)

    def fashezifu(self):
        """发射xinhao信号,发射一个字符串"""
        self.xinhao.emit(self.line_edit.text())


app = QApplication(sys.argv)
main_win = MainWin()
child_win = ChildWin()
sys.exit(app.exec_())

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
591821661 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-4-11 00:42:01 | 显示全部楼层

我自己写的AwesomePyKit也用到多窗口,可惜我因为懒没写注释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-11 00:45:58 From FishC Mobile | 显示全部楼层
hrp 发表于 2021-4-11 00:42
我自己写的AwesomePyKit也用到多窗口,可惜我因为懒没写注释

关机了,有空这聊天就研究研究哈,老哥早点睡,注意头发
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-11 12:26:16 | 显示全部楼层
hrp 发表于 2021-4-11 00:39
简单写了个例子:

学习到了!正好想通过子窗口设置代理!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 02:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表