1. 程式人生 > >Qt5.8 按鈕三種狀態:Normal、Hover、Click。支援滑鼠穿透

Qt5.8 按鈕三種狀態:Normal、Hover、Click。支援滑鼠穿透

本程式是windows下的。

正常狀態下:

Hover:

點選:

要求點選紅色區域沒反應,如圖:

程式碼如下:

#pragma once
#include <QWidget>
#include <QPainter>
#include <QBitmap>
#include <QEvent>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QToolButton>

#include <inttypes.h>
#include <Shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")

enum _ButtonStatus
{
	btnNomal = 0,
	btnHover = 1,
	btnPressed = 2
};
class PushButton :public QPushButton
{
	Q_OBJECT

public:
	explicit PushButton(QWidget *parent = NULL);
	~PushButton();

	void SetImage(const QString& strImage, const QString& strHoverImage, const QString& strPressedImage);

private:
	QString SaveImagePath(const QString& strImage);

private:
	void paintEvent(QPaintEvent *);
	void enterEvent(QEvent *event);
	void leaveEvent(QEvent *event);

public slots:
	void onClicked();

private:
	QString m_strImage;
	QString m_strHoverImage;
	QString m_strPressedImage;
	int nStart;

private:
	float fWidthScale;
	float fHeightScale;
};
.cpp:
#include "PushButton.h"
#include <Windows.h>

PushButton::PushButton(QWidget *parent) : QPushButton(parent)
{
	nStart = btnNomal;
	setStyleSheet("QPushButton{background: transparent;}");
	connect(this, SIGNAL(clicked()), this, SLOT(onClicked()));
	setMouseTracking(true);

	UINT32 m_ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
	UINT32 m_ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
	fWidthScale = (float)m_ScreenWidth / (float)1920;
	fHeightScale = (float)m_ScreenHeight / (float)1080;
}


PushButton::~PushButton()
{
}

QString PushButton::SaveImagePath(const QString& strImage)
{
	wchar_t wcModule[1024] = {0};
	GetModuleFileName(NULL, wcModule, 1024);
	::PathRemoveFileSpec(wcModule);
	wsprintf(wcModule + wcslen(wcModule), L"\\%s", strImage.toStdWString().c_str());
	return QString::fromStdWString(wcModule);
}

void PushButton::SetImage(const QString& strImage, const QString& strHoverImage, const QString& strPressedImage)
{
	m_strImage = SaveImagePath(strImage);
	m_strHoverImage = SaveImagePath(strHoverImage);
	m_strPressedImage = SaveImagePath(strPressedImage);

	QPixmap pixmap(m_strHoverImage);
	QPixmap pixmap_new = pixmap.scaled(pixmap.width() * fWidthScale, pixmap.height() * fHeightScale, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
	setIcon(pixmap_new);
	setIconSize(QSize(pixmap_new.width(), pixmap_new.height()));
	setMask(pixmap_new.mask());
}


void PushButton::leaveEvent(QEvent *event)
{
	nStart = btnNomal;
}
void PushButton::enterEvent(QEvent *event)
{
	nStart = btnHover;
}
void PushButton::onClicked()
{
	nStart = btnPressed;
}

void PushButton::paintEvent(QPaintEvent *event)
{
	if (nStart == btnHover){
		QPixmap pixmap(m_strHoverImage);
		QPixmap pixmap_new = pixmap.scaled(pixmap.width() * fWidthScale, pixmap.height() * fHeightScale, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);

		QPainter painter(this);
		painter.drawPixmap(rect(), pixmap_new);
		setMask(pixmap_new.mask());
	}
	else if (nStart == btnPressed){
		QPixmap pixmap(m_strPressedImage);
		QPixmap pixmap_new = pixmap.scaled(pixmap.width() * fWidthScale, pixmap.height() * fHeightScale, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);

		QPainter painter(this);
		painter.drawPixmap(rect(), pixmap_new);
		setMask(pixmap_new.mask());
	}
	else{
		QPixmap pixmap(m_strImage);
		QPixmap pixmap_new = pixmap.scaled(pixmap.width() * fWidthScale, pixmap.height() * fHeightScale, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);

		QPainter painter(this);
		painter.drawPixmap(rect(), pixmap_new);
		setMask(pixmap_new.mask());
	}
}

呼叫:
m_btn_ManageUser = new PushButton(this);
	m_btn_ManageUser->SetImage("移入效果4.png", "移入效果111.png", "移入效果2.png");
	m_btn_ManageUser->setGeometry(0, 0, 229, 139);
	connect(m_btn_ManageUser, SIGNAL(clicked()), this, SLOT(OnManageUser()));



相關推薦

Qt5.8 按鈕狀態NormalHoverClick支援滑鼠穿透

本程式是windows下的。 正常狀態下: Hover: 點選: 要求點選紅色區域沒反應,如圖: 程式碼如下: #pragma once #include <QWidget> #include <QPainter> #includ

hibernate中物件的狀態瞬時態脫管態持久態

物件的三種狀態:      瞬時態:也叫臨時態,與session沒有關聯,沒有id,在資料庫中沒有記錄      脫管態:也叫遊離態,與session沒有關聯,但在資料庫中有對應的id,有這條記錄      持

ORACLE資料庫的狀態RESTRICTQUIESCE和SUSPEND

bash-2.03$ srvctl status db -d testracInstance testrac1 is running on node racnode1Instance testrac2 is running on node racnode2Instance testrac3 is runnin

【SSH快速進階】——探索Hibernate物件的狀態TransientPersistentDetached

  學習過作業系統的朋友,腦子裡肯定都會有這張程序的狀態轉換圖:      當所有條件就緒,程序被排程執行,時間片到的時候,程序被掛起,進入就緒狀態……對程序進行的不同操作會導致程序進入到不同的狀

細談 C++ 返回傳值的方式按值返回按常量引用返回以及按引用返回

一、引言 停滯了很久,最近又開始細細品味起《Data Structure And Algorithm Analysis In C++》這本書了。這本書的第一章即為非常好的 C++11 統領介紹的教材範文,可能對於 C++11 新手來說,作者這樣短篇幅的介紹或許有些蒼白晦澀,但是對於我

CButton控制元件MFC如何給按鈕新增圖片,顯示狀態,分別是點選盤旋初始狀態(不點選也不盤旋狀態

// PicButton.cpp : 實現檔案//#include "stdafx.h"#include "MFCApplication5.h"#include "PicButton.h"// CPicButtonIMPLEMENT_DYNAMIC(CPicButton, CButton)CPicButton

分享知識-快樂自己Hibernate對象的狀態

png delete rup load() ear 比較 lec alt 使用 圖解: 1):瞬時狀態(Transient)   對象與session沒有關聯,數據庫中沒有對應的數據。   一般new出來的對象便是瞬時對象。   對瞬時對象使用save()方法便使之成

分享知識-快樂自己Hibernate物件的狀態

圖解:   1):瞬時狀態(Transient)   物件與session沒有關聯,資料庫中沒有對應的資料。   一般new出來的物件便是瞬時物件。   對瞬時物件使用save()方法便使之成為持久物件。   由於資料庫中沒有對應的資料,所以對瞬時物件使用update()方法無效。

