看一段代码:
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,运行结果相同。
写出来,大家不要再踩坑。