Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: evgeniy от Февраль 17, 2014, 01:26



Название: QItemSelectionModel::setCurrentIndex не работает при открытии окна
Отправлено: evgeniy от Февраль 17, 2014, 01:26
Код:
void TreeModel::selectIndex(QModelIndex ix) {
  if (!ix.isValid()) return;
  qDebug() << "name1" << ix.data();
  tree->selectionModel()->clear();
  tree->setExpanded(ix.parent(), true);
  tree->selectionModel()->setCurrentIndex(ix, QItemSelectionModel::SelectCurrent);
  tree->scrollTo(ix);
}

Эта функция работает нормально при удалении/вставке узлов, но когда я пытаюсь (в функции QMainWindow::showEvent) сделать текущим сохранённый узел из предыдущей сессии результат такой:
Код:
name1 QVariant(QString, "Highlight elements") 
The program has unexpectedly finished.
C:\Home\develop\qt\arm\designer\Designer exited with code -1073741819
без
Код:
tree->selectionModel()->setCurrentIndex(ix, QItemSelectionModel::SelectCurrent); 
работает нормально. но мне надо выделить узел.

Спасибо огромное заранее!


Название: Re: QItemSelectionModel::setCurrentIndex не работает при открытии окна
Отправлено: Old от Февраль 17, 2014, 04:19
А вы смотрели, что возвращает:
tree->selectionModel()
в showEvent?
Возможно, она еще не создана?


Название: Re: QItemSelectionModel::setCurrentIndex не работает при открытии окна
Отправлено: kambala от Февраль 17, 2014, 14:48
еще можно попробовать вызывать метод по нулевому таймеру вместо showEvent


Название: Re: QItemSelectionModel::setCurrentIndex не работает при открытии окна
Отправлено: evgeniy от Февраль 18, 2014, 18:07
А вы смотрели, что возвращает:
tree->selectionModel()
в showEvent?
Возможно, она еще не создана?
tree->selectionModel()->clear() срабатывает. selectionModel я создаю отдельно до создания mainWindow.

еще можно попробовать вызывать метод по нулевому таймеру вместо showEvent
Да, похоже это единственный оставшийся выход. Как это сделать?

P. S. Вабще канкретный глюк - я в шоке!!!


Название: Re: QItemSelectionModel::setCurrentIndex не работает при открытии окна
Отправлено: kambala от Февраль 18, 2014, 19:59
QTimer::singleShot(0, this, yourSlot())


Название: Re: QItemSelectionModel::setCurrentIndex не работает при открытии окна
Отправлено: evgeniy от Февраль 20, 2014, 13:24
QTimer::singleShot(0, this, yourSlot())
Спасибо огромное, kambala!
Только этот код сработал:
Код:
void MainWindow::showEvent(QShowEvent *event) {
  QMainWindow::showEvent(event);
  QTimer::singleShot(0, this, SLOT(selectLastNode()));
}
Теперь понятно почему сатана Киеву покоя не даёт - там есть хорошие люди...
Кстати, на qtcentre.org и stackoverflow.com ничем не помогли.


Название: Re: QItemSelectionModel::setCurrentIndex не работает при открытии окна
Отправлено: GreatSnake от Февраль 20, 2014, 14:38
selectionModel я создаю отдельно до создания mainWindow.
А чем не устроила встроенная?


Название: Re: QItemSelectionModel::setCurrentIndex не работает при открытии окна
Отправлено: kambala от Февраль 20, 2014, 15:17
по идее таймер можно запускать и из конструктора, не обязательно из showEvent


Название: Re: QItemSelectionModel::setCurrentIndex не работает при открытии окна
Отправлено: evgeniy от Февраль 20, 2014, 20:28
А чем не устроила встроенная?
1. Я пробовал и со встроенной.
2. У меня планируется один selectionModel на QTreeView и QTableView.
по идее таймер можно запускать и из конструктора, не обязательно из showEvent
Согласен, так и сделал.