Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: dangreen от Ноябрь 14, 2011, 03:45



Название: Перетаскивание QTreeWidgetItem [решено]
Отправлено: dangreen от Ноябрь 14, 2011, 03:45
Как узнать когда QTreeWidgetItem перетащен,
Сигнал на начало перетаскивания (itemEntered(QTreeWidgetItem*)) есть, а на завершение не нашел.
Помогите найти решение, нужно чтоб по окончанию еще можно было найти индекс, родитель и текст айтема


Название: Re: Перетаскивание QTreeWidgetItem
Отправлено: dangreen от Ноябрь 14, 2011, 13:53
Поможет кто?  ???


Название: Re: Перетаскивание QTreeWidgetItem
Отправлено: kambala от Ноябрь 14, 2011, 15:54
унаследуйся от QTreeWidget и переопредели в нём void QTreeWidget::dropEvent ( QDropEvent * event ) [virtual protected]
Код
C++ (Qt)
void MyTreeWidget::dropEvent(QDropEvent *event)
{
QTreeWidget::dropEvent(event);
QTreeWidgetItem *item = itemAt(event->pos());
// тут уже получай какие тебе надо данные
}


Название: Re: Перетаскивание QTreeWidgetItem
Отправлено: dangreen от Ноябрь 14, 2011, 16:37
унаследуйся от QTreeWidget и переопредели в нём void QTreeWidget::dropEvent ( QDropEvent * event ) [virtual protected]
Код
C++ (Qt)
void MyTreeWidget::dropEvent(QDropEvent *event)
{
QTreeWidget::dropEvent(event);
QTreeWidgetItem *item = itemAt(event->pos());
// тут уже получай какие тебе надо данные
}

спасибки, буду пробовать


Название: Re: Перетаскивание QTreeWidgetItem
Отправлено: dangreen от Ноябрь 15, 2011, 17:27
Код:
void SecTreeWidget::dropEvent(QDropEvent *e)
{
    QTreeWidget::dropEvent(e);
    QTreeWidgetItem *item = itemAt(e->pos());
    emit(itemDroped(item));
}
сделал, работает, но не так как нужно
во-первых: при перетаскивание елемента в елемент, e -  это родитель, а не элемент который перетащил
во-вторых: при перетаскивание элемента в корень, программа крашится

какой костылек сделать?


Название: Re: Перетаскивание QTreeWidgetItem
Отправлено: dangreen от Ноябрь 16, 2011, 13:10
Код:
SecTreeWidget::SecTreeWidget(QWidget *parent) :
    QTreeWidget(parent)
{
    connect(this,SIGNAL(itemEntered(QTreeWidgetItem*,int)),SLOT(itemName(QTreeWidgetItem*)));
    this->setHeaderHidden(true);
    this->setDragDropMode(QAbstractItemView::InternalMove);
}

void SecTreeWidget::itemName(QTreeWidgetItem *e)
{
    itemText = e->text(0);
}

void SecTreeWidget::dropEvent(QDropEvent *e)
{
    QTreeWidget::dropEvent(e);
    selectNamedItem(itemText);
}

void SecTreeWidget::selectNamedItem(QString secName)
{
    for(int i=0;i<this->topLevelItemCount();i++){
        if(this->topLevelItem(i)->text(0) == secName)emit(itemDroped(this->topLevelItem(i)));
        else recSelectNamedItem(this->topLevelItem(i),secName);
    }
}

void SecTreeWidget::recSelectNamedItem(QTreeWidgetItem *e, QString secName)
{
    for(int i=0;i<e->childCount();i++){
        if(e->child(i)->text(0) == secName)emit(itemDroped(e->child(i)));
        else recSelectNamedItem(e->child(i),secName);
    }
}