Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: hadey от Март 05, 2012, 15:41



Название: indexAt в QtreeWidget
Отправлено: hadey от Март 05, 2012, 15:41
Добрый день.
Может кто сталкивался: indexAt в QtreeWidget возвращает QModelIndex(-1,-1,0x0,QObject(0x0) ). С чем это может быть связано?


Название: Re: indexAt в QtreeWidget
Отправлено: Bepec от Март 05, 2012, 15:44
Эм... Нет запрашиваемого элемента? утечка памяти? затирка указателями?


Название: Re: indexAt в QtreeWidget
Отправлено: GreatSnake от Март 05, 2012, 15:44
С чем это может быть связано?
С тем, что QTreeView ничего не нашел по заданной координате.
Показывай код.


Название: Re: indexAt в QtreeWidget
Отправлено: hadey от Март 05, 2012, 15:46
ui->treeWidget->setSelectionMode(QAbstractItemView::SingleSelection);
    ui->treeWidget->setDragEnabled(true);
    ui->treeWidget->viewport()->setAcceptDrops(true);
    ui->treeWidget->setDropIndicatorShown(true);
    ui->treeWidget->viewport()->installEventFilter(this);

    QTreeWidgetItem *lParentItem;
    while (lQuery.next())
    {
        lParentItem = new QTreeWidgetItem(ui->treeWidget);
        ui->treeWidget->addTopLevelItem(lParentItem);
        //наименование
        lParentItem->setText(0, lQuery.value(0).toString());
        //идентификатор
        lParentItem->setText(1, lQuery.value(1).toString());
        lParentItem->setText(4, "0");
    }


Название: Re: indexAt в QtreeWidget
Отправлено: GreatSnake от Март 05, 2012, 15:50
2 hadey:
в упор не вижу вызова indexAt().


Название: Re: indexAt в QtreeWidget
Отправлено: hadey от Март 05, 2012, 15:50
bool MainWindow::eventFilter(QObject *aObject, QEvent *aEvent)
{
    if (aObject == ui->treeWidget->viewport() && (aEvent->type() == QEvent::DragMove))
    {
       qDebug() << ui->treeWidget->indexAt(QCursor::pos());
    }
    return false;
}


Название: Re: indexAt в QtreeWidget
Отправлено: GreatSnake от Март 05, 2012, 15:54
bool MainWindow::eventFilter(QObject *aObject, QEvent *aEvent)
{
    if (aObject == ui->treeWidget->viewport() && (aEvent->type() == QEvent::DragMove))
    {
       qDebug() << ui->treeWidget->indexAt(QCursor::pos());
    }
    return false;
}
Ну дык правильно, посылаешь в виджет левые координаты и удивляешься.
Используй правильные координаты:
Код
C++ (Qt)
static_cast< QDragMoveEvent* >( aEvent )->pos()


Название: Re: indexAt в QtreeWidget
Отправлено: hadey от Март 05, 2012, 15:58
ok, спасибо огромное.


Название: Re: indexAt в QtreeWidget
Отправлено: GreatSnake от Март 05, 2012, 16:05
На всякий случай - у виджета координаты считаются относительно родительского виджета. QCursor::pos() возвращает позицию мыши на текущем экране, т.е. её нужно было преобразовать так:
Код
C++ (Qt)
treeWidget->viewport()->mapFromGlobal( QCursor::pos() )


Название: Re: indexAt в QtreeWidget
Отправлено: hadey от Март 05, 2012, 16:13
Да, после твоего ответа я все это вспомнил:) Взгляд со стороны, как говорится: несколько часов сидел тупил...