从回调访问textBox时出现分段错误

时间:2018-05-22 13:46:58

标签: c++ qt

我有简单的回调函数,提供要在QT小部件主窗体上显示的数据。一旦断点到达setText(),我就会遇到异常Segmentation fault

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

}

enter image description here

为什么我会发现souch错误?当我从按钮点击SetAmount()时,它运行正常。

2 个答案:

答案 0 :(得分:0)

如果我不得不猜测,您可能会尝试取消引用null指针。我会将以下错误检查添加到方法中以查看是否是这种情况

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

如果uiui->tbAmount确实是null,我会确保在调用MainWindow::SetAmount(int value)之前在实现的其他位置正确初始化它们。

答案 1 :(得分:0)

你很可能是从错误的线程调用回调。您也可能在创建对象之前(或在对象被破坏之后)尝试访问它。修改如下:

  1. Value-initialize ui,尽管你在构造函数中做了什么。保持价值。最后 - 将析构函数中的ui作为调试助手。

  2. 将检查添加到回调中。

  3. #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));
    }