我在Tab小部件中有一些Qt应用程序和QPlainTextEdit。当试图在它上面做一个指针
QPlainTextEdit *w = (QPlainTextEdit*)ui->tabWidget->widget(0)
并调用document()方法
w->document()
我遇到了段错误。
但如果我直接致电文件,例如ui> mainEdit-> document(),然后一切正常。
有人能解释我为什么会这样吗?
答案 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)可能不会返回您想要的内容 - 并且可能包含容器或其他项目,并且可能不是您希望访问窗口小部件的方式,除非没有其他方法。