Russian Qt Forum
Ноябрь 23, 2024, 07:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Выделение элемента в QCombobox с QTreeView в качестве представления  (Прочитано 8504 раз)
AlekseyK
Гость
« : Январь 23, 2011, 22:11 »

Использую QStandardItemModel  в качестве модели (setModel), а QTreeView в качестве представления (setView) для QCombobox. Каждому элементу комбобокса QStandardItem* item назначаю идентификатор через
Код
C++ (Qt)
item->setData(id);
В общем задача перебрать все элементы, найти и сделать текущим элемент с определённым id_ext == item->data(id). Что-то запутался в 3-х соснах. Прочитал QComboBox и его view и другие темы, но пока не разобрался как реализовать.

Обратное преобразование, получить data() == id, текущего комбобокса делаю так:
Код
C++ (Qt)
QModelIndex index = combobox->view()->currentIndex();
QStandardItem *item = ((QStandardItemModel *)combobox->model())->itemFromIndex(index);
currentId = item->data().toInt();
« Последнее редактирование: Январь 24, 2011, 10:25 от AlekseyK » Записан
AlekseyK
Гость
« Ответ #1 : Январь 24, 2011, 02:16 »

Пока сделал так:
Код
C++ (Qt)
void MyProjectBox::selectItemByProjectId(int id)
{
QStandardItemModel *m_pModel = (QStandardItemModel *)model();
QTreeView *m_pView = (QTreeView *)view();
 
// Select item with specified id in combobox
if(id == -1)
{
QModelIndex index = m_pModel->index(0, 0);
m_pView->setCurrentIndex(index);
}
else
{
for(int i = 0; i < m_pModel->rowCount(); i++)
{
QModelIndex parentIndex = m_pModel->index(i, 0);
int childCount = m_pModel->rowCount(parentIndex);
for(int j = 0; j < childCount; j++)
{
QModelIndex childIndex = m_pModel->index(j, 0, parentIndex);
QStandardItem *item = m_pModel->itemFromIndex(childIndex);
if(item->data().toInt() == id)
{
setRootModelIndex(parentIndex);
setCurrentIndex(j);
setRootModelIndex(QModelIndex());
qDebug() << "id:" << id << "\t(" << i << "," << j << ")";
return;
}
}
}
}
}
Работает, элемент корректно находит, и выделяет его корректно в соответствии с советом вышеозначенных товарищей:
Код
C++ (Qt)
setRootModelIndex(parentIndex);
setCurrentIndex(j); // j - child tree row
setRootModelIndex(QModelIndex());
 
m_pView->setCurrentIndex(childIndex) не работает.

Подозреваю, что и обратное преобразование нужно выполнять аналогично - вылетает пока. Причём, что интересно вылетает на том комбобоксе, где текущее значение установлено программно, а там где пользователь выбрал пункт в комбобоксе - возвращает правильный индекс и id. В чём может быть проблемаНепонимающий
« Последнее редактирование: Январь 24, 2011, 03:14 от AlekseyK » Записан
AlekseyK
Гость
« Ответ #2 : Январь 24, 2011, 03:41 »

Ага, понятно: я зря m_pView->setCurrentIndex(childIndex) выкинул, для выделения элемента программно корректно работает только следующая связка:

combobox->setCurrentIndex()combobox->view()->setCurrentIndex():

Код
C++ (Qt)
setRootModelIndex(parentIndex);
setCurrentIndex(j); // j - child tree row
setRootModelIndex(QModelIndex());
m_pView->setCurrentIndex(childIndex); // Need to explicit select current index
// in a view to properly select comobobox item
// programmatically
 
теперь работает! В принципе решено, однако советы, предложения, замечания, улучшения приветствуются. Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.202 секунд. Запросов: 20.