PySide6和PyQt5的show()不仅仅是展示这么简单

看一段代码:

python 复制代码
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QFrame


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # 创建主窗口
        self.setWindowTitle("Main Window")
        self.setGeometry(100, 100, 800, 600)  # 设置窗口位置和大小

        # 创建 QFrame
        self.frame = QFrame(self)
        self.frame.setGeometry(50, 50, 200, 200)  # 设置 QFrame 在 QMainWindow 中的位置和大小

        # 设置 QFrame 的背景色
        self.frame.setStyleSheet("background-color: #00007f;")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window1 = MainWindow()
    window1.show()

    sys.exit(app.exec())

这是一段很典型的代码,在一个画面中放置一个QFrame,并将其背景色设置为#00007f。

进一步的需求是需要获取window1.frame的背景颜色,使用下面的代码,就可以获取背景色:

python 复制代码
p1 = window1.frame.palette()  # 获取部件的调色板
background_color1 = p1.color(p1.ColorRole.Window)  # 从部件的调色板获取背景颜色
print('背景色:', background_color1.name())

完整代码如下:

python 复制代码
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QFrame


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # 创建主窗口
        self.setWindowTitle("Main Window")
        self.setGeometry(100, 100, 800, 600)  # 设置窗口位置和大小

        # 创建 QFrame
        self.frame = QFrame(self)
        self.frame.setGeometry(50, 50, 200, 200)  # 设置 QFrame 在 QMainWindow 中的位置和大小

        # 设置 QFrame 的背景色
        self.frame.setStyleSheet("background-color: #00007f;")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window1 = MainWindow()
    p1 = window1.frame.palette()  # 获取部件的调色板
    background_color1 = p1.color(p1.ColorRole.Window)  # 从部件的调色板获取背景颜色
    print('背景色:', background_color1.name())
    window1.show()

    sys.exit(app.exec())

运行结果:

python 复制代码
C:\Users\DY\AppData\Local\Programs\Python\Python38\python.exe E:\pyside模板\pys\tmp2.py 
背景色: #f0f0f0

进程已结束,退出代码0

可以看到,成功获取了window1.frame的背景颜色,但是并没有输出预设的#00007f,而是输出了一个QFrame的默认预置色#f0f0f0。

这个问题困扰了我一整天。。。我用了十几个小时查资料和做实验才解决了问题。

方法是:将获取背景色的语句放在show()语句之后。按照我的理解,window1 = MainWindow()

这一句就已经把window1的所有部件进行初始化和赋值了,show()语句仅仅是显示出来,然而并不是,show()语句执行的操作远比想象中多。

下面是修改后的代码:

python 复制代码
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QFrame
#
#
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # 创建主窗口
        self.setWindowTitle("Main Window")
        self.setGeometry(100, 100, 800, 600)  # 设置窗口位置和大小

        # 创建 QFrame
        self.frame = QFrame(self)
        self.frame.setGeometry(50, 50, 200, 200)  # 设置 QFrame 在 QMainWindow 中的位置和大小

        # 设置 QFrame 的背景色
        self.frame.setStyleSheet("background-color: #00007f;")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window1 = MainWindow()

    p1 = window1.frame.palette()  # 获取部件的调色板
    background_color1 = p1.color(p1.ColorRole.Window)  # 从部件的调色板获取背景颜色
    print('show()之前的背景色:', background_color1.name())

    window1.show()  # 画面的展示

    p2 = window1.frame.palette()  # 获取部件的调色板
    background_color2 = p2.color(p2.ColorRole.Window)  # 从部件的调色板获取背景颜色
    print('show()之后的背景色:', background_color2.name())

    sys.exit(app.exec())

运行结果:

python 复制代码
C:\Users\DY\AppData\Local\Programs\Python\Python38\python.exe E:\pyside模板\pys\tmp2.py 
show()之前的背景色: #f0f0f0
show()之后的背景色: #00007f

进程已结束,退出代码0
复制代码
测试PyQt5,运行结果相同。

写出来,大家不要再踩坑。

相关推荐
胖者是谁3 小时前
EasyPlayerPro的使用方法
前端·javascript·css
EndingCoder3 小时前
索引类型和 keyof 操作符
linux·运维·前端·javascript·ubuntu·typescript
liux35283 小时前
Web集群管理实战指南:从架构到运维
运维·前端·架构
沛沛老爹3 小时前
Web转AI架构篇 Agent Skills vs MCP:工具箱与标准接口的本质区别
java·开发语言·前端·人工智能·架构·企业开发
小光学长4 小时前
基于Web的长江游轮公共服务系统j225o57w(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库
大学生毕业题目5 小时前
毕业项目推荐:105-基于yolov8/yolov5/yolo11的烟草等级检测识别系统(Python+卷积神经网络)
人工智能·python·yolo·目标检测·cnn·pyqt·烟草等级
Joe5565 小时前
vue2 + antDesign 下拉框限制只能选择2个
服务器·前端·javascript
ChangYan.5 小时前
monorepo 多包管理识别不到新增模块,解决办法
前端·chrome
Jinuss5 小时前
React元素创建介绍
前端·react.js
济6176 小时前
linux 系统移植(第六期)--Uboot移植(5)--bootcmd 和 bootargs 环境变量-- Ubuntu20.04
java·前端·javascript