QT 在 TabWidget 中绘图
绘图事件
QT中当窗口产生变化时会自动调用绘图事件 QEvent::Paint(如:窗口第一次显示、窗口放大缩小……)
继承绘图
继承绘图是利用 widget 实现。
1、创建自己的 widget 类
.h文件
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QRect>
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
void paintEvent(QPaintEvent *event) override;
signals:
};
#endif // MYWIDGET_H
.cpp文件
#include "mywidget.h"
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
}
void MyWidget::paintEvent(QPaintEvent *event){
QPainter painter(this);
QPen pen;
pen.setColor(Qt::red);
painter.setPen(pen);
painter.drawRect(10,10,100,200);
}
2、将自己创建的 widget 插入进 Tabwidget 中
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
MyWidget *widget = new MyWidget();
ui->tabWidget->addTab(widget,"red");
}
3、在组件中画出图形
事件过滤器
事件过滤器提供了一个在系统处理事件之前的机会。
bool eventFilter(QObject *watched, QEvent *event)
事件过滤器绘图
通过实践过滤器绘图就好比我们自己处理了事件,越过了事件分发器。
1、过滤器和画图函数
bool MainWindow::eventFilter(QObject *watched, QEvent *event){//事件过滤器
if(event->type()==QEvent::Paint){//过滤出绘图事件
if(ui->tab1==ui->tabWidget->currentWidget()){//tab1是否为当前页
drawRect(ui->PointMap);//画矩形
}else if(ui->tab2==ui->tabWidget->currentWidget()){
drawCircle(ui->ShortesPath);//画圆形
}
return true;//绘图事件已经截获 无需继续处理
}
return QMainWindow::eventFilter(watched,event);//剩余事件交还系统
}
void MainWindow::drawRect(QWidget *widget){//绘制黄色长方形
QPainter painter(widget);//设置绘画器
QPen pen;//设置笔
pen.setColor(Qt::yellow);
painter.setPen(pen);
painter.drawRect(10,10,100,200);//画出矩形
}
void MainWindow::drawCircle(QWidget *widget){//绘制蓝色圆
QPainter painter(widget);
QPen pen;
pen.setColor(Qt::blue);
painter.setPen(pen);
painter.drawEllipse(10,10,200,200);
}
注意:使用 eventFliter 时需要先将过滤器安装
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->tab1->installEventFilter(this);
ui->tab2->installEventFilter(this);
}