Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Larry от Февраль 27, 2011, 18:15



Название: Ошибка при удалении последней строки в QTableWidget
Отправлено: Larry от Февраль 27, 2011, 18:15
Добрый вечер, форумчане!Возникла такая проблема...Есть QTableWidget в который добавляются или удаляются строки...все работает и все хорошо, но когда удаляю последнюю строку программа падает...не могу понять почему это происходит. Удаляю с помощью
Код:
removeRow(int row)


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: maint от Февраль 27, 2011, 19:44
можно попробовать обрабатывать ошибку
Код:
    if(model->removeRow(row) == false){
        QMessageBox::critical(this, "Ошибка",  model->lastError().text());
    }
может что и прояснится


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: Larry от Февраль 27, 2011, 20:20
Хотел попробовать, но QTableWidget::removeRow(int row) ничего не возвращает,..к сожалению и не имеет метода lastError()...а жаль...Есть еще какие-нибудь варианты? Бьюсь уже второй день...пишет при падении:

Необработанное исключение в "0x004012fb" в "Telit.exe": 0xC0000005: Нарушение прав доступа при чтении "0x0000000c".

Все уже проверил, но не нашел ничего... ???


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: BRE от Февраль 27, 2011, 20:24
А какие сигналы от этого QTableWidget ты обрабатываешь?


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: Larry от Февраль 27, 2011, 20:30
я обрабатываю пока только один
Код:
itemSelectionChanged()
, я его использую не как таблицу, а как список со столбцами:)...Поэтому когда он испускает этот сигнал я выделяю полностью строку...А удаляю строку нажатием на кнопку...


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: BRE от Февраль 27, 2011, 20:37
я обрабатываю пока только один
Код:
itemSelectionChanged()
...
А что внутри слота его обрабатывающего?


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: Larry от Февраль 27, 2011, 20:52
Внутри слота вот это:
Код:
int row = m_pListButtons->currentItem()->row();
m_pListButtons->selectRow(row);


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: BRE от Февраль 27, 2011, 20:56
Тогда все нормально - падать должно.  :)

Посмотри чему равно:
Код
C++ (Qt)
m_pListButtons->currentItem()
 
при удалении последней строки и тебе станет все понятно.  ;)


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: Larry от Февраль 27, 2011, 21:01
выдает -1,а почему :o...и как это обойти?


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: BRE от Февраль 27, 2011, 21:04
Как -1?  :o
Должен 0 выдавать. Проверь еще раз.

Как это обойти.... Проверять и если 0, то ничего не делать.


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: trot от Февраль 27, 2011, 21:09
-1 - потому что ничего не выделено. Вы удалили выделенную строку, вот и -1. Поэтому нужно заботиться, после удаления, куда выставлять курсор, если вообще его куда-то надо выставлять.


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: Larry от Февраль 27, 2011, 21:14
но проверку куда добавить? в слот где происходит выделение, тогда не получится, как раз на строке
Код:
int row = m_pListButtons->currentItem()->row();
программа и падает...тогда как удалить последнюю строку?


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: Larry от Февраль 27, 2011, 21:16
я в слоте удаления делаю проверку на ноль и если ноль, тогда ничего не выделяю, но все равно падает


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: BRE от Февраль 27, 2011, 21:18
но проверку куда добавить? в слот где происходит выделение, тогда не получится, как раз на строке
Код:
int row = m_pListButtons->currentItem()->row();
программа и падает...тогда как удалить последнюю строку?
Код
C++ (Qt)
QTableWidgetItem *item = m_pListButtons->currentItem();
if( !item )
return;
 
int row = item->row();
m_pListButtons->selectRow(row);
 

или проще:
Код
C++ (Qt)
int row = m_pListButtons->currentRow();
if( row != -1 )
m_pListButtons->selectRow(row);
 


Название: Re: Ошибка при удалении последней строки в QTableWidget
Отправлено: Larry от Февраль 27, 2011, 21:33
Спасибо большое, все работает и не падает...извините за тугодумость, просто уже второй день сижу, все сделал, а это не смог и даже не предполагал где ошибка...БОЛЬШОЕ-БОЛЬШОЕ спасибо...