Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QPlainTextEdit分段错误_Qt_Segmentation Fault - Fatal编程技术网

Qt QPlainTextEdit分段错误

Qt QPlainTextEdit分段错误,qt,segmentation-fault,Qt,Segmentation Fault,我在选项卡小部件中有一些QPlainTextEdit的Qt应用程序。当你试图在上面做一个指针的时候 QPlainTextEdit *w = (QPlainTextEdit*)ui->tabWidget->widget(0) 并调用document()方法 我犯了一个错误 但如果我直接调用document,例如ui->mainEdit->document(),那么一切都正常 有人能解释一下为什么会这样吗?我几乎可以肯定,ui->tabWidget->widget(0)返回tabWid

我在选项卡小部件中有一些QPlainTextEdit的Qt应用程序。当你试图在上面做一个指针的时候

QPlainTextEdit *w = (QPlainTextEdit*)ui->tabWidget->widget(0)
并调用document()方法

我犯了一个错误

但如果我直接调用document,例如ui->mainEdit->document(),那么一切都正常


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

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

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

您可以使用qobject\u cast来确保它返回正确的类型

QPlainTextEdit *w = qobject_cast<QPlainTextEdit*>(ui->tabWidget->widget(0));
if (w)
{
...
}
QPlainTextEdit*w=qobject\u cast(ui->tabWidget->widget(0));
如果(w)
{
...
}
如果类型不是QPlainTextEdit*,它将返回0


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

您可以使用qobject\u cast确保它返回正确的类型

QPlainTextEdit *w = qobject_cast<QPlainTextEdit*>(ui->tabWidget->widget(0));
if (w)
{
...
}
QPlainTextEdit*w=qobject\u cast(ui->tabWidget->widget(0));
如果(w)
{
...
}
如果类型不是QPlainTextEdit*,它将返回0

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

您想要执行以下操作:

QPlainTextEdit *w = ui->mainEdit;
然后w->document()将返回您想要的内容。您将获得分段错误,因为当您强制转换ui->tabWidget->widget(0)时;提供指向选项卡页对象的指针。当您将其强制转换为QPlainTextEdit*时,您告诉您的程序将不表示QPlainTextEdit的内存部分视为QPlainTextEdit。这会在调用w->document()时引发问题,因为它试图访问的内存位置不是它从属于QPlainTextEdit的内存中期望的位置。

您想执行以下操作:

QPlainTextEdit *w = ui->mainEdit;
然后w->document()将返回您想要的内容。您将获得分段错误,因为当您强制转换ui->tabWidget->widget(0)时;提供指向选项卡页对象的指针。当您将其强制转换为QPlainTextEdit*时,您告诉您的程序将不表示QPlainTextEdit的内存部分视为QPlainTextEdit。这会在调用w->document()时引发问题,因为它试图访问的内存位置不是它所期望的属于QPlainTextEdit的内存。

My guess tabWidget->widget(0)返回NULL。您确定在使用适当的内容填充tabWidget之后执行“w=…”操作吗?我猜tabWidget->widget(0)返回NULL。您确定在使用适当的内容填充tabWidget之后执行“w=…”操作吗?