我有简单的回调函数,提供要在QT小部件主窗体上显示的数据。一旦断点到达setText(),我就会遇到异常Segmentation fault
:
void MainWindow::SetAmount(int value)
{
ui->tbAmount->setText( QString::number(value) );
}
为什么我会发现souch错误?当我从按钮点击SetAmount()
时,它运行正常。
答案 0 :(得分:0)
如果我不得不猜测,您可能会尝试取消引用null
指针。我会将以下错误检查添加到方法中以查看是否是这种情况
if (ui == null || ui->tbAmount == null) {
qDebug() << "NULL Pointer";
}
如果ui
或ui->tbAmount
确实是null
,我会确保在调用MainWindow::SetAmount(int value)
之前在实现的其他位置正确初始化它们。
答案 1 :(得分:0)
你很可能是从错误的线程调用回调。您也可能在创建对象之前(或在对象被破坏之后)尝试访问它。修改如下:
Value-initialize ui
,尽管你在构造函数中做了什么。保持价值。最后 - 将析构函数中的ui
作为调试助手。
将检查添加到回调中。
#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));
}