2016-03-27 25 views
0

これについてインターネット上で多くの資料を見てきましたが、必要なものが見つかりませんでした。私はQtで再利用可能なペイント機能を作りたいです。たとえば、私はループで呼び出すことができ、x座標とy座標で始まる矩形を描く関数Qt - カスタム引数を使用した再利用可能なペイント関数

void paintRectangle(QPaintEvent*, int x, int y); 

関数を持っています。これは可能ですか?どのように書くべきか、準備ができたらループにどのように呼び出せるのかについて、ドラフト/アウトラインを書き留めておいてください。私は本当にこれで何も見つかりませんでした。また、私はこの関数をどのように呼びますか?私は電話するときにQPaintEvent *の代わりに何を書いていますか?

私が気づいたように、painteventsはクラスコンストラクタの前に呼び出されます。これは正しいです?私は特定のクラスがインスタンス化されるときに宣言されているn変数に依存する、画面上に一定量の長方形を持っていたいと思います。私の現在の試行のとき、私のfuctionが何かをペイントしようとしたときにnが定義されていないようでした。

+0

* * =>を呼び出すときに 'QPaintEvent *'の代わりに書くものあなたは[QPainter](http://doc.qt.io/qt-5/qpainter.html) 。 * "私が気づいたように、クラスのコンストラクタの前にpainteventsが呼び出されますが、これは正しいですか?" *どのクラスコンストラクタですか?質問する前にいくつかのチュートリアルを実行し、コードの具体的な質問(例えば[MCVE](http://stackoverflow.com/help/mcve))を持っているようです。チュートリアルはこちら:http://doc.qt.io/qt-5/examples-painting.html – HostileFork

答えて

1

唯一の制限は、ウィジェットをペイントするときに、そのウィジェットのペイントイベントで発生する必要があることです。あなたのペイントデバイスがウィジェットでない場合、それは問題ではありません。

これ以外にも、任意の数のペイント関数を何回でも呼び出せないようにするには何もありません。ウィジェットの場合は、そのウィジェットのペイントで呼び出されるようにしてくださいイベント。例えば:私が気づいてきたよう

void paintEvent(QPaintEvent *) { 
    QPainter p(this); 
    // setup painter 
    for (int i = 0; i < 200; i += 10) drawFoo(i, p); 
} 

void drawFoo(int i, QPainter & p) { 
    p.drawPoint(i, i); 
} 

、painteventsは、任意のクラスのコンストラクタの前に呼び出されます。 これが正しいですか?

どこに気付きましたか?私はウィジェットが構成される前に描画されることを非常に疑っています;あなたの心配は根拠がなく、構築前にウィジェットがペイントされていません。実際には、show()に電話しないとウィジェットをペイントせずに作成できます。コンストラクタとペイントイベントにデバッグメッセージを挿入すると、コンストラクタは常にペイントイベントの前に実行されます。実際には、完全に構築されていないオブジェクトのメンバ関数を呼び出すことは、完全に「違法」となります。

+0

*あなたのペイントデバイスがウィジェットでない場合、問題はありません。それ以外に、あなたが望む任意のパラメータを何回でも何度でもペイント関数をいくつでも呼び出すことを妨げるものはありません。* - スレッドに関するいくつかの制約があります(http://stackoverflow.com/a/19801659/ 211160)、あなたがすることができないことは、時間の経過とともに徐々に減少するようです。 – HostileFork

+0

@HostileFork - この制限/制限は 'QPainter'とは関係なく' QPixmap'です。私は、マルチスレッドは質問の文脈にあるとは思わないが、誰が知っている、それは少し暗いです。 – dtech

+0

私が提供したリンクが説明しているように、スレッドの問題はそれよりも歴史的に広いです。 [QFontDatabase :: supportsThreadedFontRendering](http://doc.qt.io/qt-4.8/qfontdatabase.html#supportsThreadedFontRendering)とドキュメントのステートメントを考えてみましょう:* "戻り値falseは、すべてのQPainter :: drawText )呼び出しはGUIスレッドの外では読み込み可能な出力を生成しません」*ここにはあなたを噛んだり、出てくるビットが少しあります。 – HostileFork

関連する問題