QPlainTextEdit分段错误

时间:2010-04-05 09:59:26

标签: qt segmentation-fault

我在Tab小部件中有一些Qt应用程序和QPlainTextEdit。当试图在它上面做一个指针

QPlainTextEdit *w = (QPlainTextEdit*)ui->tabWidget->widget(0)

并调用document()方法

w->document()

我遇到了段错误。

但如果我直接致电文件,例如ui> mainEdit-> document(),然后一切正常。

有人能解释我为什么会这样吗?

3 个答案:

答案 0 :(得分:1)

你想这样做:

QPlainTextEdit *w = ui->mainEdit;

然后w-> document()将返回您想要的内容。您正在获取分段错误,因为当您投射ui-> tabWidget->小部件(0)时;给出一个指向标签页对象的指针。当你将它转换为QPlainTextEdit *时,告诉你的程序将一段不代表QPlainTextEdit的内存视为QPlainTextEdit。这会在你调用w-> document()时造成麻烦,因为它在它尝试访问的内存位置不是它对QPlainTextEdit所属内存的期望。

答案 1 :(得分:0)

我几乎可以肯定,ui->tabWidget->widget(0)返回tabWidget中的容器小部件。试试qDebug() << ui->tabWidget->widget(0)->metaObject()->className(),看看打印的是什么。它可能只是“QWidget”而不是“QPlainTextEdit”。您的编辑位于此小部件的布局内

答案 2 :(得分:0)

您可以使用qobject_cast确保它返回正确的类型。

QPlainTextEdit *w = qobject_cast<QPlainTextEdit*>(ui->tabWidget->widget(0));
if (w)
{
...
}

如果类型不是QPlainTextEdit *,它将返回0。

如上所述,widget(0)可能不会返回您想要的内容 - 并且可能包含容器或其他项目,并且可能不是您希望访问窗口小部件的方式,除非没有其他方法。