/
xytooltips.cpp
107 lines (92 loc) · 2.31 KB
/
xytooltips.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "xytooltips.h"
#include <QPainter>
#include <QApplication>
#include <QDesktopWidget>
#include <QTimer>
XYToolTips *XYToolTips::mopInstance = NULL;
XYToolTips::XYToolTips(QWidget *parent)
: XYBorderShadowWidget(parent)
{
this->setWindowFlags(Qt::FramelessWindowHint
| Qt::WindowStaysOnTopHint
| Qt::Tool);
#if QT_VERSION >= 0x050000
this->setWindowFlags(this->windowFlags() | Qt::WindowDoesNotAcceptFocus);
#endif
moTimer.setInterval(2000);
moTimer.setSingleShot(true);
connect(&moTimer, SIGNAL(timeout()), this, SLOT(close()));
setFocus();
}
XYToolTips::~XYToolTips()
{
}
XYToolTips *XYToolTips::getInstance()
{
if (mopInstance == NULL)
{
mopInstance = new XYToolTips;
}
return mopInstance;
}
void XYToolTips::showToolTips(const QString &tooltips)
{
QPoint pos = QCursor::pos();
showToolTips(tooltips, pos);
}
void XYToolTips::showToolTips(const QString &tooltips, const QPoint &pos)
{
if (tooltips.trimmed().isEmpty())
{
return;
}
XYToolTips *toolwd = getInstance();
if (!toolwd->isHidden())
{
toolwd->close();
}
toolwd->msToolTips = tooltips;
QFontMetrics metrics(qApp->font());
int w = metrics.width(tooltips) + 25;
int h = metrics.height() + 25;
toolwd->show();
QDesktopWidget *top = QApplication::desktop();
QPoint f_pos = pos;
if (top->width() < w + f_pos.x())
{
f_pos.setX(top->width() - w - 5);
}
if (top->height() < h + f_pos.y())
{
f_pos.setY(top->height() - h - 5);
}
toolwd->move(f_pos);
toolwd->moTimer.start();
}
bool XYToolTips::close()
{
moTimer.stop();
return QWidget::close();
}
void XYToolTips::paintEvent(QPaintEvent *event)
{
QFontMetrics metrics(qApp->font());
int w = metrics.width(msToolTips);
int h = metrics.height();
this->setFixedSize(w + 30, h + 30);
XYBorderShadowWidget::paintEvent(event);
QPainter painter(this);
painter.drawText(QRect( (width() - w) / 2,
(height() - h) / 2,
width(),
height()),
msToolTips);
}
void XYToolTips::focusOutEvent(QFocusEvent *event)
{
close();
}
void XYToolTips::clicked(const QPoint &point)
{
focusOutEvent(NULL);
}