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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: SIGSEGV при получении текста QListWidgetItem  (Прочитано 2997 раз)
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. Почему?
Записан
mutineer
Гость
« Ответ #1 : Октябрь 12, 2013, 19:51 »

currentItem() возвращает нулевой указатель?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Октябрь 12, 2013, 20:08 »

Очевидно что в тот момент когда у вас сегментация, currentItem не выделен, соотвественно 0. Всегда проверяйте на NULL!
Записан
ComputerMouse
Гость
« Ответ #3 : Октябрь 12, 2013, 20:12 »

Очевидно что в тот момент когда у вас сегментация, currentItem не выделен, соотвественно 0. Всегда проверяйте на NULL!
Но... Почему?! Вылетает оно как раз при клике на item, т.е. при получении сигнала currentItemChanged(). Ладно, сделаю хитрее — буду слотом принимать информацию из сигнала.
Записан
mutineer
Гость
« Ответ #4 : Октябрь 12, 2013, 20:32 »

делать как задумано разработчиками сигнала это действительно очень хитро))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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