我需要根据动态生成的 JSON 文件的内容动态构建一个屏幕,该文件包含可变数量的小部件,以及可变大小、位置、颜色等。我希望内容填满整个屏幕。
问题是,在让 Scene 和 View 很好地适应之后,在边缘有一个漂亮的小边框,添加一个 GroupBox ——好吧,无论如何设置标题,使场景?看法?比屏幕大。
在我取消注释之前,以下非常精简的示例具有正确的外观self.box.setTitle("Speaker 1")
。原始代码有几个带有 CSS 样式的 GroupBox,它们看起来是正确的。然而,屏幕底部的场景/视图边框消失了,不管我给 GroupBoxes 的高度是多少。
(我最初尝试在不使用 View / Scene 的情况下编写此代码,但无法按照我想要的方式定位 / 调整 QGroupBoxes 的大小。)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PySide.QtCore import *
from PySide.QtGui import *
class Viewport(QGraphicsView):
def __init__(self, parent=None):
super(Viewport, self).__init__(parent)
self.parent = parent
self.setFixedSize(self.parent.width - 21,
self.parent.height - 21)
self.scene = QGraphicsScene(0, 0,
self.parent.width - 42,
self.parent.height - 42,
self)
self.setScene(self.scene)
self.box = QGroupBox(self)
# self.box.setTitle("Speaker 1") # THIS BREAKS IT
self.box.setObjectName("speaker1")
self.box.setGeometry(12, 12, 200, 200)
class UI(QDialog):
def __init__(self, width, height, parent=None):
super(UI, self).__init__(parent)
self.parent = parent
self.width = width
self.height = height
self.view = Viewport(self)
gridLayout = QGridLayout()
gridLayout.addWidget(self.view, 0, 0, 1, 1)
self.setLayout(gridLayout)
self.setWindowFlags(Qt.FramelessWindowHint)
self.showFullScreen()
app = QApplication(sys.argv)
screen_resolution = app.desktop().screenGeometry()
width, height = screen_resolution.width(), screen_resolution.height()
ui = UI(width, height)
ui.show()
sys.exit(app.exec_())
从我想做的更复杂的事情开始:
(上面包含的代码应该会产生相同的效果,只是它只有一个 QGroupBox,而且我没有设置它来显示边框,也没有让它像我的第二个屏幕截图中的那样高。)
添加标题还会导致包含所有内容的 QDialog 不再使用整个屏幕。请注意第二张图像顶部的系统栏的外观。