拖放两个QTreeWidget,根据他们之前设置的数据过滤QTreeWidget Items
Drag and drop with two QTreeWidget, filter QTreeWidgetItem's acording to their previous set data
我的项目有两个 qTreeWidget(假设是 A 和 B),我想将项目从 treeWidget A 拖到 treeWidget B。
我有多个问题:
并非所有存储在 A 中的项目都应该是 draggale。在我代码的其他部分,我通过在构造函数中定义 "type" 来分隔它们:
QTreeWidgetItem *newDatatype = new QTreeWidgetItem(TreeWidgetItemTypes::Datatype);
我可以使用以下方式检查它们:
if(itemDroppedFromHeaven.type() == TreeWidgetItemTypes::Datatype) ...
因此我有一个枚举来分隔所有不同种类的项目。
- 拖放是否复制设置数据?
- 如何在拖动时检测项目的种类?
- 如何为某些项目设置拖动enabled/disabled?
我试过重载treeWidget B的dropEvent,来过滤掉落的物品:
class CustomTreeWidget : public QTreeWidget
{
Q_OBJECT
public:
using QTreeWidget::QTreeWidget;
void dropEvent(QDropEvent *event) override
{
QString format = event->mimeData()->formats().at(0);
QString data = event->mimeData()->text();
qDebug () << data;
QStandardItem *sitem = new QStandardItem;
QString itemName = sitem->text();
qDebug() << itemName;
if (itemName == "Messages" || itemName == "Datatypes" || itemName == "Enums")
{
event->setDropAction(Qt::IgnoreAction);
return;
}
else
{
QTreeWidget::dropEvent(event);
emit itemDropped();
}
}
signals:
void itemDropped();
};
但是有了这个想法,我只能得到可见的项目名称集:
newDatatype->setData(0, Qt::ItemDataRole::DisplayRole, datName);
即使设置为用户角色的数据也不会被复制:
newDatatype->setData(0, Qt::ItemDataRole::UserRole, datObjKey);
我感谢每一个想法!
最佳
您不必覆盖任何内容,只需使用以下命令停用标志 Qt::ItemIsDragEnabled
:
item->setFlags(item->flags() &= ~Qt::ItemIsDragEnabled);
示例:
#include <QtWidgets>
static void populate_treewidget(QTreeWidget *tree_widget){
for(int i=0; i<5; ++i){
QTreeWidgetItem *item = new QTreeWidgetItem(tree_widget);
if(i%2 == 0){
item->setText(0, "Not Dragable");
item->setFlags(item->flags() &= ~Qt::ItemIsDragEnabled);
}
else
item->setText(0, "Normal");
for(int j=0; j<4; ++j){
QTreeWidgetItem *child_item = new QTreeWidgetItem(item);
if(j%2 == 1){
child_item->setText(0, "Not Dragable");
child_item->setFlags(child_item->flags() &= ~Qt::ItemIsDragEnabled);
}
else
child_item->setText(0, "Normal");
}
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w;
QTreeWidget A;
A.setDragEnabled(true);
populate_treewidget(&A);
QTreeWidget B;
B.setAcceptDrops(true);
QHBoxLayout *hlay = new QHBoxLayout(&w);
hlay->addWidget(&A);
hlay->addWidget(&B);
A.expandAll();
w.resize(640, 480);
w.show();
return a.exec();
}
我的项目有两个 qTreeWidget(假设是 A 和 B),我想将项目从 treeWidget A 拖到 treeWidget B。
我有多个问题:
并非所有存储在 A 中的项目都应该是 draggale。在我代码的其他部分,我通过在构造函数中定义 "type" 来分隔它们:
QTreeWidgetItem *newDatatype = new QTreeWidgetItem(TreeWidgetItemTypes::Datatype);
我可以使用以下方式检查它们:
if(itemDroppedFromHeaven.type() == TreeWidgetItemTypes::Datatype) ...
因此我有一个枚举来分隔所有不同种类的项目。
- 拖放是否复制设置数据?
- 如何在拖动时检测项目的种类?
- 如何为某些项目设置拖动enabled/disabled?
我试过重载treeWidget B的dropEvent,来过滤掉落的物品:
class CustomTreeWidget : public QTreeWidget
{
Q_OBJECT
public:
using QTreeWidget::QTreeWidget;
void dropEvent(QDropEvent *event) override
{
QString format = event->mimeData()->formats().at(0);
QString data = event->mimeData()->text();
qDebug () << data;
QStandardItem *sitem = new QStandardItem;
QString itemName = sitem->text();
qDebug() << itemName;
if (itemName == "Messages" || itemName == "Datatypes" || itemName == "Enums")
{
event->setDropAction(Qt::IgnoreAction);
return;
}
else
{
QTreeWidget::dropEvent(event);
emit itemDropped();
}
}
signals:
void itemDropped();
};
但是有了这个想法,我只能得到可见的项目名称集:
newDatatype->setData(0, Qt::ItemDataRole::DisplayRole, datName);
即使设置为用户角色的数据也不会被复制:
newDatatype->setData(0, Qt::ItemDataRole::UserRole, datObjKey);
我感谢每一个想法! 最佳
您不必覆盖任何内容,只需使用以下命令停用标志 Qt::ItemIsDragEnabled
:
item->setFlags(item->flags() &= ~Qt::ItemIsDragEnabled);
示例:
#include <QtWidgets>
static void populate_treewidget(QTreeWidget *tree_widget){
for(int i=0; i<5; ++i){
QTreeWidgetItem *item = new QTreeWidgetItem(tree_widget);
if(i%2 == 0){
item->setText(0, "Not Dragable");
item->setFlags(item->flags() &= ~Qt::ItemIsDragEnabled);
}
else
item->setText(0, "Normal");
for(int j=0; j<4; ++j){
QTreeWidgetItem *child_item = new QTreeWidgetItem(item);
if(j%2 == 1){
child_item->setText(0, "Not Dragable");
child_item->setFlags(child_item->flags() &= ~Qt::ItemIsDragEnabled);
}
else
child_item->setText(0, "Normal");
}
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w;
QTreeWidget A;
A.setDragEnabled(true);
populate_treewidget(&A);
QTreeWidget B;
B.setAcceptDrops(true);
QHBoxLayout *hlay = new QHBoxLayout(&w);
hlay->addWidget(&A);
hlay->addWidget(&B);
A.expandAll();
w.resize(640, 480);
w.show();
return a.exec();
}