16,782
社区成员




在制作项目时,发现了一些问题,在MainWindow中,中心部件为MainWidget,在MainWidget中有两部分,一部分是QWebEngineView,置于顶层,主要显示由Vue制作的前端界面,类似游戏制作软件的UI界面,中间为场景部分,背景是透明的。另一部分是QLabel,显示的是游戏引擎渲染的画面,置于底层。
在实际运行的过程中,QLabel的画面并不能显示出来,被顶部的UI界面直接盖掉了,就算设置了透明也没有效果。实在是想不出来,特来询问大家如何解决。先前已尝试过调换顺序。
以下是程序部分代码
class MainWidget(QWidget):
def __init__(self, browser, Main_Window):
super(MainWidget, self).__init__()
self.browser = browser
self.Main_Window = Main_Window
self.browsers = {}
self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
self.setStyleSheet("background: transparent;")
self.channel = QWebChannel()
self.bridge = Bridge()
self.channel.registerObject("pyBridge", self.bridge)
self.browser.page().setWebChannel(self.channel)
self.renderLabel = QLabel("", self)
self.renderLabel.setStyleSheet("QLabel {background-color: transparent;}")
self.renderLabel.setGeometry(100,100,500,500)
self.renderLabel.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents)
self.browser.setParent(self)
self.browser.setGeometry(0,0,self.Main_Window.width(),self.Main_Window.height())
self.browser.load(url)
self.browser.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, True)
self.browser.page().setBackgroundColor(QColor(Qt.GlobalColor.transparent))
self.renderLabel.raise_()
self.browser.lower()
QTimer.singleShot(100, self.initialize_engine_surface)
self.CentralManager = CentralManager()
self.bridge.createroute.connect(self.AddDockWidget)
self.bridge.removeroute.connect(self.RemoveDockWidget)
def resizeEvent(self, event):
new_size = self.Main_Window.size()
self.renderLabel.setGeometry(100, 100, 500, 500)
self.browser.setGeometry(0, 0, new_size.width(), new_size.height())
xxx.setSurface(new_size.width(), new_size.height(), int(self.renderLabel.winId()))
super().resizeEvent(event)
def initialize_engine_surface(self):
xxx.setSurface(self.renderLabel.width(),self.renderLabel.height(),int(self.renderLabel.winId()))
这个大概是因为你label的渲染是在外部实现的?鉴于setSurface这行
就我的经验,如果涉及到组件上下重叠,渲染一定要在paintEvent里做,否则就会被其他组件的渲染覆盖
如果必须要在外部渲染,得找找有没有办法在paintEvent时让他执行