(Qt) Ошибка чтения при попытке использовать любую функцию из другого класса виджетов в моем MainWindow

Я хотел бы получить доступ к некоторым функциям виджета диалогового типа из моего mainwindow.cpp.

Я создал простую функцию в классе виджетов, которая возвращает целое число, которое выглядит так:

диалог.ч:

 public:  
      int getRowCountData();

диалог.cpp:

 int Dialog::getRowCountData()
 {
      return ui->tableWidget->rowCount();
 }

Применение:

мой mainWindow.h:

private:
    Dialog *dialog;

мой mainwindow.cpp:

dialog = new Dialog;


int count = dialog->getRowCountData();   <<<<<--------------this throws a read access error!

код: 0xc0000005 нарушение доступа для чтения по адресу: 0x0 flas=0x0

как мне использовать публичные функции другого виджета, такие как эта простая?

Я не должен ссылаться на целое число, которое хочу установить с помощью функции rowcount. Сигналы и слоты отлично работали для меня в прошлом, когда я использовал их для передачи данных между виджетами, но я хотел бы придерживаться такой функции моего диалогового виджета, если смогу.

Я пришел к этому методу для получения данных в моем другом виджете, опубликовав этот вопрос: доступ к данным QTableWidget из другого класса. @Chernobyl, может быть, у вас есть дополнительная информация?

Заранее спасибо!


person Rachael    schedule 17.09.2014    source источник
comment
Вопрос требует больше кода, проблема сейчас не видна.   -  person hyde    schedule 18.09.2014
comment
Кроме того, bcaktrace было бы неплохо. Если это строка, которую вы сейчас указываете в вопросе, указатель dialog там равен 0. Почему, из вопроса не ясно.   -  person hyde    schedule 18.09.2014
comment
В Qt Creator перейдите к строкам с new Dialog и dialog-> и нажмите F2 на обоих именах dialog. Они ведут вас в одно и то же место (вероятно, в объявление в .h-файле класса)? Установите точки останова или добавьте отладочные отпечатки для обоих, чтобы увидеть, действительно ли dialog создан, прежде чем пытаться его использовать.   -  person hyde    schedule 18.09.2014


Ответы (1)


Нет. Проблема в использовании неправильного указателя. Это исключение означает именно это.

Проверьте, не является ли указатель диалога нулевым и, возможно, ui->tableWidget не существует. Вы должны вызвать setupUi, если хотите использовать виджеты, созданные в Qt Designer.

Напишите это:

if(!dialog)
qDebug() << "fail";
else
{qDebug() << "good";//your call}

В большинстве случаев такой сбой происходит из-за

  • удаление объекта более одного раза
  • доступ к оборванному указателю (то есть указателю на уже удаленный объект)
  • доступ к нулевому указателю
person Kosovan    schedule 18.09.2014
comment
Setupui вызывается, и я легко мог видеть, что getRowCountData() был членом экземпляра диалога в главном окне. Там нет проблем. - person Rachael; 18.09.2014
comment
@Rachael, посмотри мое редактирование. Я говорил тебе и о диалоге. Ром с этим кодом. Вы получили неудачу или хорошо? - person Kosovan; 18.09.2014
comment
Теперь я вижу, что вы, ребята, говорите, и я чувствую себя придурком. Добавлю нулевые чеки для dialog как можно скорее (с утра). Спасибо, что остаетесь со мной здесь. - person Rachael; 18.09.2014
comment
проблема заключалась в том, что функция, выполняющая этот код, была вызвана до создания экземпляра диалогового виджета. Указатель диалога не был нулевым — он был заполнен мусором (я уже инициализировал его в своем классе mainwindow.h, поэтому он никак не мог быть нулевым). Извините за глупую ошибку, но спасибо за вашу помощь. Я больше не совершу эту ошибку (надеюсь). В следующий раз я буду спать, прежде чем отлаживать и публиковать свои проблемы на сайте. Спасибо еще раз. - person Rachael; 18.09.2014
comment
@ Рэйчел Добро пожаловать. Но у меня есть еще одно предложение. В будущем создавайте свои вопросы с тегом c++, пожалуйста (конечно, если вы используете c++ в своем вопросе). Кроме того, отредактируйте свои вопросы (этот и ваш последний) и добавьте к ним тег c++ (если вы можете это сделать), потому что ваши вопросы больше c++, чем Qt, поэтому тег c++ должен быть. - person Kosovan; 18.09.2014