Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Daywer от Март 25, 2017, 12:46



Название: tablewidget->removeRow() из функции падает приложение
Отправлено: 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


Название: Re: tablewidget->removeRow() из функции падает приложение
Отправлено: PimenS от Март 25, 2017, 16:47
Код:
void 
MainWindow::DelRow()
{
    tablewidget->removeRow(2);
}

Где объявление tablewidget?


Название: Re: tablewidget->removeRow() из функции падает приложение
Отправлено: Old от Март 25, 2017, 17:21
Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   /*QTableWidget */ tablewidget = new QTableWidget(centralWidget());
   ...
}
 

И все заработает.


Название: Re: tablewidget->removeRow() из функции падает приложение
Отправлено: Daywer от Март 28, 2017, 10:24
Спасибо и правда работает. Чем вариант с указателем плох?


Название: Re: tablewidget->removeRow() из функции падает приложение
Отправлено: gil9red от Март 28, 2017, 10:31
Спасибо и правда работает. Чем вариант с указателем плох?

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


Название: Re: tablewidget->removeRow() из функции падает приложение
Отправлено: Daywer от Март 28, 2017, 10:37
Спасибо и правда работает. Чем вариант с указателем плох?

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

Премного благодарен. Учиться, учиться и еще раз учиться...