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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: ошибка при удалении строки из QTableWidget  (Прочитано 5557 раз)
Leopard256
Гость
« : Ноябрь 13, 2013, 13:21 »

пытаюсь удалить выделенную строку по нажатию кнопки:

Код:
void XXX::slotDelRow()
{  
    QList<QTableWidgetSelectionRange> list = (ui.twList->selectedRanges());
    if (!list.isEmpty())
    {
        QTableWidgetSelectionRange ttt = list.first();
        int row = ttt.bottomRow();
        ui.twList->removeRow(row);
    }
}

получаю:
Код:
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: D:\DEVELOP\XXX\XXX.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c
Line: 1322

Expression: _CrtIsValidHeapPointer(pUserData)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

Код:
	msvcr100d.dll!_CrtIsValidHeapPointer(const void * pUserData=0x00ca2ff0)  Line 2036	C++
  msvcr100d.dll!_free_dbg_nolock(void * pUserData=0x00ca2ff0, int nBlockUse=1)  Line 1322 + 0x9 bytes C++
  msvcr100d.dll!_free_dbg(void * pUserData=0x00ca2ff0, int nBlockUse=1)  Line 1265 + 0xd bytes C++
  msvcr100d.dll!operator delete(void * pUserData=0x00ca2ff0)  Line 54 + 0x10 bytes C++
> XXX.exe!QTableWidgetSelectionRange::`scalar deleting destructor'()  + 0x21 bytes C++
  XXX.exe!QList<QTableWidgetSelectionRange>::node_destruct(QList<QTableWidgetSelectionRange>::Node * from=0x00c74174, QList<QTableWidgetSelectionRange>::Node * to=0x00c74174)  Line 431 + 0x2f bytes C++
  XXX.exe!QList<QTableWidgetSelectionRange>::free(QListData::Data * data=0x00c74160)  Line 759 C++
  XXX.exe!QList<QTableWidgetSelectionRange>::~QList<QTableWidgetSelectionRange>()  Line 733 C++
  XXX.exe!XXX::slotDelRow()  Line 37 C++


просто:
Код:
void XXX::slotDelRow()
{  
    ui.twList->removeRow(1);
}

работает без ошибок.


 также падает:
Код:
QList<QTableWidgetSelectionRange> list = (ui.twList->selectedRanges());
    list.clear();

« Последнее редактирование: Ноябрь 13, 2013, 14:30 от Leopard256 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Ноябрь 13, 2013, 15:47 »

судя по ошибке, удаляется уже удаленный указатель (скорее всего указатель на QTableWidgetItem).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Leopard256
Гость
« Ответ #2 : Ноябрь 13, 2013, 15:59 »

судя по ошибке, удаляется уже удаленный указатель (скорее всего указатель на QTableWidgetItem).

и как исправить?
кроме показанного кода нигде ничего не удаляю.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Ноябрь 13, 2013, 18:34 »

по возможности покажи весь код, где участвует таблица
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Leopard256
Гость
« Ответ #4 : Ноябрь 13, 2013, 20:18 »

по возможности покажи весь код, где участвует таблица

вот он:

Код:
XXX::XXX(QWidget *parent, Qt::WFlags flags)
    : QDialog(parent, flags)
{
    ui.setupUi(this);
    connect(this->ui.btnAdd, SIGNAL(clicked()), SLOT(slotAdd()));
    connect(this->ui.btnDelRow, SIGNAL(clicked()), SLOT(slotDelRow()));

}

XXX::~XXX()
{

}

void XXX::slotAdd()
{
    

   for(int row=0; row!=ui.twList->rowCount(); ++row)
   {
        for(int column=0; column!=(ui.twList->columnCount()); ++column)
        {
            QTableWidgetItem *newItem = new QTableWidgetItem(tr("%1").arg((row+1)*(column+1)));
            ui.twList->setItem(row, column, newItem);
            
        }

    }
}

void XXX::slotDelRow()
{  
    QList<QTableWidgetSelectionRange> list = (ui.twList->selectedRanges());
    if (!list.isEmpty())
    {
        QTableWidgetSelectionRange* ttt = &list.first();
        int row = ttt->bottomRow();
        ui.twList->removeRow(row);
    }
    
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Ноябрь 13, 2013, 20:37 »

вроде все правильно. удаление через ui.twList->removeRow(ui.twList->currentRow()); тоже крашит?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Leopard256
Гость
« Ответ #6 : Ноябрь 13, 2013, 20:49 »

вроде все правильно. удаление через ui.twList->removeRow(ui.twList->currentRow()); тоже крашит?

так удаляется, но хотелось бы удалять выделенную, а не текущую.

Проблема в QList, но не пойму почему....

крашит:
Код:
QList<QTableWidgetSelectionRange> list = (ui.twList->selectedRanges());
list.clear();
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Ноябрь 13, 2013, 21:28 »

А разве "выделенный" и "текущий" не одно и тоже? Улыбающийся
Записан

Leopard256
Гость
« Ответ #8 : Ноябрь 13, 2013, 21:43 »

А разве "выделенный" и "текущий" не одно и тоже? Улыбающийся

нет Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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