Перетащите с двумя QTreeWidget, отфильтруйте QTreeWidgetItem в соответствии с их предыдущими установленными данными - PullRequest
0 голосов
/ 08 января 2019

В моем проекте у меня есть два qTreeWidget (скажем, A и B), я хочу перетащить элементы из treeWidget A в treeWidget B.

У меня несколько проблем:

Не все предметы, хранящиеся в A, должны быть драггэйлами. В других частях моего кода я разделяю их, определяя «тип» в конструкторе:

 QTreeWidgetItem *newDatatype = new  QTreeWidgetItem(TreeWidgetItemTypes::Datatype);

Я могу проверить их, используя:

if(itemDroppedFromHeaven.type() == TreeWidgetItemTypes::Datatype) ...

Поэтому у меня есть перечисление, чтобы разделить все виды предметов.

  • Копирует ли перетаскивание заданные данные?
  • Как определить тип предмета при перетаскивании?
  • Как установить перетаскивание для каких-либо элементов, включенных / отключенных?

Я пытался перегрузить dropEvent дереваWidget B, чтобы отфильтровать отброшенные предметы:

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);

Я благодарен за каждую идею! Лучший

1 Ответ

0 голосов
/ 08 января 2019

Вам не нужно ничего перезаписывать, нужно просто деактивировать флаг 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();
}
...