QT がコントロール (QLabel、Button、QWidget など) を描画する方法

方法 1:

イベントフィルタリングメカニズムを使用する

イベントフィルター:

2 つの関数で構成される操作。コンポーネントから他のコンポーネントへのイベント監視を完了するために使用されます。2 つの関数は installEventFilter(); です。

eventsFilter(QObject *obj, QEvent *ev)

すべては QObject クラスの関数です。

使い方:

1 つ目、ui->paint_widget (サブコントロール名)->installEventFilter(this); // イベント フィルターをインストールします   

次に、.h を追加します。

bool eventFilter(QObject *watched, QEvent *event);

3、.cpp で実装する

bool Form2::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->widget && event->type() == QEvent::Paint)//发生绘图事件,且是在widget上发生的
        {

        QPainter painter(ui->widget);

        // 设置画笔样式
        QPen pen(Qt::red);
        pen.setWidth(3);
        painter.setPen(pen);

        // 绘制圆形
        QRectF rectangle(10.0, 20.0, 80.0, 80.0);    // 圆形所在矩形位置和大小
        painter.drawEllipse(rectangle);

        return true;
        }
    else
        return false;

}

第四に、使用の前提に注意してください。

event->type() == QEvent::Paint が描画イベントを判断します

したがって、有効にするには描画イベントを呼び出す必要があります

void Form2::paintEvent(QPaintEvent *)
{
    // 创建QPainter对象并在其中进行绘图
        QPainter painter(ui->widget);

        // 设置画笔样式
        QPen pen(Qt::red);
        pen.setWidth(3);
        painter.setPen(pen);

        // 绘制圆形
        QRectF rectangle(10.0, 20.0, 80.0, 80.0);    // 圆形所在矩形位置和大小
        painter.drawEllipse(rectangle);
}

要約: 上記から、描画イベントの実装コードはイベント フィルターの実装コードと同じであるため、関数にカプセル化できることがわかります。したがって、この方法は次のように要約できます。

bool 类名::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->paint_widget && event->type() == QEvent::Paint)
    {
        Fun(想要绘图的指针名); //响应函数
    }
    return QWidget::eventFilter(watched,event);
}

//实现响应函数
void 类名::Fun(想要绘图的控件或窗口的类名 * 指针名)
{
   xxxxxxxxxxxxxxxxxx;
}


void 类名::paintEvent(QPaintEvent *)
{
    Fun(想要绘图的指针名);
}

例:フォームウィンドウにウィジェット(赤枠部分)を描画する場合

 

効果:

 

 

 

方法 2:

自分でクラスを定義し、描画を実現したいコントロールクラスを継承させる

例えば:

QWidgetを継承したMyWidgetクラスを定義し、このクラス内のpaintEvent(QPaintEvent *)関数を書き換えて描画します。次に、UI インターフェイスで対応する QWidget を MyWidget にアップグレードします。

おすすめ

転載: blog.csdn.net/qq_58136559/article/details/130458427