我试图建立一个QOpenGLWidget,其纵横比是固定的。问题是这个小部件在QDock中,所以resizeEvent方法会干扰渲染,我不知道为什么。我该怎么做?你知道吗
MRE公司:
# -*- coding: utf-8 -*-
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QOpenGLWidget, QMainWindow, QApplication, QDockWidget, QLabel
class Renderizador(QOpenGLWidget):
def __init__(self):
QOpenGLWidget.__init__(self)
# policy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
# policy.setHeightForWidth(True)
# self.setSizePolicy(policy)
# size = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
# size.setHeightForWidth(True)
# size.setWidthForHeight(True)
# self.setSizePolicy(size)
# def heightForWidth(self, width):
# return width
# def sizeHint(self):
# return QSize(400, 400)
# def resizeEvent(self, event):
# event.accept()
# self.resize(event.size().width(), event.size().height())
class Ventana(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
widget_central = QLabel("Hi")
widget_central.setGeometry(10, 10, 100, 100)
self.setCentralWidget(widget_central)
self.renderizador = Renderizador()
dock_renderizador = QDockWidget("Render")
dock_renderizador.setFeatures(QDockWidget.DockWidgetMovable)
self.addDockWidget(Qt.LeftDockWidgetArea, dock_renderizador)
dock_renderizador.setWidget(self.renderizador)
if __name__ == "__main__":
MainEvent = QApplication([])
main_app = Ventana()
main_app.show()
MainEvent.exec()
非常感谢你的回答,音乐大师。 我找到了如何重新实现resizeEvent来伪造效果:
小部件的固定纵横比是很难实现的。你知道吗
虽然有一个“单个小部件”(顶部窗口)可以使用,但大多数情况下,人们希望小部件的长宽比是固定的,这些小部件位于具有布局的窗口中,其中可能包含其他小部件。有了Qdock,情况就更复杂了。你知道吗
必须考虑多个方面:
此外,在您的例子中,更多的问题会出现;最重要的是,QQMainWindow有its own private layout:
Qt通过调用每个子窗口小部件的复杂递归系统在内部计算所有大小,最后根据其大小提示、大小策略和窗口小部件角色布置所有窗口小部件(QMainWindows的“中心窗口小部件”及其内容优先于最小大小要求,但是菜单栏和状态栏大小提示也被考虑在内)。你知道吗
另外,QDockWidget可以有不同的行为,不管它是浮动的还是不浮动的,如果它是浮动的,它必须考虑所选dock widget区域中的其他现有dock widget,如果窗口支持选项卡式停靠(并且如果支持垂直选项卡)或嵌套停靠(同一区域中的多行或列)。你知道吗
最后,有两个重要方面:
QOpenGLWidget在调整大小方面并不是那么快,这通常会导致动态调整大小时出现一些闪烁。
一旦你用它的qspliter调整dockbar的大小,这个提示就会被自动忽略;虽然这在理论上也是可以解决的(我不知道怎么做),但这可能会让事情变得更加困难。
长话短说:任何要嵌入任何布局的小部件的固定纵横比都是不鼓励的。你知道吗
在下面的示例中,我试图解决大多数问题,但请记住,这是一个非常原始的实现,有很多问题(最重要的是,前面提到的闪烁:使用标准的QWidget子代,效果最小化,但仍然存在),而且,真诚地说,我不建议使用它。你知道吗
如你所见,乍一看似乎一切正常:
但是,只要移动dock splitter或者将窗口调整到小于
(dockWidgetMaximumSizeForSquare + minimumWidthOfWidgets)
的宽度,小部件就可以获得垂直边距,因为没有水平空间了。你知道吗相关问题 更多 >
编程相关推荐