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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableWidgetItem. Ошибка segmentation fault при добавлении  (Прочитано 7882 раз)
varkon
Гость
« : Июнь 28, 2010, 09:23 »

Доброго дня.
Есть такой код:
Код:
    ui->twMain->insertRow(ui->twMain->rowCount());
    row = ui->twMain->rowCount()-1;
    ui->twMain->setCurrentCell(ui->twMain->rowCount()-1,0);
    ui->twMain->setItem(row,0,new QTableWidgetItem(QString::number(item.id)));
    ui->twMain->setItem(row,1,new QTableWidgetItem(item.goodname));
    ui->twMain->setItem(row,2,new QTableWidgetItem(QString::number(item.metricid)));
    ui->twMain->setItem(row,3,new QTableWidgetItem(item.metricname));
    QString price = ad->edCount->text();
//здесь начинаются проблемы
    ui->twMain->setItem(row,4,new QTableWidgetItem(price));
    ui->twMain->setItem(row,5,new QTableWidgetItem(ad->edPrice->text()));
    ui->twMain->setItem(row,6,new QTableWidgetItem(ad->edPriceR->text()));
//здесь заканчиваются
    double tmpsumm = ad->edCount->value()*ad->edPrice->value();
    QString textF = QString("%1").arg(tmpsumm,0,'f',2);
    ui->twMain->setItem(row,7,new QTableWidgetItem(textF));
    ui->twMain->setItem(row,8,new QTableWidgetItem("-1"));
    SUMM += tmpsumm;
    textF = QString("%1").arg(SUMM,0,'f',2);
    ui->lbSumm->setText(textF);

Который добавляет некоторые данные в таблицу. Там где отмечено  - возникает указанная ошибка. Если эти три строки закомментировать - проблем нет. Если таблица изначально пуста при создании формы  -  все добавляется нормально.
Причем проблема возникает именно при добавлении данных в 4, 5 и 6 столбцах соотвественно. Не важно каких. В данном случае читаются значения QDoubleSpinBox-в которые находятся на модальной форме. Объекты полностью доступны и содержат корректные данные.
Предварительно таблица заполняется следующим кодом:
Код:
QTableWidget *tb = (QTableWidget*)sender;
    QStringList li;
    tb->clear();
    tb->setRowCount(0);
    tb->setColumnCount(0);
   
    QString heder = "Код";
    li << heder;
    heder = "Наименование";
    li << heder;
    heder = "Smid";
    li << heder;
    heder = "Ед.изм";
    li << heder;
    heder = "Кол-во";
    li << heder;
    heder = "Цена";
    li << heder;
    heder = "Розница";
    li << heder;
    heder  = "Сумма";
    li << heder;
    heder = "did";
    li << heder;

    int count = li.count();
    tb->setColumnCount(count);

    tb->setHorizontalHeaderLabels(li);
   tb->setColumnHidden(2,true);
   tb->setColumnHidden(8,true);
   tb->setColumnWidth(0,60);


    if(mid == -1) return 0;

    QSqlQuery *query = new QSqlQuery(dmModule::db);
    query->prepare("select did, gid,smid,gname,smname_short,gcount,gprice, gcount*gprice as gsumm, (select  max(rg.price) from regprices rg where rg.did = vw.did) as price from VWMDETAILS vw where mid = :mid ");
    query->bindValue(":mid",mid);
    query->setForwardOnly(true);
    query->exec();
    summ = 0.0;

    while(query->next()){
        tb->insertRow(tb->rowCount());
        tb->setCurrentCell(tb->rowCount()-1,0);
        tb->setItem(tb->currentRow(),0,new QTableWidgetItem(query->record().value("gid").toString()));
        tb->setItem(tb->currentRow(),1,new QTableWidgetItem(query->record().value("gname").toString()));
        tb->setItem(tb->currentRow(),2,new QTableWidgetItem(query->record().value("smid").toString()));
        tb->setItem(tb->currentRow(),3,new QTableWidgetItem(query->record().value("smname_short").toString()));
        tb->setItem(tb->currentRow(),4,new QTableWidgetItem(query->record().value("gcount").toString()));

        tb->setItem(tb->currentRow(),5,new QTableWidgetItem(query->record().value("gprice").toString()));

        tb->setItem(tb->currentRow(),6,new QTableWidgetItem(query->record().value("price").toString()));

        summ += query->record().value("gsumm").toDouble();
        QString textF = QString("%1").arg(query->record().value("gsumm").toDouble(),0,'f',2);
        tb->setItem(tb->currentRow(),7,new QTableWidgetItem(textF));
        tb->setItem(tb->currentRow(),8,new QTableWidgetItem(query->record().value("did").toString()));
    }

    delete query;
    return 0;
