1. 程式人生 > >Qt5製作滑鼠懸停顯示Hint的ToolTip

Qt5製作滑鼠懸停顯示Hint的ToolTip

在日常生活中的使用的軟體中,我們經常會遇到這樣的情況。
我們在網頁上,有些網頁連結的文字(比如文章標題,知乎問題標題,百度的詞條等)因為太長了,而顯示不出來,但是滑鼠懸停在上面的時候就可以顯示出來。
我們在QQ上或者某些輸入框內,我們不知道應該輸入什麼內容,但是滑鼠如果懸停在輸入框內的時候,會產生一個友好資訊的hint。
實現方法,就是我們今天的ToolTip設定。

程式碼如下:
ItemWidget.h

#ifndef ITEMWIDGET_H
#define ITEMWIDGET_H

#include <QWidget>
#include <QLabel>
#include <QPushButton> #include <QVBoxLayout> #include <QHBoxLayout> //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: private: QLabel *labelIcon; QLabel *labelName; QLabel *labelInfo; QHBoxLayout *horLayout; QVBoxLayout *verlayout; protected: bool event(QEvent *e); }; #endif // ITEMWIDGET_H

ItemWidget.cpp

#include "itemwidget.h"
#include "global.h"
#include "ctooltip.h"

#include
<QEvent> #include <QCursor> 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); } // 滑鼠懸停的時候,顯示當前使用者簡要資訊 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自定義樣式部分:
CToolTip.h

#ifndef CTOOLTIP_H
#define CTOOLTIP_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QGroupBox>
#include <QVBoxLayout>
#include <QHBoxLayout>

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 <QDebug>
#include <QApplication>
#include <QDesktopWidget>

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();
}

當然當然,在大多數的元件上面都有一個成員函式setToolTip(QSTring& ..)
這個就可以實現簡單的友好資訊提示功能了。

相關推薦

Qt5製作滑鼠懸停顯示Hint的ToolTip

在日常生活中的使用的軟體中,我們經常會遇到這樣的情況。 我們在網頁上,有些網頁連結的文字(比如文章標題,知乎問題標題,百度的詞條等)因為太長了,而顯示不出來,但是滑鼠懸停在上面的時候就可以顯示出來。 我們在QQ上或者某些輸入框內,我們不知道應該輸入什麼內容,

為何有的連結滑鼠懸停顯示小手有的沒有

<a href="#" style="cursor:default">aaa</a> default 預設游標(通常是一個箭頭) auto 預設。瀏覽器設定的游標。 crosshair 游標呈現為十字線。 pointer 游標呈現為指示連結的指標(一隻手) move 此游

echarts滑鼠懸停顯示、X、Y軸設定,dataZoom(X軸拖拽效果)

1. 滑鼠點選觸發ajax,獲取data資料 $("#echartsContent).off("click",function(){ var code=$("#codeInput").val(); var startTime=$("#startTime").

JavaScript實現圖片輪播和滑鼠懸停顯示

例: 提前放好了四張圖片,並編號。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www

JS特效:滑鼠懸停顯示提示

<script language="JavaScript"> function showtip2(current,e,text) { if (document.readyState=="complete") {<!--如果是ie瀏覽器並且滿足readyst

滑鼠懸停顯示CSS3動畫邊框

1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta charset="utf-8" /> 5 <title>CSS3滑

Python+Selenium 操作示例——滑鼠懸停顯示二級選單,再點選二級選單或下拉列表

# encoding=utf-8 from selenium import webdriver from selenium.webdriver.common.action_chains im

實現Bootstrap導航條可點選和滑鼠懸停顯示下拉選單

使用Bootstrap導航條元件時,如果你的導航條帶有下拉選單,那麼這個帶下拉選單的導航在點選時只會浮出下拉選單,它本身的href屬性會失效,也就是失去了超連結功能,這並不是我想要的,我希望導航條的連結可以正常開啟它的連結,但又需要下拉選單功能,開始折騰~ 首先解決帶下拉

bootstrap怎麼設定下拉選單不點選,改成滑鼠懸停直接顯示下拉選單

方法一: 實際上比較簡單,只需要加一個css設定下hover的狀態,把下拉選單設定成block,具體css:.nav > li:hover .dropdown-menu {display: block;}  但是主導航失去連結的效

onmouse實現滑鼠懸停內容顯示及隱藏

先上程式碼: <html> <head> <title>js操作</title> <style> .div_in{ width:330px; height:165px; }

JavaScript | 滑鼠懸停動態彈出浮動視窗顯示圖片 | clientX, clientY, scrollLeft, scrollTop

動態彈出浮動視窗顯示圖片的效果是這樣子的: 不多說,直接上程式碼: <!DOCTYPE html> <html lang="en"> <head> &

javascript如何製作簡單的圖片輪播,帶有數字選擇,滑鼠懸停暫停輪播,離開時繼續輪播圖片

直接上程式碼,程式碼有註釋: 要想做圖片輪播,需要知道以下知識點: 定時函式: window物件: window.setInterval("執行的方法名",間隔時間(毫秒)):返回值是一個用來

h5新標籤和css3動畫製作一個滑鼠懸停的動畫效果

<span style="font-size:18px;"><div class="grid wow zoomIn"> <figure class="effect-bubba"> <

C# 滑鼠懸停在datagridview的某單元格,顯示懸浮框效果

  本文轉載:http://www.cnblogs.com/bribe/archive/2013/10/08/3357345.html 今天在做專案時,看到一軟體做的懸浮框效果不錯,從網上搜羅了一些資料,未見到有十分好的解決辦法,只能自已動手,利用datagridview 的ToolT

原生JS實現滑鼠懸停圖片顯示文字效果

<!doctype html> <html> <head> <meta charset="utf-8"> <title>無標題文件</title> <style> *{ margin:0;

jQuery css3滑鼠懸停圖片顯示遮罩層動畫特效

<!doctype html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=

ArcGIS api for javascript——滑鼠懸停顯示資訊視窗

描述 本例展示當用戶在要素上懸停滑鼠時如何顯示InfoWindow。本例中,要素是查詢USA州圖層的QueryTask的查詢結果。工作流程如下: 1.使用者單擊一個要素 2.要素是“加亮的”圖形。 3.使用者在圖形上懸停滑鼠,看到屬性資訊的資訊視窗。 如果想要在任意要素上懸停滑鼠來檢視資訊視窗,見示例載入查

滑鼠懸停時反白顯示的導航條程式碼(原創)

//說明:在引用檔案的相應位置,寫入<script src="menu.js" type="text/javascript"></script>//MenuItem使用說明:第一個引數為連結顯示內容,可以為圖片,如果為圖片,則內容格式為<IMG

ToolTip外掛,滑鼠懸停顯示資訊

來自網上示例 <!DOCTYPE html> <html> <head><meta charset="utf-8"> <title>Bootstrap 例項 - 工具提示(Tooltip)外掛</title

U3D顯示滑鼠懸停位置物件的名字

using System.Collections; using System.Collections.Generic; using UnityEngine; public class MouseClickBehaviourScript : MonoBehaviour {