【发布时间】:2018-10-29 09:30:29
【问题描述】:
我将 QTreeWidget 子类化(称为 ToolsSelectorWidget)并通过覆盖 QTreeWidget::dropEvent() 在其中启用重新排序
void ToolsSelectorWidget::dropEvent(QDropEvent *event) {
QModelIndex droppedIndex = indexAt(event->pos());
if( !droppedIndex.isValid() || droppedIndex.parent().isValid()) {
return;
}
QTreeWidget::dropEvent(event);
}
另外,我正在将 QWidgets(QPushButton、QLineEdit)添加到 QTreeWidget 的顶级项目:
ToolsSelectorWidget::ToolsSelectorWidget(QWidget *parent) : QTreeWidget(parent) {
header()->hide();
setSelectionMode(QAbstractItemView::SingleSelection);
setDragEnabled(true);
viewport()->setAcceptDrops(true);
setDropIndicatorShown(true);
setDragDropMode(QAbstractItemView::InternalMove);
for(int i=0; i<4; ++i) {
QTreeWidgetItem *part = new QTreeWidgetItem(this);
part->setFlags(part->flags() & Qt::ItemFlag((~Qt::ItemIsDropEnabled)));
setItemWidget(part, 0, new QLabel("Part" + QString::number(i) + " Preview", this));
setItemWidget(part, 1, new QLineEdit("Part" + QString::number(i) + " Name", this));
setItemWidget(part, 2, new QCheckBox("Part" + QString::number(i) + " Visible", this));
setItemWidget(part, 3, new QCheckBox("Part" + QString::number(i) + " Locked", this));
}
}
所以现在我有 4 个顶级项目,每个项目都包含 4 个 QWidget。它很好地填充它们,但是当我通过拖放重新排列它们时,QWidgets 消失了,我最终得到了一个空行。我应该怎么做才能保护它们?
之前:
Part2被移动到Part4之下后,它的children被保留了,但是它的conents,也就是QWidgets,没有了:
【问题讨论】:
-
你为什么用
part->setFlags(part->flags() & Qt::ItemFlag((~Qt::ItemIsDropEnabled))); -
@eyllanesc,因为我不希望将顶级项目放入另一个顶级项目。我也不希望子元素能够移动,我只希望用户能够更改顶级节点的顺序。
-
我只是有时间,我将努力解决这个问题。总之,您希望父母只能在同一水平上移动,并且孩子可以与其他父母的其他孩子交流。您还希望有一个 QPushButton 按下时会更改您的背景图像。我是对的?
-
@eyllanesc,确切地说。我还将继承 QPushButton,因此它可以连接到我的应用程序模型并根据模型更改其外观。但是,您不必担心那部分。我知道 QTreeView 有自己的模型,所以你可以把一切都建立在它的基础上。谢谢:)
-
好的,我建议延长赏金,这样你会吸引其他答案:)
标签: c++ qt qt-creator qwidget qtwidgets