2010-04-05 6 views
1

J'ai une application Qt avec QPlainTextEdit dans le widget Tabulation. Quand essayer de faire un pointeur sur elleErreur de segmentation QPlainTextEdit

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

et appeler une méthode documents()

w->document() 

Je reçois une erreur de segmentation.

Mais si j'appelle le document directement, par ex. ui-> mainEdit-> document(), alors tout fonctionne bien.

Quelqu'un peut-il m'expliquer pourquoi cela arrive?

+0

Ma proposition tabWidget-> widget (0) renvoie NULL. Etes-vous sûr de faire "w = ..." après tabWidget rempli de contenu approprié? – ony

Répondre

0

Je suis presque sûr, que ui->tabWidget->widget(0) retourner le widget conteneur à l'intérieur de tabWidget. Essayez qDebug() << ui->tabWidget->widget(0)->metaObject()->className() et voyez ce qui est imprimé. C'est probablement juste "QWidget" et non "QPlainTextEdit". Votre modification est à l'intérieur de la disposition de ce widget

0

Vous pouvez utiliser qobject_cast pour vous assurer qu'il renvoie le bon type.

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

Il renverra 0 si le type n'est pas de QPlainTextEdit *. Comme indiqué, widget (0) ne renvoie probablement pas ce que vous vouliez - et contient probablement un conteneur ou un autre élément, et n'est probablement pas la façon dont vous voulez accéder à vos widgets, sauf s'il n'y a pas d'autre moyen.

1

Vous voulez faire:

QPlainTextEdit *w = ui->mainEdit; 

Ensuite W-> document() retournera ce que vous voulez. Vous obtenez la faute de segmentation parce que quand vous lancez ui-> tabWidget-> widget (0); donne un pointeur vers un objet de page d'onglet. Lorsque vous convertissez ceci en QPlainTextEdit *, votre programme traite une partie de la mémoire qui ne représente pas un QPlainTextEdit comme un QPlainTextEdit. Cela provoque des problèmes au moment où vous appelez w-> document() parce que c'est dans l'emplacement de mémoire auquel il essaie d'accéder n'est pas ce qu'il attend de la mémoire qui appartient à QPlainTextEdit.