Название: SIGSEGV при получении текста QListWidgetItem
Отправлено: ComputerMouse от Октябрь 12, 2013, 19:05
#include "mainwindow.h" #include <QStyle> #include <QMessageBox> #include <QList> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { view = new QListWidget (this); this->setCentralWidget(view); VFile f; f.id=0; f.isFolder=true; f.name="/"; f.parent=0; f.text=""; files.insert(0, f); f.id=1; f.isFolder=true; f.name="folder"; f.parent=0; f.text=""; files.insert(1, f); f.id=2; f.isFolder=false; f.parent=0; f.name="file"; f.text="Hello, world!"; files.insert(2, f); f.id=3; f.isFolder=false; f.parent=1; f.name="file"; f.text="Hi!"; files.insert(3, f); now = files[0]; connect (view, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(cd())); toList(); } void MainWindow::toList() { view->clear(); int counter = 1; QListWidgetItem *item = new QListWidgetItem; item->setText(".."); item->setIcon(style()->standardIcon(QStyle::SP_DirIcon)); view->insertItem(0, item); for (int i = 0; i < files.count(); i++) { if (files[i].parent == now.id && files[i].id != now.id) { item = new QListWidgetItem; if (files[i].isFolder) item->setIcon(style()->standardIcon(QStyle::SP_DirIcon)); else item->setIcon(style()->standardIcon(QStyle::SP_FileIcon)); item->setText(files[i].name); view->insertItem(counter, item); counter++; } } } void MainWindow::cd() { QString selected = view->currentItem()->text(); if (selected=="..") { now = files [now.parent]; return; } for (int i = 0; i < files.count(); i++) { if (files[i].parent == now.id && files[i].text == selected) now = files[i]; } toList(); } Отладчик показывает что падает на строке QString selected = view->currentItem()->text(); В стеке вызовов последняя функция text(). SIGSEGV. Почему?
Название: Re: SIGSEGV при получении текста QListWidgetItem
Отправлено: mutineer от Октябрь 12, 2013, 19:51
currentItem() возвращает нулевой указатель?
Название: Re: SIGSEGV при получении текста QListWidgetItem
Отправлено: Fregloin от Октябрь 12, 2013, 20:08
Очевидно что в тот момент когда у вас сегментация, currentItem не выделен, соотвественно 0. Всегда проверяйте на NULL!
Название: Re: SIGSEGV при получении текста QListWidgetItem
Отправлено: ComputerMouse от Октябрь 12, 2013, 20:12
Очевидно что в тот момент когда у вас сегментация, currentItem не выделен, соотвественно 0. Всегда проверяйте на NULL!
Но... Почему?! Вылетает оно как раз при клике на item, т.е. при получении сигнала currentItemChanged(). Ладно, сделаю хитрее — буду слотом принимать информацию из сигнала.
Название: Re: SIGSEGV при получении текста QListWidgetItem
Отправлено: mutineer от Октябрь 12, 2013, 20:32
делать как задумано разработчиками сигнала это действительно очень хитро))
|