2

Code Completer を実行したいので、QCompleter をサブクラス化しました。

http://hastebin.com/qyumevisa.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 に aQCompleterが設定されている 場合に自動的に呼び出されます。カスタム ウィジェットの補完を提供する場合は、ウィジェットを明示的に設定する必要があります。QLineEditQLineEdit::setCompleter()QComboBoxQComboBox::setCompleter()

したがって、ウィジェットは byQCompleter::setWidget()または byのいずれかで設定する必要がありますQLineEdit::setCompleter()。これらのオプションが使用されてQCompleter::complete(rect)いない場合、補完モードが でないと関数がクラッシュしますQCompleter::InlineCompletion

したがって、クラッシュには 2 つの可能性があります。

  • d->widget呼び出す前に初期化されていませんQCompleter::complete(rect);
  • d->widgetあるため、参照されたオブジェクトが破棄QPointerされると、自動的に 0 に設定されます。QWidget
于 2015-09-21T19:51:29.587 に答える