2013-09-06 3 views
2

Я использую QTreeView с QStandardItemModel, и я пытаюсь понять, как перемещать элементы вверх и вниз по дереву с помощью кнопок. Я могу перетащить и не бросать никаких проблем, но я хотел бы сделать несколько кнопок, связанных с функциями «двигаться вверх» и «вниз». Я просто не могу найти что-либо по этому поводу. Кажется, есть функция moveRow() для объекта модели, но я не могу найти какую-либо документацию, поэтому я не уверен, что это то, что мне нужно. Любая информация, которую вы могли бы дать, чтобы указать мне в правильном направлении, была бы очень признательна!QTreeView Move Item с кнопкой

PS Вот моя статистика QT Creator: Qt Creator 2.6.2 на основе Qt 5.0.1 (64 бит)

+0

Вы действительно получили это, чтобы это работало? moveRow() - виртуальная функция, правильно, поэтому вы должны ее реализовать самостоятельно. – neuronet

ответ

3

Ваша догадка правильна. moveRow() - это правильная функция для вызова.

Чтобы переместить элементы внутри одного родителя (это дерево, в конце концов), вы должны сделать moveRow(parent, index.row(), parent, index.row() + delta), где delta установлено в 1 или -1, в зависимости от того, перемещаетесь ли вы вверх или вверх соответственно.

Если вы хотите разрешить перемещение элементов между родителями, вам понадобится дополнительная логика, чтобы выяснить родителя-получателя, если элемент будет перемещен мимо его родителя.

Обратите внимание, что это считается плохим дизайном, если кнопка перемещения отделена от элементов, подлежащих перемещению. Ваш делегат должен отображать стрелки вверх и вниз для каждого элемента в своей строке, чтобы вы могли перемещать вещи одним щелчком мыши. Когда есть смежный выбор, делегаты должны объединить стрелки вверх/вниз, чтобы покрыть все предметы. Когда выбор не является непрерывным, стрелки вверх/вниз должны исчезнуть.

С помощью отдельных кнопок вам нужно два щелчка: сначала выберите элемент, затем нажмите вверх/вниз. Это sucks с точки зрения пользователя.

+0

Я считаю, что нет встроенной рабочей функции 'moveRow', но это одна из тех частей QAbstractItemModel, которую вы должны создать самостоятельно. (И те, что в Qt4, в отличие от OP, нет виртуальной функции moveRow, поэтому вам вдвойне не повезло :)). – neuronet

+0

@neuronet Конечно, это часть, которую должна реализовать модель, но это данность. Мы говорим о представлении здесь. –

+0

Я не уверен, что вы имеете в виду. 'moveRow' - это метод' QAbstractItemModel', а не 'QTreeView'. Учитывая, что пользователь должен реализовать его, я не вижу, как ваш ответ действительно является ответом, хотя он имеет интересное мнение об оптимальном дизайне. Я отправлю некоторый рабочий код позже, если я получу время. Поскольку OP задал вопрос о 'QStandardItemModel', есть довольно простые способы его реализации. – neuronet

Смежные вопросы