我的实际用例很重要,所以我提供了一个重现分段错误的小示例:
我有继承 QScrollArea 的类 CustomScrollArea:
海关滚动区域.h
class CustomScrollArea : public QScrollArea
{
Q_OBJECT
public:
explicit WarxingScrollArea(QWidget* parent=0);
void segFaultThrowingMethod();
private:
QLabel* dynamicallyCreatedLabel;
};
customcrollarea.cpp
CustomScrollArea::CustomScrollArea(QWidget* parent) : QScrollArea(parent)
{
dynamicallyCreatedLabel = new QLabel;
setWidget(dynamicallyCreatedLabel);
//this call will _not_ cause a seg fault
segFaultThrowingMethod();
}
void CustomScrollArea::segFaultThrowingMethod()
{
dynamicallyCreatedLabel->setText("Some text");
}
我有一个带有以下来源的 MainWindow 类:
主窗口.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
主窗口.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//this call will cause a seg fault
ui->customScrollArea->segFaultThrowingMethod();
}
MainWindow::~MainWindow()
{
delete ui;
}
MainWindow 的 .ui 文件包含一个提升为 CustomQScrollArea 的 QScrollArea。它的名字是“customScrollArea”。
当我启动应用程序时,CustomScrollArea::segFaultThrowingMethod() 的第一次调用发生在 CustomScrollArea 的 Ui::MainWindow::customScrollArea 构造函数中,并且顺利通过。但是,当 MainWindow 调用 ui->customScrollArea->segFaultThrowingMethod() 时,会发生分段错误。
请注意,分段错误不是由于 CustomScrollArea::dynamicallyCreatedLabel 为空(如此处建议)。我得到的最好线索是,如果 MainWindow 动态实例化 CustomScrollArea 而不是从 Ui::MainWindow 获取它,则不会发生此问题。但是,我希望能够在 Qt Designer 中使用提升为 CustomScrollAreas 的 QScrollAreas。
谢谢你的帮助!