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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Падает приложение при clearSelection();  (Прочитано 6089 раз)
NortT
Гость
« : Май 10, 2011, 15:17 »

Собственно сабж. Падает с ошибкой ASSERT failure in QList<T>::operator[]: "index out of range", file /usr/include/qt4/QtCore/qlist.h, line 463
Код - всего одна строчка:
Код
C++ (Qt)
void MainWindow::addQuestion()
{
   selectionModel->clearSelection();
}
Создается selectionModel так:
Код
C++ (Qt)
   QItemSelectionModel *selectionModel;
   CTestModel *testModel;
   testModel = new CTestModel(fileName);
   ui->questListView->setModel(testModel);
   selectionModel = ui->questListView->selectionModel();
В какую сторону копать?
Записан
alexman
Гость
« Ответ #1 : Май 10, 2011, 15:38 »

QItemSelectionModel *selectionModel; - это поле класса, или в конструкторе объявлено, или там и там...?
Записан
NortT
Гость
« Ответ #2 : Май 10, 2011, 15:48 »

Вот это все
Код:
    QItemSelectionModel *selectionModel;
    CTestModel *testModel;
поля класса MainWindow. А это
Код:
    testModel = new CTestModel(fileName);
    ui->questListView->setModel(testModel);
    selectionModel = ui->questListView->selectionModel();
в слоте, обрабатывающим нажатие кнопки.
Записан
Kolobok
Гость
« Ответ #3 : Май 10, 2011, 16:28 »

убери из конструктора
Код:
QItemSelectionModel *selectionModel;
CTestModel *testModel;
Записан
NortT
Гость
« Ответ #4 : Май 10, 2011, 16:33 »

Так ведь это не в конструкторе, это атрибуты класса.
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #5 : Май 10, 2011, 16:43 »

Выложи объявление и реализацию класса MainWindow
Записан
NortT
Гость
« Ответ #6 : Май 10, 2011, 16:57 »

http://pastebin.ca/2056246 - mainwindow.cpp
http://pastebin.ca/2056248 - mainwindow.h
С model/view я первый раз сталкиваюсь, возможно я эту идею вообще не так понял и тут вообще все не правильно
Записан
shirushizo
Гость
« Ответ #7 : Май 10, 2011, 21:33 »

При очистки выделения высылается SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&))
и соответственно вызывается слот showSelectedItem( const QItemSelection & selected, const QItemSelection & deselected )

Ошибка скорее всего здесь:
Код:
void MainWindow::showSelectedItem( const QItemSelection & selected, const QItemSelection & deselected )
{
    QModelIndexList list = selected.indexes(); //list=QModelIndexList(), т.к. выделение пустое
    QModelIndex item;
    item = list[0]; //выход за пределы списка
    int row = item.row();
    ...
}
Если использовать list.at(0) - возникнет исключение, а так может на следующей строке.
Чтобы убедиться сделайте qDebug()<<selected.indexes();
Записан
NortT
Гость
« Ответ #8 : Май 11, 2011, 02:48 »

При очистки выделения высылается SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&))
и соответственно вызывается слот showSelectedItem( const QItemSelection & selected, const QItemSelection & deselected )
Да, точно, так и оказалось, добавил в showSelectedItem
Код:
if (list.count()<1) return;
Cпасибо всем за участие Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Май 11, 2011, 07:15 »

лучше
Код
C++ (Qt)
if (list.isEmpty ()) {
 return;
}
 
« Последнее редактирование: Май 11, 2011, 07:21 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
NortT
Гость
« Ответ #10 : Май 11, 2011, 08:11 »

Ок, переделал.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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