8. PHP接入微信的支付APP支付公眾號支付掃碼支付

微信的支付邏輯與支付寶的支付有一些差別。為了讓客戶端忽略這些差別,統一呼叫。本sdk做了對應處理。 # SDK呼叫 微信支付不同介面需要的引數會有差別。請大家在使用介面時,仔細檢視文件。 use Payment\ChargeContext; use

SSHHibernate框架(Hibernate快取機制及狀態

一、why(為什麼要用Hibernate快取?) Hibernate是一個持久層框架,經常訪問物理資料庫。 為了降低應用程式對物理資料來源訪問的頻次,從而提高應用程式的執行效能。 快取內的資料是對物理資料來源中的資料的複製,應用程式在執行時從快取讀寫資料,在特定的時刻或事件會同步快取和物理資料來源的資料。

Hibernate狀態,緩存,以及update更新問題

來講 clas 最大的 .cn lba ransient count 條件查詢 rate 一. Hibernate中對象的三種狀態 1. 瞬時狀態(transient) 當我們通過Java的new關鍵字來生成一個實體對象時,這時這個實體對象就處於自由狀態,此時該對象

hibernate對象的狀態的簡單理解

close hibernate 引用 src tac 失去 .cn session ber 1. transient:對象首先被new出來的時候:這是它存在內存中,緩存中沒有,沒有ID,數據庫中也沒有 2. persistent:對象再執行save()方法後, Se

js的異步加載及promise的狀態

使用 create 文件 stat src 將在 safari afa 停止 ---恢復內容開始--- js異步加載 同步加載 <script src="http://baidu.com/script.js"></script> --->

Hibernate中對象的狀態

less val ssi action 之前 一個數據庫 cti 事務提交 color 一 . 在hibernate中,對象有三種狀態:臨 時狀態(Transient)、持久狀態(Persistent)和遊離狀態(Detached)。     處於持久態的對象也稱為 PO

深入理解hibernate的狀態

cti stp nat t對象 pre test date div 判斷 本文轉載自http://www.cnblogs.com/xiaoluo501395377/p/3380270.html 學過hibernate的人都可能都知道hibernate有三種狀態,transi

11.4-全棧Java筆記:線程狀態的控制

java關於Java線程終止、暫停、聯合的文章網上有很多,經過測試,本節重點講解的是針對不同使用場景選擇合適的方法。終止線程的典型方式終止線程我們一般不使用JDK提供的stop()/destroy()方法(他們本身也被JDK廢棄了)。通常的做法是提供一個boolean型的終止變量,當這個變量置為false,則

qt5.8 鏈接mysql錯誤driver not load

bsp logs ibm targe 轉載 解決方案 解決 target .dll 轉載請註明出處:http://www.cnblogs.com/dachen408/p/7155858.html 問題:qt5.8 鏈接mysql錯誤:driver not load。 解決

Hibernate 的狀態

out clear sql bsp imp 語句 lose tac system 1.Transient 狀態   There is no records in database. 2.Persistent狀態 Data exists in database, and

Hibernate的工作流程以及狀態(面試題)

數據庫 delet 垃圾 打開 ron 工作流 沒有 flush 行數據 Hibernate的工作流程以及三種狀態 轉載自:http://www.cnblogs.com/fifiyong/p/6390699.html Hibernate的工作流程: 1. 讀取並解

Hibernate入門 (二)狀態

依賴 區分 dia 讀取配置文件 hibernate conn null threads 定時 .大配置 方言 property name="dialect" 取值 自動構建表結構 property name="hbm2ddl" true con