从插槽访问中央小部件时的Segfault

时间:2014-10-20 16:47:33

标签: c++ qt access-violation

我正在创建一个简单的桌面应用,其中包含一个窗口和一个基于QStackedWidget的导航作为中央窗口小部件。

启动后,应用程序会在QStackedWidget中添加一个小部件,并在用户交互后添加其他小部件。不幸的是,只是尝试从小部件的插槽中访问QStackedWidget会导致段错误。

MainWindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
  ui->setupUi(this);
  ui->centralWidget->addWidget(new LoginPage(this)); // centralWidget = QStackedWidget
}

void MainWindow::onLoginSuccess()
{
  qDebug() << ui->centralWidget;
}

LoginPage.cpp广告位

void LoginPage::on_loginButton_clicked()
{
  // Check stuff and all

  ((MainWindow*)parent())->onLoginSuccess();
}

onLoginSuccess()中的简单调试会导致此错误:

  

0x760f92a7异常,代码:0xc0000005:读取访问冲突:0x0,flags = 0x0(第一次机会)

我可以毫不费力地从插槽中更新其他UI元素,因此我不知道这里有什么错误。

1 个答案:

答案 0 :(得分:2)

MainWindow::MainWindow

  ui->centralWidget->addWidget(new LoginPage(this)); // centralWidget = QStackedWidget

addWidget会重新显示您的LoginPage。所以parent()实际上是一个QStackedWidget *,并且on_loginButton_clicked中你的MainWindow *强制转换是错误的。