#include <QApplication>
#include <QGraphicsItem>
#include <QGraphicsRectItem>
#include <QGraphicsScene>
#include <QGraphicsSceneHoverEvent>
#include <QGraphicsTextItem>
#include <QGraphicsView>
#include <QMainWindow>
#include <QPainter>
#include <QPointF>
#include <QRectF>
#include <QSizeF>
#include <QString>
#include <QStyleOptionGraphicsItem>
public:
ToolTipItem(const QString& text)
{
setAcceptHoverEvents(true);
}
virtual ~ToolTipItem(void) {}
virtual QRectF boundingRect
(void) const { qreal d = BORDER_WIDTH / 2;
rect.adjust(-d, -d, d, d);
return rect;
}
virtual void paint(
{
// Draw surrounding box
painter
->setPen
(QPen(BORDER_COLOR, BORDER_WIDTH
));
painter
->setBrush
(QBrush(BACKGROUND_COLOR
));
painter->drawRect(rect);
// Draw text content
painter
->translate
(QPointF(MARGIN, MARGIN
));
}
path.addRect(boundingRect());
return path;
}
rect.adjust(0, 0, 2*MARGIN, 2*MARGIN);
return rect.size();
}
item->mapToScene(item->boundingRect().topLeft());
qreal x_pos = item_point_in_scene.x() - boundingRect().size().width()
+ 1.5 * BORDER_WIDTH;
qreal y_pos = item_point_in_scene.y() + BORDER_WIDTH / 2;
QPointF tooltip_point_in_scene
(x_pos, y_pos
);
setPos(tooltip_point_in_scene);
}
protected:
static const QColor BACKGROUND_COLOR;
static const qreal MARGIN;
static const qreal BORDER_WIDTH;
static const QColor BORDER_COLOR;
};
const QColor ToolTipItem
::BACKGROUND_COLOR(Qt
::white);
const qreal ToolTipItem::MARGIN = 5;
const qreal ToolTipItem::BORDER_WIDTH = 1;
const QColor ToolTipItem
::BORDER_COLOR(Qt
::black);
public:
MyItem(qreal x, qreal y, qreal width, qreal height,
tooltip_(NULL)
{
setAcceptHoverEvents(true);
}
virtual ~MyItem(void) {}
protected:
event->accept();
if (!tooltip_) {
tooltip_ = new ToolTipItem("bla bla bla\nfadsf asdf\nfdasdfas");
tooltip_->placeNextTo(this);
scene()->addItem(tooltip_);
}
tooltip_->show();
}
event->accept();
if (tooltip_) tooltip_->hide();
}
private:
ToolTipItem* tooltip_;
};
int main(int argc, char** argv) {
MyItem* item1 = new MyItem(0, 0, 50, 50);
MyItem* item2 = new MyItem(20, 10, 10, 10, item1);
MyItem* item3 = new MyItem(20, 20, 10, 10, item2);
scene->addItem(item1);
view
->setRenderHint
(QPainter::Antialiasing);
window.setCentralWidget(view);
window.show();
return app.exec();
}
#include <QApplication>
#include <QGraphicsItem>
#include <QGraphicsRectItem>
#include <QGraphicsScene>
#include <QGraphicsSceneHoverEvent>
#include <QGraphicsTextItem>
#include <QGraphicsView>
#include <QMainWindow>
#include <QPainter>
#include <QPointF>
#include <QRectF>
#include <QSizeF>
#include <QString>
#include <QStyleOptionGraphicsItem>
class ToolTipItem : public QGraphicsTextItem {
public:
ToolTipItem(const QString& text)
: QGraphicsTextItem(text, 0)
{
setAcceptHoverEvents(true);
}
virtual ~ToolTipItem(void) {}
virtual QRectF boundingRect(void) const {
QRectF rect(QPointF(0, 0), getSize());
qreal d = BORDER_WIDTH / 2;
rect.adjust(-d, -d, d, d);
return rect;
}
virtual void paint(
QPainter* painter,
const QStyleOptionGraphicsItem* option,
QWidget* widget)
{
// Draw surrounding box
painter->setPen(QPen(BORDER_COLOR, BORDER_WIDTH));
painter->setBrush(QBrush(BACKGROUND_COLOR));
QRectF rect(QPointF(0, 0), getSize());
painter->drawRect(rect);
// Draw text content
painter->translate(QPointF(MARGIN, MARGIN));
QGraphicsTextItem::paint(painter, option, widget);
}
virtual QPainterPath shape(void) const {
QPainterPath path;
path.addRect(boundingRect());
return path;
}
QSizeF getSize(void) const {
QRectF rect(QGraphicsTextItem::boundingRect());
rect.adjust(0, 0, 2*MARGIN, 2*MARGIN);
return rect.size();
}
void placeNextTo(QGraphicsItem* item) {
QPointF item_point_in_scene =
item->mapToScene(item->boundingRect().topLeft());
qreal x_pos = item_point_in_scene.x() - boundingRect().size().width()
+ 1.5 * BORDER_WIDTH;
qreal y_pos = item_point_in_scene.y() + BORDER_WIDTH / 2;
QPointF tooltip_point_in_scene(x_pos, y_pos);
setPos(tooltip_point_in_scene);
}
protected:
static const QColor BACKGROUND_COLOR;
static const qreal MARGIN;
static const qreal BORDER_WIDTH;
static const QColor BORDER_COLOR;
};
const QColor ToolTipItem::BACKGROUND_COLOR(Qt::white);
const qreal ToolTipItem::MARGIN = 5;
const qreal ToolTipItem::BORDER_WIDTH = 1;
const QColor ToolTipItem::BORDER_COLOR(Qt::black);
class MyItem : public QGraphicsRectItem {
public:
MyItem(qreal x, qreal y, qreal width, qreal height,
QGraphicsItem* parent = 0)
: QGraphicsRectItem(x, y, width, height, parent),
tooltip_(NULL)
{
setAcceptHoverEvents(true);
}
virtual ~MyItem(void) {}
protected:
virtual void hoverEnterEvent(QGraphicsSceneHoverEvent* event) {
event->accept();
if (!tooltip_) {
tooltip_ = new ToolTipItem("bla bla bla\nfadsf asdf\nfdasdfas");
tooltip_->placeNextTo(this);
scene()->addItem(tooltip_);
}
tooltip_->show();
}
virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) {
event->accept();
if (tooltip_) tooltip_->hide();
}
private:
ToolTipItem* tooltip_;
};
int main(int argc, char** argv) {
QApplication app(argc, argv);
QGraphicsScene* scene = new QGraphicsScene;
MyItem* item1 = new MyItem(0, 0, 50, 50);
MyItem* item2 = new MyItem(20, 10, 10, 10, item1);
MyItem* item3 = new MyItem(20, 20, 10, 10, item2);
scene->addItem(item1);
QGraphicsView* view = new QGraphicsView(scene);
view->setRenderHint(QPainter::Antialiasing);
QMainWindow window;
window.setCentralWidget(view);
window.show();
return app.exec();
}
To copy to clipboard, switch view to plain text mode
Bookmarks