Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: qtuser от Март 25, 2009, 22:31



Название: QTreeWidget и itemAt
Отправлено: qtuser от Март 25, 2009, 22:31
Ребят, помогите разобраться с QTreeWidget. Функцией "createItems" создаю три элемента treeWidget-a:

Код:
void MainWindow::createItems()
{
    treeWidget = new QTreeWidget;

    QTreeWidgetItem *firstItem = new QTreeWidgetItem(treeWidget);
    firstItem->setText(0, "first");

    QTreeWidgetItem *secondItem = new QTreeWidgetItem(treeWidget);
    secondItem->setText(0, "second");

    QTreeWidgetItem *thirdItem = new QTreeWidgetItem(treeWidget);
    thirdItem->setText(0, "third");
}

Далее пытаюсь с ними работать функцией "changeText":

Код:
void MainWindow::changeText()
{
    treeWidget->itemAt(0,0)->setText(0, "first change");
    treeWidget->itemAt(0,1)->setText(0, "second change")
    treeWidget->itemAt(0,2)->setText(0, "third change");
}

И возникает такая проблема: itemAt(x,y) всегда возвращает первый элемент дерева независимо от значений X и Y,
т.е. сначала первому элементу присвоится значение "first change", потом "second change" и наконец "third change", все изменения будут происходить только с первым элементом. Как работать с остальными элементами? Пока придумал
костыль вида, который работает:
   
Код:
treeWidget->itemBelow(treeWidget->itemAt(0,0))->setText("second change");

Этот код поменяет текст во втором элементе, аналогично для третьего элемента. Но хотелось бы разобраться с itemAt.
Qt 4.5.0, Linux/Windows - поведение одинаковое


Название: Re: QTreeWidget и itemAt
Отправлено: pastor от Март 25, 2009, 23:08
itemAt на вход принимает координаты (в пикселах), т.е. itemAt(0,0) вернет тебе элемент который расположен в точке (0;0).

Для доступа к элементам дерева используй topLevelItem для элементов верхнего уровня. Для навигации - itemBelow, itemAbove, QTreeWidgetItem::child и т.д.


Название: Re: QTreeWidget и itemAt
Отправлено: xintrea от Март 26, 2009, 00:02
Мда, лишний раз убеждаюсь, что дока Qt далека от совершенства

Returns a pointer to the item at the coordinates (x, y).

Кто им мешал дописать что координаты эти не координаты ячеек, а координаты в пикселях? Я тоже думал что itemAt(x,y) - это в размерности сетки ячеек. Тоже видел что не работает и списал на баг. Не прошло и пол года, как узнал что сия функция значит на самом деле.


Название: Re: QTreeWidget и itemAt
Отправлено: spirit от Март 26, 2009, 09:23
дык из семантики и так понятно x, y коорданаты, если бы было row, collumn, то это "координаты" ячейки.
тут же вроде кто-то задвигал про самодокументированность кода и т.д.  ;)


Название: Re: QTreeWidget и itemAt
Отправлено: Rcus от Март 26, 2009, 09:39
Может у нас разные доки?
Цитировать
QTreeWidgetItem * QTreeWidget::itemAt ( const QPoint & p ) const

Returns a pointer to the item at the coordinates p.

See also visualItemRect().
QTreeWidgetItem * QTreeWidget::itemAt ( int x, int y ) const

This is an overloaded member function, provided for convenience.

Returns a pointer to the item at the coordinates (x, y).
Думаю тут сложно перепутать пикселы и логические координаты :)


Название: Re: QTreeWidget и itemAt
Отправлено: spirit от Март 26, 2009, 09:40
Может у нас разные доки?
Цитировать
QTreeWidgetItem * QTreeWidget::itemAt ( const QPoint & p ) const

Returns a pointer to the item at the coordinates p.

See also visualItemRect().
QTreeWidgetItem * QTreeWidget::itemAt ( int x, int y ) const

This is an overloaded member function, provided for convenience.

Returns a pointer to the item at the coordinates (x, y).
Думаю тут сложно перепутать пикселы и логические координаты :)
+1


Название: Re: QTreeWidget и itemAt
Отправлено: xintrea от Март 26, 2009, 16:20
Может у нас разные доки?
Цитировать
QTreeWidgetItem * QTreeWidget::itemAt ( const QPoint & p ) const

Returns a pointer to the item at the coordinates p.

See also visualItemRect().
QTreeWidgetItem * QTreeWidget::itemAt ( int x, int y ) const

This is an overloaded member function, provided for convenience.

Returns a pointer to the item at the coordinates (x, y).
Думаю тут сложно перепутать пикселы и логические координаты :)

Если ниразу не работать с графикой напрямую, и не знать точно что есть QPoint, то лехко. (Почему бы QPoint не быть объекту для хранения произвольного указателя с какой-то еще метаинформацией).

Тут проблема в том, что в документации, как и в любой точной науке, нельзя забывать указывать размерность. Никто о размерности не должен догадываться из контекста.


Название: Re: QTreeWidget и itemAt
Отправлено: qtuser от Март 26, 2009, 20:07
Всем спасибо, что помогли разобраться. Теперь все встало на свои места.