文章目录
- 1. 代码实现
- 头文件部分
- cpp文件部分
- 2. 事件函数
- 参考博客
😊点此到文末惊喜↩︎
1. 代码实现
头文件部分
#include <QWidget>
#include <QPainter>
namespace Ui {
class widget_2_1;
}
class widget_2_1 : public QWidget
{
Q_OBJECT
public:
explicit widget_2_1(QWidget *parent = nullptr);
~widget_2_1();
void resizeEvent(QResizeEvent *event);
bool eventFilter(QObject *obj, QEvent *event);
void paintEvent(QPaintEvent *);
private:
//void set_wg2_1_background();
protected:
Ui::widget_2_1 *ui;
protected:
void keyPressEvent(QKeyEvent *event);
};
cpp文件部分
// 绘制事件实现widget上绘制一条直线
void widget_2_1::paintEvent(QPaintEvent *)
{
QPainter painter(this); // 这个this很重要
painter.drawLine(80, 100, 650, 500);
}
bool widget_2_1::eventFilter(QObject *obj, QEvent *event)
{
//1.在构造函数中,调用 installEventFilter()注册监视对象
/*例子:
zoomCheckBox->installEventFilter(this);
*/
//2.在监视对象的eventFilter()函数中处理目标对象的事件。
//如果对象是zoomCheckBox,当鼠标进入(悬停)其上,则zoomTips显示
if (obj == (QObject*)ui->zoomCheckBox)
{
if (event->type() == QEvent::Enter)
{
ui->zoomTips->setVisible(true);
}
else if(event->type() == QEvent::Leave)
{
ui->zoomTips->setVisible(false);
}
return false;
}
}
2. 事件函数
void resizeEvent(QResizeEvent *event);
- 作用:导致窗口发生大小变化或绘制变化的事件产生时会被调用,进行相应的重写和控件调整,避免错误的显示
- 触发paintEvent事件
- 窗口大小(重新调整)改变,或者重新排布(布局)导致重画
- 调用update 或者 repaint重画
- 当窗口第一次显示时,系统会自动产生绘图事件
- 当窗口部件被其他部件遮挡时,然后又再次显示出来,会对隐藏区域进行重绘事件
bool eventFilter(QObject *obj, QEvent *event);
- 作用:事件过滤器,将原本应该直接发送给组件对象的事件,先发送给过滤器对象,经过过滤后再发送给组件对象
- 实例如上,控件在构造函数中注册,在该事件过滤器函数中处理注册的控件的消息
void paintEvent(QPaintEvent *);// 绘制事件
- 作用:用来重绘一个部件的全部或者部分区域
- 重绘事件的触发:
- repaint()函数或者update()函数被调用
- 被隐藏的部件现在被重新显示
- 其他原因
- 绘制的优化
- 当update()函数被调用多次,或者窗口系统发送了多个重绘事件,那么Qt就会合并这些事件成为一个事件。可能多个事件只调用一次绘制函数
- update()函数允许Qt优化速度和减少闪烁,但是repaint()函数不支持这样的优化,所以建议一般情况下尽可能使用update()函数。
- 在程序开始运行时就会自动发送重绘事件而调用paintEvent()函数
- 不要在paintEvent()函数中调用update()或者repaint()函数
- 当重绘事件发生时,要更新的区域一般会被擦除,然后在部件的背景上进行绘制
🚩点此跳转到首行↩︎
参考博客
- resizeEvent , paintEvent事件触发原因
- Qt 事件过滤器 - EventFilter
- QT关键问题解决之paintevent理解
- 待定引用