来到这里小伙伴,应该已经知道它是干什么的吧,相当于当你指向图标时,给出你一些简要的提示信息。网上有类似资源,但可能无法立即执行,新入门的伙伴可以看看我的代码哈。
ctooltip.h
#ifndef CTOOLTIP_H
#define CTOOLTIP_H
#include
#include
#include
#include
#include
#include
class CToolTip : public QWidget
{
Q_OBJECT
public:
explicit CToolTip(QWidget *parent = 0);
void showMessage(const QPixmap *pixmap, QString name, QString info, QPoint point);
void showMessage(const QPixmap *pixmap, QPoint point);
signals:
public slots:
private:
QLabel *labelIcon;
QLabel *labelName;
QLabel *labelInfo;
QHBoxLayout *horLayout;
QVBoxLayout *verlayout;
QGroupBox *groupBox;
protected:
void hoverEvent(QHoverEvent *);
};
#endif // CTOOLTIP_H
ctooltip.cpp
#include "ctooltip.h"
#include
#include
#include
CToolTip::CToolTip(QWidget *parent) :
QWidget(parent)
{
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
this->resize(200, 100); ;
this->setObjectName("CToolTip");
this->setStyleSheet("QWidget#CToolTip {border: 2px solid green; background-color: skyblue;}");
groupBox = new QGroupBox(this);
groupBox->setGeometry(10, 10, 180, 80);
groupBox->setTitle("用户信息");
labelIcon = new QLabel(groupBox);
labelName = new QLabel(groupBox);
labelInfo = new QLabel(groupBox);
verlayout = new QVBoxLayout();
verlayout->setContentsMargins(0, 0, 0, 0);
verlayout->addWidget(labelName);
verlayout->addWidget(labelInfo);
horLayout = new QHBoxLayout(groupBox);
horLayout->setContentsMargins(10, 10, 10, 10);
horLayout->addWidget(labelIcon, 1, Qt::AlignTop);
horLayout->addLayout(verlayout, 4);
}
// 显示ToolTip消息
void CToolTip::showMessage(const QPixmap *pixmap, QString name, QString info, QPoint point) {
labelIcon->setPixmap(*pixmap);
labelName->setText(name);
labelInfo->setText(info);
// 重新定义CToolTip的坐标
int rectX;
int rectY;
if (point.rx() < 200) {
rectX = point.rx() + 10;
} else {
rectX = point.rx() - 240;
}
rectY = point.ry();
move(QPoint(rectX, rectY));
QWidget::show();
}
// 显示ToolTip消息
void CToolTip::showMessage(const QPixmap *pixmap, QPoint point) {
labelIcon->setPixmap(*pixmap);
labelName->setText("自己想办法获取");
labelInfo->setText("自己动手,丰衣足食");
// 此处可以作为QToolTip样式进行显示
move(point);
QWidget::show();
}
// 当鼠标进入事件时,让界面隐藏掉
void CToolTip::hoverEvent(QHoverEvent *) {
hide();
}
itemwidget.h
#ifndef ITEMWIDGET_H
#define ITEMWIDGET_H
#include
#include
#include
#include
#include
#include "ctooltip.h"
//class CLabel;
class ItemWidget : public QWidget
{
Q_OBJECT
public:
explicit ItemWidget(QWidget *parent = 0);
void setText(QPixmap pixmap, QString name, QString info);
void setText(QString info);
signals:
public slots:
void doprocessToolTip(CToolTip*);
private:
QLabel *labelIcon;
QLabel *labelName;
QLabel *labelInfo;
QHBoxLayout *horLayout;
QVBoxLayout *verlayout;
CToolTip *g_toolTip;
protected:
bool event(QEvent *e);
};
#endif // ITEMWIDGET_H
itemwidget.cpp
#include "itemwidget.h"
//#include "global.h"
#include
#include
#include
ItemWidget::ItemWidget(QWidget *parent) :
QWidget(parent)
{
labelIcon = new QLabel(this);
labelName = new QLabel(this);
labelName->setStyleSheet("QLabel{color: green; font: 13pt bold;}");
labelInfo = new QLabel(this);
labelInfo->setStyleSheet("QLabel{color: gray;}");
verlayout = new QVBoxLayout();
verlayout->setContentsMargins(0, 0, 0, 0);
verlayout->addWidget(labelName);
verlayout->addWidget(labelInfo);
horLayout = new QHBoxLayout(this);
horLayout->setContentsMargins(2, 2, 2, 2);
horLayout->addWidget(labelIcon, 1, Qt::AlignTop);
horLayout->addLayout(verlayout, 4);
}
void ItemWidget::setText(QPixmap pixmap, QString name, QString info) {
labelIcon->setPixmap(pixmap);
labelName->setText(name);
labelInfo->setText(info);
}
// 测试用的
void ItemWidget::setText(QString info) {
labelIcon->setText(info);
}
void ItemWidget::doprocessToolTip(CToolTip * tooltip)
{
g_toolTip=tooltip;
}
// 鼠标悬停的时候,显示当前用户简要信息
bool ItemWidget::event(QEvent *e) {
if (e->type() == QEvent::ToolTip) {
qDebug() << "tool tip show";
g_toolTip->showMessage(labelIcon->pixmap(),
labelName->text(),
labelInfo->text(),
QCursor::pos());
} else if (e->type() == QEvent::Leave) {
qDebug() << "tool tip leave";
g_toolTip->hide();
}
return QWidget::event(e);
}
此处注意为了让我们的工具类ctooltip 在mainwidegt和itemwidget使用同步,我们采用发送信号的方式
mainwidget.h
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include
#include "ctooltip.h"
class CToolTip;
namespace Ui {
class MainWidget;
}
class MainWidget : public QWidget
{
Q_OBJECT
public:
explicit MainWidget(QWidget *parent = 0);
~MainWidget();
signals:
void signalToolTip(CToolTip *);
private:
Ui::MainWidget *ui;
CToolTip *ctoolTip;
};
#endif // MAINWIDGET_H
mainwidget.cpp
#include "mainwidget.h"
#include "ui_mainwidget.h"
#include "itemwidget.h"
#include
//CToolTip *g_toolTip;
MainWidget::MainWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MainWidget)
{
// this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
ui->setupUi(this);
ctoolTip = new CToolTip();
// 定义全局的ToolTip,方便使用
//g_toolTip = ctoolTip;
// 本行代码主要针对ListWidgetItem右键点击时才生效的
ui->listWidget->setMouseTracking(true);
// 添加测试数据
for (int i = 0; i < 10; i++) {
ItemWidget *itemWidget = new ItemWidget(ui->listWidget);
connect(this,SIGNAL(signalToolTip(CToolTip*)),itemWidget,SLOT(doprocessToolTip(CToolTip*)));
emit signalToolTip(ctoolTip);
itemWidget->setText(QPixmap(QString(":/images/1.jpg")),
QString("标题"), QString("写点什么呢: %1?").arg(i));
QListWidgetItem *listItem = new QListWidgetItem(ui->listWidget);
// 此处的size如果不设置,界面被压缩了看不出ItemWidget的效果,高度一定要设置
listItem->setSizeHint(QSize(200, 40));
ui->listWidget->setItemWidget(listItem, itemWidget);
}
}
MainWidget::~MainWidget()
{
delete ui;
}