2014-10-20 95 views
1

我使用单个窗口创建简单的桌面应用程序,并基于QStackedWidget作为中央插件进行导航。从插槽访问中央插件时出现Segfault错误

开始时,应用程序在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()导致此错误:

Exception at 0x760f92a7, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance)

我有没有T卢布更新槽中的其他UI元素,所以我不知道这里有什么问题。

+0

看来,父()为空,你没有检查。 LoginPage的构造函数是否正确处理父参数? – drescherjm 2014-10-20 17:31:30

+0

此外,我会使用信号/插槽。我的意思是连接on_loginButton_clicked到MainWindow :: onLoginSuccess()而不是直接调用。 – drescherjm 2014-10-20 17:36:52

+0

parent不为null,调用方法不会失败,如果我只是简单地调试一个字符串或其他东西。至于使用信号/插槽,这意味着将大部分逻辑放在'MainWindow'中,这实际上没有意义... – Jukurrpa 2014-10-20 17:42:10

回答

2

MainWindow::MainWindow

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

addWidget将重定位你的LoginPage。因此,parent()实际上是一个QStackedWidget *,而您的MainWindow * cast在on_loginButton_clicked中是错误的。

+0

好点。我使用qobject_cast <>。 – drescherjm 2014-10-20 19:15:30

+0

就是这样,谢谢。我已经使用C++和Qt已经有一段时间了...... – Jukurrpa 2014-10-21 09:52:55

+0

@Jukurrpa我告诉过你绝对相同的东西,你说我不对,我删除了答案。我误解了什么? – Chernobyl 2014-10-21 10:55:40