【发布时间】:2020-09-09 18:37:31
【问题描述】:
您好,我正在阅读 this 文章关于如何拖放小部件项目,这很有意义,例如
Qt 的项目视图使用内部 application/x-qabstractitemmodeldatalist MIME 类型传递项目
我还阅读了this Question,它主要关注来自 Qlinewidget 和 QTreewidget 的字符串模型。
但是我怎样才能获得包含多个 QtWidgets 的 QFrame 的 QAbstractItemView.model()。
底线问题是:如何在 QTreeWidget 中移动包含多个 QtWidgets 的 QFrame。请看下面的示例代码: 按下按钮添加子节点并尝试将它们拖到其他子节点或第一级树层次结构的父节点之间
from PyQt5.QtWidgets import (QTreeWidget, QTreeWidgetItem, QPushButton, QLabel, QDialog, QVBoxLayout, QApplication, QLineEdit)
from PyQt5.QtWidgets import (QPushButton, QDialog, QTreeWidget,
QTreeWidgetItem, QVBoxLayout,
QHBoxLayout, QFrame, QLabel, QComboBox,
QApplication)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
self.index=0
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.treeWidget = QtWidgets.QTreeWidget(self.centralwidget)
self.treeWidget.setObjectName("treeWidget")
self.treeWidget.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.treeWidget.setFrameShadow(QtWidgets.QFrame.Sunken)
self.treeWidget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
self.treeWidget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
self.treeWidget.setAutoScrollMargin(10)
self.treeWidget.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove)
self.treeWidget.setDragEnabled(1)
self.treeWidget.setDefaultDropAction(QtCore.Qt.MoveAction)
self.treeWidget.setAnimated(True)
self.treeWidget.setWordWrap(False)
self.treeWidget.setExpandsOnDoubleClick(True)
self.treeWidget.setObjectName("treeWidget")
self.treeWidget.header().setVisible(False)
self.treeWidget.header().setHighlightSections(False)
self.treeWidget.header().setSortIndicatorShown(False)
self.treeWidget.header().setStretchLastSection(True)
self.gridLayout.addWidget(self.treeWidget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
#initialize top level items
self.topLevelItem1 = QTreeWidgetItem(self.treeWidget)
#add those top level in treewidget
self.treeWidget.addTopLevelItem(self.topLevelItem1)
#create button
self.ButtonWidget=QtWidgets.QPushButton("Press")
self.ButtonWidget.clicked.connect(self.AddQFrame)
#add button to tree widget
self.treeWidget.setItemWidget(self.topLevelItem1, 0, self.ButtonWidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def AddQFrame(self):
#add combo box on button press
self.index=self.index+1
#create child item
self.ChildItem1 = QTreeWidgetItem()
self.topLevelItem1.addChild(self.ChildItem1)
#create frame & horizontal layout for that child item
self.ChildWidgetFrame=QFrame(self.treeWidget)
self.layoutChild=QHBoxLayout(self.ChildWidgetFrame)
#layout in qframe
self.QcomboWidget=QtWidgets.QComboBox()
self.QcomboWidget.addItem("item "+str(self.index))
self.QcomboWidget.addItem("CC")
self.QcomboWidget.addItem("CV")
self.spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
#widgets in layout
self.layoutChild.addWidget(QLabel("#"+str(self.index)))
self.layoutChild.addWidget(self.QcomboWidget)
self.layoutChild.addItem(self.spacerItem3)
#display widget
self.treeWidget.setItemWidget(self.ChildItem1, 0, self.ChildWidgetFrame)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.treeWidget.setSortingEnabled(False)
self.treeWidget.headerItem().setText(0, _translate("MainWindow", "1"))
__sortingEnabled = self.treeWidget.isSortingEnabled()
self.treeWidget.setSortingEnabled(False)
self.treeWidget.setSortingEnabled(__sortingEnabled)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
编辑
就拖动哪个树级别而言,这个问题令人困惑。所以我编辑了这个问题:我只是在第一层级中重新排列/移动孩子/父母。感谢您的时间和努力!
EDIT2
另一个编辑以阐明 treewidget 层次结构的级别。
这就是我想要实现的目标:Dnd Parent Qframe 及其子级达到树的第一级。
【问题讨论】:
标签: python pyqt5 qtreewidget