2

我想做一个代码完成器,所以我将 QCompleter 子类化:

http://hastebin.com/qeyumevisa.cpp

但是,当我尝试运行此代码时,出现运行时错误:

运行时错误

调试输出显示:

ASSERT: "d->widget != 0" in file util\qcompleter.cpp, line 1446

崩溃似乎来自第 53 行:

QCompleter::complete(rect);

我怎样才能修复这个错误?谢谢

4

1 回答 1

2

断言是从QCompleter::complete(rect);

这意味着它QCompleter::widget()为零。私有成员d->widget始终初始化为零。它的类型是QPointer<QWidget>. 小部件仅由 设置QCompleter::setWidget(QWidget *widget)。根据文档QCompleter::setWidget(QWidget *widget)

将为其提供完成的小部件设置为小部件。当在using或 using 上设置 QCompletera 时,会自动调用此函数。为自定义小部件提供补全时,需要显式设置小部件。QLineEditQLineEdit::setCompleter()QComboBoxQComboBox::setCompleter()

因此,小部件必须由QCompleter::setWidget()或设置QLineEdit::setCompleter()。如果没有使用这些选项,则QCompleter::complete(rect)如果完成模式不是,则函数会崩溃QCompleter::InlineCompletion

所以,崩溃有两种可能:

  • d->widget调用前未初始化QCompleter::complete(rect);
  • 因为d->widget是a ,当引用的对象被销毁QPointer时,它可以自动设置为0 。QWidget
于 2015-09-21T19:51:29.587 回答