我有树小部件(QTreeView),并在我的ObjectListWidget中重新实现了QAbstractItemModel。在树中,我有3种类型的对象。我为此重新实现了拖放功能,并且它起作用了。但是我想拒绝树中不同类型对象的拖动选项。我该怎么做呢?我试图在onSelectionChanged上设置dragEnabled(false),但它的工作方式很奇怪(它将我的选择模式更改为MultiSelection)并取消选择项目。
发布于 2021-11-29 10:20:38
这取决于你是如何实现拖放的。
QStandardItemModel
如果您依赖于QStandardItemModel,那么您应该知道这些标志:
Qt::ItemIsDragEnabled
Qt::ItemIsDropEnabled现在只在需要的地方设置标志,我的意思是不是对所有人都设置,比如:
#include <QStandardItemModel>
#include <QTreeView>
// ...
QStandardItem *createItem(const QString &name)
{
auto *item = new QStandardItem(name);
Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
item->setFlags(flags);
return item;
}
QStandardItem *createContainerItem(const QString &name)
{
auto *result = createItem(name);
auto flags = result->flags();
flags |= Qt::ItemIsDropEnabled;
result->setFlags(flags);
return result;
}
QStandardItem *createDraggableItem(const QString &name)
{
auto *result = createItem(name);
auto flags = result->flags();
flags |= Qt::ItemIsDragEnabled;
result->setFlags(flags);
return result;
}
void testUsage() {
QMainWindow(parent)
{
auto *window = new QWidget();
auto *list1 = createContainerItem("My Draggable Content");
list1->appendRow(createDraggableItem("Item 1"));
list1->appendRow(createDraggableItem("Item 2"));
list1->appendRow(createDraggableItem("Item 3"));
auto *list2 = createContainerItem("My Other List");
list2->appendRow(createItem("Item 4"));
list2->appendRow(createItem("Item 5"));
auto *model = new QStandardItemModel(window);
model->appendRow(list1);
model->appendRow(list2);
auto *rootItem = model->invisibleRootItem();
rootItem->setFlags(rootItem->flags() ^ Qt::ItemIsDropEnabled);
auto *view = new QTreeView(window);
view->setModel(model);
view->setRootIsDecorated(true);
view->setDragEnabled(true);
view->setAcceptDrops(true);
view->setDefaultDropAction(Qt::MoveAction);
view->expandAll();
window->setCentralWidget(view);
window->resize(300, 400);
window->show();
}https://stackoverflow.com/questions/70152464
复制相似问题