方法 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 にアップグレードします。