DIV Qt 图形框架中的等效标签
DIV tag equivalent in Qt Graphics Framework
我正在开发一个简单的桌面应用程序,我必须在其中显示文件夹和文件的树结构以及其他图表。为此,我选择了 Qt 和 python (PySide)。我需要一个像下面这样的结构(请原谅我画得不好。但是你明白了):
文件夹可以双击expand/shrink。当文件夹展开时,新的子元素需要占用更多space,当前文件夹下的文件夹必须向下移动。同样当文件夹缩小时,当前文件夹下的文件夹必须出现;就像一个标准的文件夹系统。
因此我正在 Qt 中寻找一个 <div>
等效元素,我可以在其中放置每个目录及其所有子目录 div 并且 div 可以扩展和收缩.这样我就不必在每次文件夹 opened/closed 时都为重新绘制编写代码。目前我必须计算每个项目的位置并将子项目放置在该位置。这是大量的计算,没有项目 > 1000。With a div, I will just re-calculate positions of child items and resize the div. Other divs can then automatically re-draw themselves.
我没有使用 QTreeView,因为正如我之前所说,我必须绘制其他图表并将这些文件夹与它们连接起来。 QTreeView 将存在于它自己的 space 中(带有滚动条和东西),我将无法画线来连接 QTreeView 和 QGraphicsScene 中的项目。
您可以查看我目前的作品here in github. Here is the file that has my work.
我不确定你在想什么“<div>
”。就是最简单的HTML容器,和你的目标好像没什么关系
您可以使用图形布局自动对齐场景中的项目。以下是它的实现方式:
from PySide import QtGui, QtCore
class Leaf(QtGui.QGraphicsProxyWidget):
def __init__(self, path, folder = None):
QtGui.QGraphicsProxyWidget.__init__(self)
self.folder = folder
label = QtGui.QLabel()
label.setText(QtCore.QFileInfo(path).fileName())
self.setWidget(label)
self.setToolTip(path)
self.setAcceptedMouseButtons(QtCore.Qt.LeftButton)
def mousePressEvent(self, event):
if self.folder:
self.folder.toggleChildren()
class Folder(QtGui.QGraphicsWidget):
def __init__(self, path, isTopLevel = False):
QtGui.QGraphicsWidget.__init__(self)
self.offset = 32
childrenLayout = QtGui.QGraphicsLinearLayout(QtCore.Qt.Vertical)
childrenLayout.setContentsMargins(self.offset, 0, 0, 0)
flags = QtCore.QDir.AllEntries | QtCore.QDir.NoDotAndDotDot
for info in QtCore.QDir(path).entryInfoList(flags):
if info.isDir():
childrenLayout.addItem(Folder(info.filePath()))
else:
childrenLayout.addItem(Leaf(info.filePath()))
self.childrenWidget = QtGui.QGraphicsWidget()
self.childrenWidget.setLayout(childrenLayout)
mainLayout = QtGui.QGraphicsLinearLayout(QtCore.Qt.Vertical)
mainLayout.setContentsMargins(0, 0, 0, 0)
self.leaf = Leaf(path, self)
mainLayout.addItem(self.leaf)
mainLayout.addItem(self.childrenWidget)
if isTopLevel:
mainLayout.addStretch()
self.setLayout(mainLayout)
def paint(self, painter, option, widget):
QtGui.QGraphicsWidget.paint(self, painter, option, widget)
if self.childrenWidget.isVisible() and self.childrenWidget.layout().count() > 0:
lastChild = self.childrenWidget.layout().itemAt(self.childrenWidget.layout().count() - 1)
lastChildY = self.childrenWidget.geometry().top() + \
lastChild.geometry().top() + self.leaf.geometry().height() / 2;
painter.drawLine(self.offset / 2, self.leaf.geometry().bottom(), self.offset / 2, lastChildY)
for i in range(0, self.childrenWidget.layout().count()):
child = self.childrenWidget.layout().itemAt(i)
childY = self.childrenWidget.geometry().top() + \
child.geometry().top() + self.leaf.geometry().height() / 2
painter.drawLine(self.offset / 2, childY, self.offset, childY)
def toggleChildren(self):
if self.childrenWidget.isVisible():
self.layout().removeItem(self.childrenWidget)
self.childrenWidget.hide()
self.leaf.widget().setStyleSheet("QLabel { color : blue; }")
print "hide"
else:
self.childrenWidget.show()
self.layout().insertItem(1, self.childrenWidget)
self.leaf.widget().setStyleSheet("")
self.update()
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
scene = QtGui.QGraphicsScene()
view = QtGui.QGraphicsView(scene)
# put your root path here
scene.addItem(Folder("/usr/share/alsa", True))
view.show()
view.resize(400, 400)
sys.exit(app.exec_())
我正在开发一个简单的桌面应用程序,我必须在其中显示文件夹和文件的树结构以及其他图表。为此,我选择了 Qt 和 python (PySide)。我需要一个像下面这样的结构(请原谅我画得不好。但是你明白了):
文件夹可以双击expand/shrink。当文件夹展开时,新的子元素需要占用更多space,当前文件夹下的文件夹必须向下移动。同样当文件夹缩小时,当前文件夹下的文件夹必须出现;就像一个标准的文件夹系统。
因此我正在 Qt 中寻找一个 <div>
等效元素,我可以在其中放置每个目录及其所有子目录 div 并且 div 可以扩展和收缩.这样我就不必在每次文件夹 opened/closed 时都为重新绘制编写代码。目前我必须计算每个项目的位置并将子项目放置在该位置。这是大量的计算,没有项目 > 1000。With a div, I will just re-calculate positions of child items and resize the div. Other divs can then automatically re-draw themselves.
我没有使用 QTreeView,因为正如我之前所说,我必须绘制其他图表并将这些文件夹与它们连接起来。 QTreeView 将存在于它自己的 space 中(带有滚动条和东西),我将无法画线来连接 QTreeView 和 QGraphicsScene 中的项目。
您可以查看我目前的作品here in github. Here is the file that has my work.
我不确定你在想什么“<div>
”。就是最简单的HTML容器,和你的目标好像没什么关系
您可以使用图形布局自动对齐场景中的项目。以下是它的实现方式:
from PySide import QtGui, QtCore
class Leaf(QtGui.QGraphicsProxyWidget):
def __init__(self, path, folder = None):
QtGui.QGraphicsProxyWidget.__init__(self)
self.folder = folder
label = QtGui.QLabel()
label.setText(QtCore.QFileInfo(path).fileName())
self.setWidget(label)
self.setToolTip(path)
self.setAcceptedMouseButtons(QtCore.Qt.LeftButton)
def mousePressEvent(self, event):
if self.folder:
self.folder.toggleChildren()
class Folder(QtGui.QGraphicsWidget):
def __init__(self, path, isTopLevel = False):
QtGui.QGraphicsWidget.__init__(self)
self.offset = 32
childrenLayout = QtGui.QGraphicsLinearLayout(QtCore.Qt.Vertical)
childrenLayout.setContentsMargins(self.offset, 0, 0, 0)
flags = QtCore.QDir.AllEntries | QtCore.QDir.NoDotAndDotDot
for info in QtCore.QDir(path).entryInfoList(flags):
if info.isDir():
childrenLayout.addItem(Folder(info.filePath()))
else:
childrenLayout.addItem(Leaf(info.filePath()))
self.childrenWidget = QtGui.QGraphicsWidget()
self.childrenWidget.setLayout(childrenLayout)
mainLayout = QtGui.QGraphicsLinearLayout(QtCore.Qt.Vertical)
mainLayout.setContentsMargins(0, 0, 0, 0)
self.leaf = Leaf(path, self)
mainLayout.addItem(self.leaf)
mainLayout.addItem(self.childrenWidget)
if isTopLevel:
mainLayout.addStretch()
self.setLayout(mainLayout)
def paint(self, painter, option, widget):
QtGui.QGraphicsWidget.paint(self, painter, option, widget)
if self.childrenWidget.isVisible() and self.childrenWidget.layout().count() > 0:
lastChild = self.childrenWidget.layout().itemAt(self.childrenWidget.layout().count() - 1)
lastChildY = self.childrenWidget.geometry().top() + \
lastChild.geometry().top() + self.leaf.geometry().height() / 2;
painter.drawLine(self.offset / 2, self.leaf.geometry().bottom(), self.offset / 2, lastChildY)
for i in range(0, self.childrenWidget.layout().count()):
child = self.childrenWidget.layout().itemAt(i)
childY = self.childrenWidget.geometry().top() + \
child.geometry().top() + self.leaf.geometry().height() / 2
painter.drawLine(self.offset / 2, childY, self.offset, childY)
def toggleChildren(self):
if self.childrenWidget.isVisible():
self.layout().removeItem(self.childrenWidget)
self.childrenWidget.hide()
self.leaf.widget().setStyleSheet("QLabel { color : blue; }")
print "hide"
else:
self.childrenWidget.show()
self.layout().insertItem(1, self.childrenWidget)
self.leaf.widget().setStyleSheet("")
self.update()
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
scene = QtGui.QGraphicsScene()
view = QtGui.QGraphicsView(scene)
# put your root path here
scene.addItem(Folder("/usr/share/alsa", True))
view.show()
view.resize(400, 400)
sys.exit(app.exec_())