有没有办法在父窗口小部件(PySide/Qt)上覆盖多个项目
我有一个主要的父窗口小部件,我希望在父窗口小部件的顶部有几个布局 使用父窗口小部件初始化布局将把布局放在父窗口小部件的顶部。我喜欢这一点,并且希望对同一个父窗口小部件执行多次(左、上、下和右) 我使用了一个QGridLayout和不同的子布局,但这导致了布局的调整,并迫使它们变小。最后添加的任何覆盖都应位于其他项目的顶部 下面是我想要的一个非常简单的例子有没有办法在父窗口小部件(PySide/Qt)上覆盖多个项目,qt,pyqt,pyside,Qt,Pyqt,Pyside,我有一个主要的父窗口小部件,我希望在父窗口小部件的顶部有几个布局 使用父窗口小部件初始化布局将把布局放在父窗口小部件的顶部。我喜欢这一点,并且希望对同一个父窗口小部件执行多次(左、上、下和右) 我使用了一个QGridLayout和不同的子布局,但这导致了布局的调整,并迫使它们变小。最后添加的任何覆盖都应位于其他项目的顶部 下面是我想要的一个非常简单的例子 import sys from PySide import QtGui, QtCore class Overlay(QtGui.QBoxL
import sys
from PySide import QtGui, QtCore
class Overlay(QtGui.QBoxLayout):
"""Overlay widgets on a parent widget."""
def __init__(self, parent=None, location="left"):
super().__init__(QtGui.QBoxLayout.TopToBottom, parent)
if location == "left" or location == "right":
self.setDirection(QtGui.QBoxLayout.TopToBottom)
if location == "right":
self.setAlignment(QtCore.Qt.AlignRight)
elif location == "top" or location == "bottom":
self.setDirection(QtGui.QBoxLayout.LeftToRight)
if location == "bottom":
self.setAlignment(QtCore.Qt.AlignBottom)
self.css = "QWidget {background-color: lightskyblue; color: white}"
# end Constructor
def addWidget(self, widget):
super().addWidget(widget)
widget.setStyleSheet(self.css)
# end addWidget
# end class Overlay
def main():
app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()
window.show()
widg = QtGui.QTreeView()
window.setCentralWidget(widg)
left = Overlay(widg, "left")
left.addWidget(QtGui.QLabel("HELLO"))
left.addWidget(QtGui.QLabel("WORLD!"))
top = Overlay(widg, "top")
top.addWidget(QtGui.QLabel("Hello"))
top.addWidget(QtGui.QLabel("World!"))
right = Overlay(location="right")
right.setParent(widg)
right.addWidget(QtGui.QLabel("hello"))
right.addWidget(QtGui.QLabel("world!"))
return app.exec_()
# end main
if __name__ == '__main__':
sys.exit(main())
是否存在具有相同父级的多个布局?如果没有,是否有办法创建一个虚拟小部件,它将与父小部件一起移动,并让覆盖层使用多个虚拟小部件作为其父小部件
也
做的事情与
layout = QtGui.QBoxLayout(QtGui.QBoxLayout.TopToBottom)
layout.setParent(parent_widget)
初始化对不同的父级做了什么?我通过创建自己的主自定义布局解决了这个问题。OverlyCenter将主窗口小部件作为其父窗口小部件,您只需将其他布局添加到此布局
import sys
from PySide import QtGui, QtCore
class OverlayCenter(QtGui.QLayout):
"""Layout for managing overlays."""
def __init__(self, parent):
super().__init__(parent)
# Properties
self.setContentsMargins(0, 0, 0, 0)
self.items = []
# end Constructor
def addLayout(self, layout):
"""Add a new layout to overlay on top of the other layouts and widgets."""
self.addChildLayout(layout)
self.addItem(layout)
# end addLayout
def __del__(self):
"""Destructor for garbage collection."""
item = self.takeAt(0)
while item:
item = self.takeAt(0)
# end Destructor
def addItem(self, item):
"""Add an item (widget/layout) to the list."""
self.items.append(item)
# end addItem
def count(self):
"""Return the number of items."""
return len(self.items)
# end Count
def itemAt(self, index):
"""Return the item at the given index."""
if index >= 0 and index < len(self.items):
return self.items[index]
return None
# end itemAt
def takeAt(self, index):
"""Remove and return the item at the given index."""
if index >= 0 and index < len(self.items):
return self.items.pop(index)
return None
# end takeAt
def setGeometry(self, rect):
"""Set the main geometry and the item geometry."""
super().setGeometry(rect)
for item in self.items:
item.setGeometry(rect)
# end setGeometry
# end class OverlayCenter
class Overlay(QtGui.QBoxLayout):
"""Overlay widgets on a parent widget."""
def __init__(self, location="left", parent=None):
super().__init__(QtGui.QBoxLayout.TopToBottom, parent)
if location == "left":
self.setDirection(QtGui.QBoxLayout.TopToBottom)
self.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
elif location == "right":
self.setDirection(QtGui.QBoxLayout.TopToBottom)
self.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
elif location == "top":
self.setDirection(QtGui.QBoxLayout.LeftToRight)
self.setAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignHCenter)
elif location == "bottom":
self.setDirection(QtGui.QBoxLayout.LeftToRight)
self.setAlignment(QtCore.Qt.AlignBottom | QtCore.Qt.AlignHCenter)
self.css = "QWidget {background-color: lightskyblue; color: white}"
# end Constructor
def addWidget(self, widget):
super().addWidget(widget)
widget.setStyleSheet(self.css)
# end addWidget
# end class Overlay
def main():
app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()
window.show()
widg = QtGui.QTreeView()
window.setCentralWidget(widg)
left = Overlay("left")
lhlbl = QtGui.QLabel("Hello")
lwlbl = QtGui.QLabel("World!")
lhlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
lwlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
left.addWidget(lhlbl)
left.addWidget(lwlbl)
top = Overlay("top")
lhlbl = QtGui.QLabel("HELLO")
lwlbl = QtGui.QLabel("WORLD!")
lhlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
lwlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
top.addWidget(lhlbl)
top.addWidget(lwlbl)
right = Overlay("right")
lhlbl = QtGui.QLabel("hellO")
lwlbl = QtGui.QLabel("worlD!")
lhlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
lwlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
right.addWidget(lhlbl)
right.addWidget(lwlbl)
bottom = Overlay("bottom")
lhlbl = QtGui.QLabel("hello")
lwlbl = QtGui.QLabel("world!")
lhlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
lwlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
bottom.addWidget(lhlbl)
bottom.addWidget(lwlbl)
center = OverlayCenter(widg)
center.addLayout(left)
center.addLayout(top)
center.addLayout(right)
center.addLayout(bottom)
return app.exec_()
# end main
if __name__ == '__main__':
sys.exit(main())
导入系统
从PySide导入QtGui、QtCore
类覆盖中心(QtGui.QLayout):
“”“用于管理覆盖的布局。”“”
定义初始化(自身,父级):
super()。\uuuu init\uuuu(父级)
#性质
self.setContentsMargins(0,0,0,0)
self.items=[]
#端构造函数
def添加布局(自身,布局):
“”“添加一个新布局以覆盖在其他布局和小部件之上。”“”
self.addChildLayout(布局)
自添加项(布局)
#末端添加布局
定义(自我):
“”“垃圾回收的析构函数。”“”
item=self.takeAt(0)
而项目:
item=self.takeAt(0)
#端部析构函数
def附加项(自身,项目):
“”“将项目(小部件/布局)添加到列表。”“”
self.items.append(项目)
#结束附加项
def计数(自身):
“”“返回项目数。”“”
返回len(自我项目)
#结束计数
def itemAt(自身,索引):
“”“返回给定索引处的项。”“”
如果索引>=0且索引import sys
from PySide import QtGui, QtCore
class OverlayCenter(QtGui.QLayout):
"""Layout for managing overlays."""
def __init__(self, parent):
super().__init__(parent)
# Properties
self.setContentsMargins(0, 0, 0, 0)
self.items = []
# end Constructor
def addLayout(self, layout):
"""Add a new layout to overlay on top of the other layouts and widgets."""
self.addChildLayout(layout)
self.addItem(layout)
# end addLayout
def __del__(self):
"""Destructor for garbage collection."""
item = self.takeAt(0)
while item:
item = self.takeAt(0)
# end Destructor
def addItem(self, item):
"""Add an item (widget/layout) to the list."""
self.items.append(item)
# end addItem
def count(self):
"""Return the number of items."""
return len(self.items)
# end Count
def itemAt(self, index):
"""Return the item at the given index."""
if index >= 0 and index < len(self.items):
return self.items[index]
return None
# end itemAt
def takeAt(self, index):
"""Remove and return the item at the given index."""
if index >= 0 and index < len(self.items):
return self.items.pop(index)
return None
# end takeAt
def setGeometry(self, rect):
"""Set the main geometry and the item geometry."""
super().setGeometry(rect)
for item in self.items:
item.setGeometry(rect)
# end setGeometry
# end class OverlayCenter
class Overlay(QtGui.QBoxLayout):
"""Overlay widgets on a parent widget."""
def __init__(self, location="left", parent=None):
super().__init__(QtGui.QBoxLayout.TopToBottom, parent)
if location == "left":
self.setDirection(QtGui.QBoxLayout.TopToBottom)
self.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
elif location == "right":
self.setDirection(QtGui.QBoxLayout.TopToBottom)
self.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
elif location == "top":
self.setDirection(QtGui.QBoxLayout.LeftToRight)
self.setAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignHCenter)
elif location == "bottom":
self.setDirection(QtGui.QBoxLayout.LeftToRight)
self.setAlignment(QtCore.Qt.AlignBottom | QtCore.Qt.AlignHCenter)
self.css = "QWidget {background-color: lightskyblue; color: white}"
# end Constructor
def addWidget(self, widget):
super().addWidget(widget)
widget.setStyleSheet(self.css)
# end addWidget
# end class Overlay
def main():
app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()
window.show()
widg = QtGui.QTreeView()
window.setCentralWidget(widg)
left = Overlay("left")
lhlbl = QtGui.QLabel("Hello")
lwlbl = QtGui.QLabel("World!")
lhlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
lwlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
left.addWidget(lhlbl)
left.addWidget(lwlbl)
top = Overlay("top")
lhlbl = QtGui.QLabel("HELLO")
lwlbl = QtGui.QLabel("WORLD!")
lhlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
lwlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
top.addWidget(lhlbl)
top.addWidget(lwlbl)
right = Overlay("right")
lhlbl = QtGui.QLabel("hellO")
lwlbl = QtGui.QLabel("worlD!")
lhlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
lwlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
right.addWidget(lhlbl)
right.addWidget(lwlbl)
bottom = Overlay("bottom")
lhlbl = QtGui.QLabel("hello")
lwlbl = QtGui.QLabel("world!")
lhlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
lwlbl.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
bottom.addWidget(lhlbl)
bottom.addWidget(lwlbl)
center = OverlayCenter(widg)
center.addLayout(left)
center.addLayout(top)
center.addLayout(right)
center.addLayout(bottom)
return app.exec_()
# end main
if __name__ == '__main__':
sys.exit(main())