в чем может быть проблема?
Записан
RoS
Гость
« Ответ #1 : Июнь 28, 2010, 14:50 »

Несомненно в том, что где-то не создаешь итема, потому что segmentatio nfault всегда с этим связан - обращение к нуллу, запусти дебаг - и поймешь!
Записан
varkon
Гость
« Ответ #2 : Июнь 28, 2010, 15:23 »

угу. спасибо кеп. Улыбающийся

Понятно, что где-то идет обращение к несозданному объекту. Вопрос  - почему именно в этих трех строках? И почему абсолютно такой же код при создании таблицы отрабатывает нормально?
Я грешил на компоненты, которые находятся на форме (QDoubleSpinBox) - но обращение к ним не создает никаких проблем. Теряется указатель именно в данных трех строках - причем видимой причины нет. Я потому и разместил код - может бытья упустил что-то?
Выбрасывает в функции класса QTableWidgetItem
Код:
inline QString text() const
        { return data(Qt::DisplayRole).toString(); }
Записан
galilley
Гость
« Ответ #3 : Июнь 28, 2010, 16:08 »

А сигналы на изменение данных в item-ах не ловите? Эти сигналы, похоже, испускаются и при вызове setItem, и если там, скажем, для подсчёта суммы идёт обращение к итемам, которые ещё не созданы, то понятно что будет.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Июнь 28, 2010, 16:53 »

Цитировать
В данном случае читаются значения QDoubleSpinBox-в которые находятся на модальной форме.

Покажи код этого диалога. Если у него установлен аттрибут Qt::WA_DeleteOnClose - отсюда и все проблемы.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
varkon
Гость
« Ответ #5 : Июнь 28, 2010, 21:42 »

А сигналы на изменение данных в item-ах не ловите? Эти сигналы, похоже, испускаются и при вызове setItem, и если там, скажем, для подсчёта суммы идёт обращение к итемам, которые ещё не созданы, то понятно что будет.
да не ловлю в том то и дело.
Код:
Покажи код этого диалога. Если у него установлен аттрибут Qt::WA_DeleteOnClose - отсюда и все проблемы.
Ну во первых тогда были бы проблемы во всех случаях. Однако если таблица пуста (создается новый документ)  - добавляй хоть стопятсот записей. Все в порядке. Кроме того, при загрузке из БД тоже все нормально. Кроме того, доступ к элементам диалога на форме есть, и в отладчике они видны. Загадка.
Код создания диалога:
Код:
AddItems *ad = new AddItems(this);
    ad->lbName->setText(model->record(in.row()).value("gname").toString());
    ad->lbSMName->setText(model->record(in.row()).value("smname_short").toString());
    ad->edCount->setValue(1.0);
    if(model->record(in.row()).value("gprice").isNull())
        ad->edPrice->setValue(0.0);
    else
    ad->edPrice->setValue(model->record(in.row()).value("gprice").toDouble());
    if(model->record(in.row()).value("price").isNull())
        ad->edPriceR->setValue(0.0);
    else
    ad->edPriceR->setValue(model->record(in.row()).value("price").toDouble());
    if(ad->exec() != QDialog::Accepted){
        delete ad;
        return;
    }


Записан
varkon
Гость
« Ответ #6 : Июнь 28, 2010, 21:55 »

А сигналы на изменение данных в item-ах не ловите? Эти сигналы, похоже, испускаются и при вызове setItem, и если там, скажем, для подсчёта суммы идёт обращение к итемам, которые ещё не созданы, то понятно что будет.
вы оказались правы. Причина все же в обработке сигнала cellChanged.
Записан
varkon
Гость
« Ответ #7 : Июнь 28, 2010, 22:23 »

вобщем как всегда - никакой мистики.
Когда новый документ - то все отрабатывало без ошибок, потому что в состоянии "Новый документ" данное событие не нужно, и естественно обработка не выполнялась (проверялось текущее состояние формы). Тоже самое и с загрузкой документа.
Выяснилось это случайно - была сделана попытка добавить запись уже к проведенному документу - в этом случае пользователю выдается сообщение.
Всем спасибо за помощь.
Записан
crossly
Гость
« Ответ #8 : Июнь 29, 2010, 08:44 »

может к модели больше подойдет QTableView ??
Записан
varkon
Гость
« Ответ #9 : Июнь 29, 2010, 09:33 »

может к модели больше подойдет QTableView ??
Ну в данном случае QTableWidget хватает с головой, потому как для QTableView необходимо будет реализовать собственную модель данных  (это планируется, но не сейчас).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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