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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: tablewidget->removeRow() из функции падает приложение  (Прочитано 4119 раз)
Daywer
Гость
« : Март 25, 2017, 12:46 »

Уважаемы коллеги помогите пожалуйста. Стыдно задавать вопрос. Вроде просто все,  а причину не могу понять.

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTableWidget * tablewidget = new QTableWidget(centralWidget());
    tablewidget->setGeometry(20,20,200,200);
    tablewidget->setRowCount(3);
    tablewidget->setColumnCount(3);
    for (int i=0;i!=3;i++)
                    {
                        tablewidget->setRowHeight(i,40);
                        tablewidget->setColumnWidth(i,40);
                    }

     DelRow();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::DelRow()
 {

    tablewidget->removeRow(2);
 }

В таком виде приложение завершается с ошибкой. хотя сборка проходит без проблем. Но если выделеную красным цветом DelRow() заменить на  tablewidget->removeRow(2); , то все работает.
Вот и не могу понять в чем разница.
Qt 5.8
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #1 : Март 25, 2017, 16:47 »

Код:
void 
MainWindow::DelRow()
{
    tablewidget->removeRow(2);
}

Где объявление tablewidget?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Март 25, 2017, 17:21 »

Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   /*QTableWidget */ tablewidget = new QTableWidget(centralWidget());
   ...
}
 

И все заработает.
Записан
Daywer
Гость
« Ответ #3 : Март 28, 2017, 10:24 »

Спасибо и правда работает. Чем вариант с указателем плох?
« Последнее редактирование: Март 28, 2017, 10:59 от Daywer » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Март 28, 2017, 10:31 »

Спасибо и правда работает. Чем вариант с указателем плох?

Судя по коду в DelRow, tablewidget у вас уже был объявлен полем класса, но не инициализирован
В конструкторе вы создали новую переменную с именем tablewidget и переменная tablewidget в поле класса не была инициализирована, поэтому при вызове того метода, обращение было по не инициализированному указателю, что и вызвало падение (будь это на Java, то такая ошибка была бы названа Null Pointer Exception)
Записан

Daywer
Гость
« Ответ #5 : Март 28, 2017, 10:37 »

Спасибо и правда работает. Чем вариант с указателем плох?

Судя по коду в DelRow, tablewidget у вас уже был объявлен полем класса, но не инициализирован
В конструкторе вы создали новую переменную с именем tablewidget и переменная tablewidget в поле класса не была инициализирована, поэтому при вызове того метода, обращение было по не инициализированному указателю, что и вызвало падение (будь это на Java, то такая ошибка была бы названа Null Pointer Exception)

Премного благодарен. Учиться, учиться и еще раз учиться...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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