А если так (способ корявый, но работает):
2 таблицы.
Таблица типов адресов. name_ab - сокращение.
SQL
CREATE TABLE address_type
(id number(10,0) NOT NULL,
name varchar2(250) NOT NULL,
name_ab varchar2(250))
/
Для примера заполняем.
INSERT INTO ADDRESS_TYPE VALUES (null,'Город','г.');
INSERT INTO ADDRESS_TYPE VALUES (null,'Район','р-он.');
INSERT INTO ADDRESS_TYPE VALUES (null,'Проспект','пр.');
INSERT INTO ADDRESS_TYPE VALUES (null,'Микрорайон','мкр.');
INSERT INTO ADDRESS_TYPE VALUES (null,'Квартал','кв-л.');
INSERT INTO ADDRESS_TYPE VALUES (null,'Улица','ул.');
INSERT INTO ADDRESS_TYPE VALUES (null,'Дом','д.');
INSERT INTO ADDRESS_TYPE VALUES (null,'Участок','уч.');
INSERT INTO ADDRESS_TYPE VALUES (null,'Переулок','пер.');
INSERT INTO ADDRESS_TYPE VALUES (null,'Учетный квартал','уч. кв-л.');
Таблица адресов:
SQL
CREATE TABLE address
(id number(10,0) NOT NULL,
address_type number(10,0) NOT NULL,
parent number(10,0) NOT NULL,
name varchar2(250) NOT NULL)
/
parent - ID родителя. Если 0 (NULL, если not null убрать), то нет родителя (самый верхний элемент).
Вначале заполняешь города, затем улицы, дома, квартиры.
Потом делаешь всё в QTreeWidget.
Делаешь что-то типа
void BuildTree(QTreeWidgetItem *twiItem, int iParent)
twiItem - родитель в QTreeWidget. iParent - ID родителя в базе.
При старте делаешь:
BuildTree(treeWidget->invisibleRootItem(), 0);
Прогружается список верхних итемов. Когда прогружаешь, проверяешь есть ли у него дети. Если есть то добавляешь какой нибудь пустой элемент чтобы он |+| добавил.
Затем на событие void on_treeWidget_itemExpanded(QTreeWidgetItem* twiItem) вызываешь BuildTree.
Соотвественно итемы подгружаются по нажатию на |+|. Не забываешь удалять пустой итем.
Чтобы получить полный адрес в цикле пробегаешься по таблицу ADDRESS. Читаешь сокращения из ADDRESS_TYPE.
И в итоге получается: "г. Караганда ул. Киевская 121 кв. 39"
По тупому, но работает...