1

わかりましたので、Qt のドラッグ アンド ドロップ部分を使用して UI を作成し、Ui で別の「タブ ウィジェット」内に「タブ ウィジェット」を作成しました。さて、2番目のタブウィジェット内でフレームを作成しました

私の質問は、Qt でこのフレームの上に描画するにはどうすればよいですか?

私はこれを試しましたが、まったく運がありませんでした。これについてさまざまな方法を試してみましたが、プログラムはうまく動作しますが、フレームが描画されているかどうかを確認すると、何も表示されません...コード例とすべてでこれを手伝ってください。前もって感謝します。

void 2ndMainWindow::paintEvent(QPaintEvent *e)
{
    QPainter paint(ui->rightTriangle_frame);
    paint.drawEllipse(10,10,100,100);
    paint.setPen(Qt::red);


    paint.end();
}

知りたい他の人のために私が最終的にやった方法

私のヘッダーファイルには、プライベートスロットの下にこれが含まれていました

    Ui::GeometryMainWindow *ui;

    QGraphicsScene *scene;
    QGraphicsEllipseItem *ellipse;
    QGraphicsRectItem *rectangle;

私の.cppファイルで私はこれをしました

    ui->setupUi(this);

    scene = new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);

    QBrush redBrush(Qt::red);
    QBrush blueBrush(Qt::blue);
    QPen blackpen(Qt::black);
    blackpen.setWidth(6);

    ellipse = scene->addEllipse(10,10,100,100,blackpen,redBrush);
4

2 に答える 2

2

QFrame でカスタマイズされた図形を描画する場合は、QFrame の代わりに QGraphicsView を使用することをお勧めします。ウィジェットの paintEvent を実装すると、パフォーマンスの問題が発生する可能性があります。QGraphicsView を使用する場合、QGraphicsScene を作成し、そのシーンにアイテムを追加できます。これは、この種の作業を行う一般的で受け入れられている方法です。

または、以下のように eventFilter を実装します。

bool 2ndMainWindow::eventFilter(QObject *o, QEvent *e)
{
    if (e->type() == QEvent::Paint) {
    paintEvent((QPaintEvent *)e);
}
    return QMainWindow::eventFilter(o, e);
}

メインウィンドウのコンストラクターで、

installEventFilter(this);

ちなみに、paintEvent 関数で楕円を描く前に、ペンを設定する必要があります。

于 2012-12-21T13:11:32.937 に答える
1

メインウィンドウpaintEvent()のメソッドをオーバーライドし、そこからフレームウィジェットにペイントしようとしているようです。コンソールの出力を見てください-次のようなメッセージが表示されるはずです

QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setPen: Painter not active
QPainter::end: Painter not active, aborted

代わりに、QFrameウィジェットをサブクラス化し(Qtデザイナーで[Promote to ...]を選択してユーザー定義のサブクラスを定義します)、このサブクラスで次のpaintEventようにオーバーライドします。

void MyFrame::paintEvent(QPaintEvent *e) {
    QPainter paint(this);
    paint.setPen(Qt::red);
    paint.drawEllipse(10,10,100,100);

    paint.end();
    QFrame::paintEvent(e);
}

もちろん、赤い楕円を描くには、楕円を描く前にペンの色を設定する必要があります。paintEvent()フレームの境界線を描画するには、親クラスのメソッドも呼び出す必要があります。

SSCCEについては、https://github.com/afester/StackOverflow/tree/master/QtRepaintを参照してください。

于 2012-12-20T20:48:47.983 に答える