Russian Qt Forum

Qt => Общие вопросы => Тема начата: ComputerMouse от Октябрь 12, 2013, 19:05



Название: 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
делать как задумано разработчиками сигнала это действительно очень хитро))