views:

55

answers:

3

Hi, All!

I have some Qt application with QPlainTextEdit in Tab widget. When try to make a pointer on it

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

and call a document() method

w->document()

I get a segfault.

But if i call document directly, e.g. ui->mainEdit->document(), then everything works fine.

Can anybody explain me why it happens?

A: 

i'm almost sure, that ui->tabWidget->widget(0) return container widget inside of tabWidget. Try qDebug() << ui->tabWidget->widget(0)->metaObject()->className() and see what is printed. It's probably just "QWidget" not "QPlainTextEdit". Your edit is inside of layout of this widget

Kamil Klimek
A: 

You can use qobject_cast to make sure that it returns the right type.

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

It'll return 0 if the type is not of QPlainTextEdit*.

As stated, widget(0) is probably not returning what you wanted - and probably contains a container or some other item, and is probably not the way you want to be accessing your widgets unless there is no other way.

Will
A: 

You want to do:

QPlainTextEdit *w = ui->mainEdit;

Then w->document() will return what you want. You are getting the segmentation fault because when you cast ui->tabWidget->widget(0); gives a pointer to a tab page object. When you cast this to QPlainTextEdit* are telling your program to treat a part of memory that does not represent a QPlainTextEdit as a QPlainTextEdit. This causes trouble at the time that you call w->document() because that is in the memory location that it tries to access is not what it would expect from memory which belongs to QPlainTextEdit.