Ошибка сегментации QPlainTextEdit - PullRequest
1 голос
/ 05 апреля 2010

У меня есть приложение Qt с QPlainTextEdit в виджете Tab. При попытке сделать на нем указатель

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

и вызов метода document ()

w->document()

Я получаю сегфо.

Но если я позвоню в документ напрямую, например, ui-> mainEdit-> document (), тогда все работает нормально.

Кто-нибудь может объяснить мне, почему это происходит?

Ответы [ 3 ]

1 голос
/ 06 апреля 2010

Вы хотите сделать:

QPlainTextEdit *w = ui->mainEdit;

Тогда w-> document () вернет то, что вы хотите. Вы получаете ошибку сегментации, потому что, когда вы приводите ui-> tabWidget-> widget (0); дает указатель на объект вкладки. Когда вы приводите это к QPlainTextEdit *, вы говорите своей программе обрабатывать часть памяти, которая не представляет QPlainTextEdit как QPlainTextEdit. Это вызывает проблемы в то время, когда вы вызываете w-> document (), потому что это находится в той области памяти, к которой он пытается получить доступ, не то, что он ожидал бы от памяти, которая принадлежит QPlainTextEdit.

0 голосов
/ 05 апреля 2010

Вы можете использовать qobject_cast, чтобы убедиться, что он возвращает правильный тип.

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

Возвращается 0, если тип не принадлежит QPlainTextEdit *.

Как уже говорилось, виджет (0), вероятно, не возвращает то, что вы хотели - и, вероятно, содержит контейнер или какой-то другой элемент, и, вероятно, это не тот способ, которым вы хотите получить доступ к вашим виджетам, если нет другого пути. *

0 голосов
/ 05 апреля 2010

Я почти уверен, что ui->tabWidget->widget(0) возвращает контейнерный виджет внутри tabWidget.Попробуйте qDebug() << ui->tabWidget->widget(0)->metaObject()->className() и посмотрите, что напечатано.Вероятно, это просто "QWidget", а не "QPlainTextEdit".Ваше редактирование находится внутри макета этого виджета

...