Ошибка сегментации при доступе к textBox из обратного вызова - PullRequest
0 голосов
/ 22 мая 2018

У меня есть простые функции обратного вызова, которые предоставляют данные для отображения в главной форме виджета QT.Как только точка останова достигает setText (), у меня возникает исключение Segmentation fault:

void MainWindow::SetAmount(int value)
{
    ui->tbAmount->setText( QString::number(value) );

}

enter image description here

Почему я получаю ошибку souch?Когда я звоню SetAmount() от нажатия кнопки, он работает нормально.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Скорее всего, вы вызываете обратный вызов из неверного потока.Также возможно, что вы пытаетесь получить к нему доступ до того, как объект был создан (или после того, как он был разрушен).Изменить следующим образом:

  1. Инициализация значения ui, независимо от того, что вы делаете в конструкторе.Держите это по значению.Наконец - обнулите ui в деструкторе в качестве средства отладки.

  2. Добавьте проверки к обратному вызову.

#if !defined(DEBUG_INIT) && defined(QT_NO_DEBUG)
#define DEBUG_INIT
#elif !defined(DEBUG_INIT) && !defined(QT_NO_DEBUG)
#define DEBUG_INIT = {}
#endif

class MainWindow : public ... {
  Q_OBJECT
  Ui::MainWindow ui DEBUG_INIT; // held by value
  ...
public:
  explicit MainWindow(QWidget *parent = {});
  ~MainWindow() override;
};

MainWindow::MainWindow(QWidget *parent) : baseclass(parent) {
  ui.setupUi(this);
  ...
}

MainWindow::~MainWindow() {
  ...
  Q_UNUSED((ui DEBUG_INIT));
}

void MainWindow::SetAmount(int value) {
  Q_ASSERT(QThread::currentThread() == thread());
  Q_ASSERT(!d_ptr->wasDeleted);
  ui->tbAmount->setText(QString::number(value));
}
0 голосов
/ 22 мая 2018

Если бы мне пришлось угадывать, вы, вероятно, пытаетесь разыменовать указатель null.Я бы добавил следующую проверку ошибок в метод, чтобы увидеть, имеет ли это место

if (ui == null || ui->tbAmount == null) {
    qDebug() << "NULL Pointer";
}

Если ui или ui->tbAmount действительно null, я бы гарантировал, что они правильно инициализируютсяв другом месте вашей реализации до того, как MainWindow::SetAmount(int value) будет вызван.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...