【问题标题】:QPlainTextEdit segmentation faultQPlainTextEdit 分段错误
【发布时间】:2010-04-05 09:59:26
【问题描述】:

我在 Tab 小部件中有一些带有 QPlainTextEdit 的 Qt 应用程序。当尝试在它上面做一个指针时

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

并调用 document() 方法

w->document()

我得到一个段错误。

但是如果我直接调用文档,例如ui->mainEdit->document(),然后一切正常。

谁能解释一下为什么会这样?

【问题讨论】:

  • 我猜 tabWidget->widget(0) 返回 NULL。您确定在 tabWidget 填充了适当的内容之后执行“w = ...”吗?

标签: qt segmentation-fault


【解决方案1】:

你想做的事:

QPlainTextEdit *w = ui->mainEdit;

然后 w->document() 将返回你想要的。您遇到分段错误,因为当您投射 ui->tabWidget->widget(0);给出一个标签页对象的指针。当您将此转换为 QPlainTextEdit* 时,会告诉您的程序将不代表 QPlainTextEdit 的内存部分视为 QPlainTextEdit。这会在您调用 w->document() 时引起麻烦,因为它位于它尝试访问的内存位置中,而不是它对属于 QPlainTextEdit 的内存的期望。

【讨论】:

    【解决方案2】:

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

    ​​>

    【讨论】:

      【解决方案3】:

      您可以使用 qobject_cast 来确保它返回正确的类型。

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

      如果类型不是 QPlainTextEdit*,则返回 0。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-01
        • 2014-06-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多