0

これは、qt 開発者にとって非常に単純な質問だと思います。

描画にqtを使用する非常に大きなコード(私は書いていません)があり、on_actionSomething_toggled(bool checked)幾何学的なものを描画するために作成したばかりです。

(そのメソッド内で)線を描く方法を教えていただければ幸いです。後でそれらの線で好きなものを描くことができます。

私はすでに試しました:

void 
MainWindow::on_actionSomething_toggled(bool checked){
  QPainter pa(this);
  pa.drawLine(20, 40, 250, 40);
}

しかし、それは言います:

QPainter::begin: Widget painting can only begin as a result of a paintEvent

したがって、メソッド内に単純な線を描画する方法を知りたいだけなのかon_actionSomething_toggled、それともすべて間違っているのか、この描画線機能を私が持っている大きなコード内に単純に追加するにはどうすればよいでしょうか。

4

3 に答える 3

2

警告メッセージが示すように、通常、QPainter でオブジェクトをペイントする適切なタイミングは、paintEvent() メソッド内からのみです。

したがって、やりたいことを行う通常の方法は次のとおりです。

1) 線を引きたいときは、それをしたいことを覚えておくためにメンバー変数を設定します (例: this->draw_the_line = true;)。

2) draw_the_line を新しい値に設定した後、線を描画したいウィジェットで update() を呼び出します。これにより、Qt はそのウィジェットで paintEvent() の呼び出しをできるだけ早くスケジュールするように指示されます。

3) ウィジェットの paintEvent() メソッドを次のように再実装します。

void MyWidgetSubclass :: paintEvent(QPaintEvent * e)
{
   TheWidgetSuperclass::paintEvent(e);  // this will draw the widget's usual graphics

   // Plus your custom stuff on top, if appropriate
   if (this->draw_the_line) 
   {
      QPainter p(this);
      p.drawLine(20,40,250,40);
   }
}

これを行うには、ウィジェットをサブクラス化する必要があることに注意してください (サブクラスに独自のバージョンの paintEvent() を実装できるようにするため、通常の paintEvent() メソッドの代わりに呼び出されます)。すでにそうしています。

于 2013-07-09T03:47:22.250 に答える
0

Graphics View Frameworkを使用する必要があります。内部で塗装を管理しています。スロットで行う必要があるのは、次のことだけです。

scene->addLine(20, 40, 250, 40);
于 2013-07-09T08:41:43.317 に答える
0

警告メッセージにあるように、ウィジェットでの描画は、ペイント イベント内からのみ行うことができます。

目的を達成する 1 つの方法は、最初にQPixmapにペイントし、更新通知をウィジェットに送信してから、ペイント イベント ハンドラーにそのピックスマップを描画させることです。

もう 1 つの (おそらくより簡単でエレガントな) 方法は、QPainterPathで描画操作を準備することです。次に、ウィジェットのペイント イベント ハンドラーでそれを描画します。

どちらの方法も、 QWidget::paintEvent(QPaintEvent*)をオーバーライドして独自のペイント イベント ハンドラーを実装していることを前提としています。

于 2013-07-09T03:49:05.350 に答える