我的实际使用情况是平凡的,所以我提供再现分段错误的一个小例子:促进CustomQScrollArea分段故障
我有类CustomScrollArea继承QScrollArea:
customscrollarea.h
class CustomScrollArea : public QScrollArea
{
Q_OBJECT
public:
explicit WarxingScrollArea(QWidget* parent=0);
void segFaultThrowingMethod();
private:
QLabel* dynamicallyCreatedLabel;
};
customscrollarea.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类:
mainwindow.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
mainwindow.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;
}
对于主窗口的的.ui文件包含一个QScrollArea提升为CustomQScrollArea。它的名字是“customScrollArea”。
当我启动应用程序时,CustomScrollArea :: segFaultThrowingMethod()的第一次调用发生在CustomScrollArea的Ui :: MainWindow :: customScrollArea的构造函数中,并且没有发生事件传递。但是,当MainWindow调用ui-> customScrollArea-> segFaultThrowingMethod()时,会发生分段错误。
请注意,分段错误不是由于CustomScrollArea :: dynamicallyCreatedLabel为空(如建议here)所致。我得到的最好线索是,如果MainWindow动态实例化CustomScrollArea而不是从Ui :: MainWindow获取它,则不会发生此问题。不过,我希望能够在Qt Designer中使用QScrollAreas提升为CustomScrollAreas。
感谢您的帮助!
你尝试过使用调试器吗?你的发展环境? –
使用VC2010在Windows上使用Qt Creator。在两个segFaultThrowingMethod()的调用中,调试器都指示了dynamicallyCreatedLabel是相同的非空值。从Pavel的回答可以看出,实际的空指针一定是Qt架构中更深层的地方。我的编译器和构建这些Qt库的编译器之间必然存在一些差异,因为我无法步入它们。 – phizla