方法一
在Demo编写期间需要对头像显示控件进行特殊处理,使其显示为圆形并且能够响应鼠标点击事件,就类似于PC端QQ点击头像。因此就需要通过继承QLabel类并重写其paintEvent和event函数来实现控件自定义。
MaskLabel.h
1. #ifndef MASKLABEL_H
2. #define MASKLABEL_H
3.
4. #include <QLabel>
5. #include <QPainter>
6. #include <QMouseEvent>
7.
8. class MaskLabel : public QLabel
9. {
10. Q_OBJECT
11.
12. public:
13. MaskLabel(QWidget *parent = Q_NULLPTR);
14. ~MaskLabel();
15.
16. protected:
17. void paintEvent(QPaintEvent *);
18.
19. virtual bool event(QEvent *e);
20.
21. private:
22.
23. };
24.
25. #endif // !MASKLABEL_H
MaskLabel.cpp
1. #include "MaskLabel.h"
2. #include "QObject"
3. #include "SettingDialog.h"
4. #include "SkypeDemo.h"
5.
6. MaskLabel::MaskLabel(QWidget *parent)
7. : QLabel(parent)
8. {
9. }
10.
11. MaskLabel::~MaskLabel()
12. {
13. }
14.
15. void MaskLabel::paintEvent(QPaintEvent *e)
16. {
17. if (pixmap())
18. {
19. QPainter painter(this);
20. // 设置抗锯齿
21. painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
22. QPainterPath path;
23. int round = qMin(width(), height());
24. path.addEllipse(0, 0, round, round);
25. // 剪裁
26. painter.setClipPath(path);
27. painter.drawPixmap(0, 0, width(), height(), *pixmap());
28. }
29. else
30. {
31. QLabel::paintEvent(e);
32. }
33. }
34.
35. bool MaskLabel::event(QEvent *e)
36. {
37. if (e->type() == QEvent::MouseButtonPress)
38. {
39. QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(e);
40. if (mouseEvent->button() == Qt::LeftButton)
41. {
42. // getDlg返回的是设置对话框指针
43. int res = (dynamic_cast<SkypeDemo*>(parentWidget()))->getDlg()->exec();
44. return true;
45. }
46. }
47.
48. return QLabel::event(e);
49. }
方法二
如果只是希望给QLabel添加一个点击事件的话,也可以通过事件过滤器的方式实现。首先安装事件过滤器。
1. m_pTestLabel = new QLabel(this);
2. m_pTestLabel->installEventFilter(this);
在事件过滤器实现函数中增加相关操作。
1. bool SkypeDemo::eventFilter(QObject *watched, QEvent *event)
2. {
3. if (watched == m_pTestLabel)
4. {
5. if (event->type() == QEvent::MouseButtonPress)
6. {
7. m_settingDialog->exec();
8. }
9. }
10. return SkypeDemo::eventFilter(watched,event);
11. }
除以上方式外,还可以通过主动发送信号的方式,连接信号和槽进行实现。