1

私は冷蔵庫の磁石の例を研究して修正していますが、最後にやろうとしたことは、背景にあるはずのラベルと線をいくつか描くことでした.

ラベルと線を描画する方法を見つけようとして周りを見回した後、QWidget の paintEvent() をオーバーライドしてそれを実行できることを知りました。しかし、それを行った後、アプリケーションが遅くなり、一見無限ループで paintEvent() が呼び出されていたことが原因であることがわかりました。

それを修正する方法を見つけようとして、ラベルと線を描画するコードをクラスのコンストラクターに移動しました。ただし、アプリケーションに描かれたのはラベルだけです。その後、ラベルはコンストラクターに残しましたが、線を描画するコードを paintEvent() に戻しました。それは機能し、線は期待どおりに描画され、paintEvent() は物をドラッグしたときにのみ呼び出されました。

コンストラクターで線が描画されないのはなぜですか? また、paintEvent() が無限ループに入ったのはなぜですか?

ラベルと線を描画するスニペットは次のとおりです。

QPen pen(Qt::lightGray, 0, Qt::SolidLine, Qt::SquareCap, Qt::RoundJoin);
QPainter paint(this);
paint.setPen(pen);
int scale = 20;
for(int x=0; x<25; x++){
    QString timetext= "0"+QString::number(x)+":00";
    QLabel *time= new QLabel(timetext,this);
    time->move(x*scale,2);
    time->show();
    paint.drawLine(x*scale,12,x*scale,400);
}
4

2 に答える 2

10

中にオブジェクトをウィジェットツリーに追加しpaintEvent()ます。それは失敗したと見なされます。Damage&drawingのQtスケジューラーは、新しい子を描画する必要があることを確認し、それを管理しようとします。ループが発生する可能性があります。paintEvent()をオーバーライドする場合は、すべてのペイントを同じオブジェクトで実行してください。黄金律:paintEvent()絵だけです!オブジェクトなどを作成するためのものではありません。

このようにしてください:

QFont font(painter.font());
font.setBold(true);
painter.setFont(font);
painter.fillRect(rect(), Qt::black);
painter.setPen(Qt::white);
painter.drawText(rect(), Qt::AlignCenter, tr("White text on dark background. Awesome."));
于 2010-02-25T14:38:01.657 に答える
2

コンストラクターで線が描画されなかったのはなぜですか?

それらはあったと思いますが、次の paintEvent() の呼び出しによって「消去」され、線を描画しなくなりました...

paintEvent() が無限ループに入ったのはなぜですか?

あなたの time->show(); に関連している可能性があると思います。これはpaintEventが呼び出されるたびに25回呼び出されます...それについてはわかりませんが、ウィジェットが親として「show」を呼び出すと、親で「show」が呼び出され、paintEventがトリガーされる可能性があります。 ... 私の言っていることが分かるよね...

イプノスが解決策を提供してくれたので、彼に紹介します:)

于 2010-02-25T14:43:48.857 に答える