Qt QTreeWidget альтернатива IndexFromItem?

0

Я получил класс QTreeWidget и создал свой собственный QtPropertyTree. Чтобы заполнить дерево виджетами (флажки, кнопки и т.д.), Я использую следующий код:

// in QtPropertyTree.cpp
QTreeWidgetItem topItem1 = new QTreeWidgetItem(this);    
QTreeWidgetItem subItem = new QTreeWidgetItem(this);

int column1 = 0
int Column2 = 1;

QPushButton myButton = new QPushButton();
this->setIndexWidget(this->indexFromItem(this->subItem,column1), myButton);   

QCheckBox myBox = new QCheckBox();
this->setIndexWidget(this->indexFromItem(this->subItem,column2), myBox);

Это прекрасно работает, но проблема в том, что я хочу избежать использования функции indexFromItem, поскольку она защищена, и есть другие классы, которые заполняют дерево и нуждаются в доступе к этой функции. Вы знаете какую-либо альтернативу использованию этой функции?

Теги:
qt
qtreewidget

2 ответа

4
Лучший ответ

Вы можете попробовать использовать модель QTreeWidget (QAbstractItemModel), чтобы получить нужный индекс по номерам столбцов и строк:

// Row value is 1 because I want to take the index of
// the second top level item in the tree.
const int row = 1;

[..]

QPushButton myButton = new QPushButton();
QModelIndex idx1 = this->model()->index(row, column1);
this->setIndexWidget(idx1, myButton);   

QCheckBox myBox = new QCheckBox();
QModelIndex idx2 = this->model()->index(row, column2);
this->setIndexWidget(this->indexFromItem(idx2, myBox);

ОБНОВИТЬ

Для подпунктов можно использовать один и тот же подход.

QModelIndex parentIdx = this->model()->index(row, column1);
// Get the index of the first child item of the second top level item.
QModelIndex childIdx = this->model()->index(0, column1, parentIdx);
  • 0
    Благодарю. Кажется, так и работает.
  • 0
    К сожалению, это не сработало. model () -> index (r, c) возвращает только индексы от элементов верхнего уровня, но мне нужны индексы подэлементов в модели.
Показать ещё 5 комментариев
1

Очевидное решение состоит в том, чтобы обезопасить indexFromItem следующим образом:

class QtPropertyTree {
  ...
public:
  QModelIndex publicIndexFromItem(QTreeWidgetItem * item, int column = 0) const
    return indexFromItem (item, column) ;
  }
} ;
  • 0
    Это нормально. Но тогда я должен был бы сохранить ссылку на QtPorpertyTree в моем другом подклассе и получить доступ к publicIndexFromItem. В то же время QtPropertyTree получает доступ к методам подкласса. Существует проблема перекрестных ссылок, которую можно решить. Но разве это не плохая практика проектирования?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню