1. 程式人生 > >Qt學習之路之自定義按鈕

Qt學習之路之自定義按鈕

按鈕有三種狀態:當滑鼠點選的時候,當滑鼠進入按鈕的時候,當滑鼠沒有進入按鈕的時候,這3個不同的狀態。

上程式碼~~~~

pushBtn_widget.h 

/*
	貼圖按鈕的狀態: 進入, 離開, 按下
*/


#ifndef PUSHBTNWIDGET_H
#define PUSHBTNWIDGET_H

#include <QPushButton>
#include <QPainter>
#include <QMouseEvent>

class PushBtnWidget : public QPushButton
{
	Q_OBJECT
public:
	explicit PushBtnWidget(QWidget *parent = 0);
	void setPixButtonName(QString pushBtnName);

protected:
	void enterEvent(QEvent *);
	void leaveEvent(QEvent *);
	void mousePressEvent(QMouseEvent *event);
	void paintEvent(QPaintEvent *);
	void mouseReleaseEvent(QMouseEvent *event);

private:
	//---------------> 按鈕幾種按鈕狀態
	enum btnStatus{NORMAL, ENTER, PRESS, NOSTATUS};
	btnStatus pushBtnStatus;
	QString pix_Name;

	int btnWidth;		// 按鈕寬度
	int btnHeight;		//  按鈕高度
	bool mouse_press;	// 滑鼠左鍵是否按下
};
#endif		//PUSHBTNWIDGET_H
pushBtn_widget.cpp
#include "pushBtn_widget.h"


PushBtnWidget::PushBtnWidget(QWidget *parent /*= 0*/)
	:QPushButton(parent)
{
	pushBtnStatus = NORMAL;		// 初始化 按鈕的圖示狀態
	mouse_press = false;				// 設定滑鼠沒有按下
}

/*
	函式名:setPixButtonName
	函式引數:QString pushBtnName
	函式返回值: 無
*/
void PushBtnWidget::setPixButtonName(QString pushBtnName)
{
	this->pix_Name = pushBtnName;
	setFixedSize(QPixmap(pix_Name).size());
}

/*
	函式名:enterEvent
	函式引數:QEvent *event
	函式返回值: 無
*/
void PushBtnWidget::enterEvent(QEvent *event)
{
	pushBtnStatus = ENTER;
	update();						// --  更新滑鼠的狀態
}

/*
	函式名:leaveEvent
	函式引數:QEvent *event
	函式返回值: 無
*/
void PushBtnWidget::leaveEvent(QEvent *)
{
	pushBtnStatus = NORMAL;
	update();
}

/*
	函式名:mousePressEvent
	函式引數:QMouseEvent *event
	函式返回值: 無
*/
void PushBtnWidget::mousePressEvent(QMouseEvent *event)
{
	if (event->button() == Qt::LeftButton)	//-------點選滑鼠的左鍵
	{
		mouse_press = true;
		pushBtnStatus = PRESS;
		update();
	}
}

/*
	函式名: paintEvent
	函式引數:QPaintEvent *event
	函式返回值: 無
*/
void PushBtnWidget::paintEvent(QPaintEvent *event)
{
	QPainter painter(this);
	QPixmap pixmap;
	switch (pushBtnStatus)
	{
	case NORMAL:
		{
			pixmap.load(pix_Name);
			break;
		}
	case ENTER:
		{
			pixmap.load(pix_Name + QString("_hover"));
			break;
		}
	case PRESS:
		{
			pixmap.load(pix_Name + QString("_press"));
		}
	case NOSTATUS:
		{
			pixmap.load(pix_Name );
			break;
		}
	default:
		{
			pixmap.load(pix_Name);
		}
		break;
	}

	painter.drawPixmap(rect(), pixmap);
}


/*
	函式名: mouseReleaseEvent
	函式引數:QMouseEvent *event
	函式返回值: 無
*/
void PushBtnWidget::mouseReleaseEvent(QMouseEvent *event)
{
	if (mouse_press && this->rect().contains(event->pos()))
	{
		mouse_press = false;
		pushBtnStatus = ENTER;
		update();
		emit clicked();
	}
}

說明:

準備好按鈕3張圖片,在新增按鈕資源的時候,圖片重新命名如下圖:

例如:

PushBtnWidget *closePixBtn;
	PushBtnWidget *sendPixBtn;
	closePixBtn = new PushBtnWidget(this);
	sendPixBtn = new PushBtnWidget(this);

	closePixBtn->setPixButtonName(":/pixbtn/closeBtn");
	sendPixBtn->setPixButtonName(":/pixbtn/sendBtn");
	
	connect(closePixBtn,  SIGNAL(clicked()), qApp, SLOT(quit()));		//---按鈕訊號
	connect(sendPixBtn, SIGNAL(clicked()), this, SLOT(slotSendMsg()));

這裡只是設定了按鈕,但是沒有指定按鈕的位置。。

這樣就能打造自己喜歡的的按鈕了

相關推薦

python_定義forms組件

char deepcopy clean copy 所有 ges div object 失敗 import re import copy class ValidateError(Exception): def __init__(self,detail):

【Kaggle-MNIST定義程式結構(七)

簡述 這一篇跟這個系列的其他文章不一樣,這個是重新安排下程式結構 結構如下: 其中model這個模型專門放模型就好了 model/init.py中不用寫就好了。 model/CNN.py中的內容 模型是基於之前的【Kaggle-MNIS

【進階定義註解介紹與實戰

在使用spring框架的時候,我們經常會感嘆註解式程式設計真是大大簡化了開發的時間,幾個小小的註解,就能解決一系列的配置問題,讓寫程式碼像寫詩一樣輕鬆明快。 我們都知道,在spring框架的前期,大多使用XML配置進行開發。XML配置起來有時候冗長,如實體類的對映,使用XML進行開發會顯得十分複雜。同時註解

Qt學習定義按鈕

按鈕有三種狀態:當滑鼠點選的時候,當滑鼠進入按鈕的時候,當滑鼠沒有進入按鈕的時候,這3個不同的狀態。 上程式碼~~~~ pushBtn_widget.h  /* 貼圖按鈕的狀態: 進入, 離開, 按下 */ #ifndef PUSHBTNWIDGET_H #def

學習OPENSEADRAGON五 (工具條TOOLBAR與定義按鈕)

OpenSeadragon簡介:學習OpenSeadragon之一(一個顯示多層圖片的開源JS庫) 一、工具條toolbar設定 OpenSeadragon為我們提供了現成的工具條toolBar,工具條上有按鈕,可以預設實現放大、縮小、全屏、返回預設大小等功能, toolB

QT學習 2彈簧和按鈕控制元件

二.彈簧和按鈕控制元件 2.1 關於SizePolicy Fixed:固定大小,大小取自sizeHint,不可伸展和收縮 Minimum: widget的最小值就是sizeHint,可伸展,不能

按鈕配置定義按鈕使用(一)——JEPLUS軟件快速開發平臺

事件 proc oss In 需求 信息 ces otto 圖片 JEPLUS按鈕配置之自定義按鈕使用(一)系統開發過程中無論是表單的默認按鈕或是列表的默認按鈕以及Action的默認按鈕有時候並不能滿足我們的業務需求,這個時

按鈕配置定義按鈕使用(二)——JEPLUS軟件快速開發平臺

bottom vpd 開發平臺 rem 按鈕 ros cto -c spa JEPLUS按鈕配置之自定義按鈕使用(二)之前的一篇筆記講的是在列表上添加自定義按鈕來完成自己的業務需求,今天這篇筆記就主要講一下如何在表

React學習旅----獲取定義屬性

獲取自定屬性,在小程式中可能更常用,在React中同樣也是可以獲取的,看例項 import React, { Component } from 'react'; class Event extends Component { constructor(props) { super(pr

Android學習筆記為Dialog定義佈局,並說明空指標問題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Zynq-Linux移植學習筆記31-使用者定義I2C驅動

1、背景介紹 板子上通過ZYNQ的I2C-0控制器連線了三片DBF晶片和一片Ti的226測功耗晶片,示意圖如下: 如上圖所示,三塊DBF晶片的I2C地址分別為2,4,8,Ti 226晶片的I2C地址為0x40.現在需要ZYNQ通過I2C匯流排讀寫這四塊晶片的暫存器數值

Ext4.2.1學習歷程二:定義類及類的動態載入

原文出處   http://blog.itpub.net/28562677/viewspace-1067421/ -------------------------------------------------------------- 在些extjs類的定義時有必要簡單

Netty4.0學習筆記系列五:定義通訊協議

實現的原理是通過Encoder把java物件轉換成ByteBuf流進行傳輸,通過Decoder把ByteBuf轉換成java物件進行處理,處理邏輯如下圖所示: 傳輸的Java bean為Person: package com.guowl.testobjcoder

QT學習計算器開發

前幾天老師簡單的講解了下QT的訊號與槽,並且實現了一個簡單的計算機加法,如下圖: 我根據對老師所講類容的理解以及一些資料的查詢自己做了一個簡單的計算器。 1 首先上個介面,頁面佈局用Grid Layout。 2 建立各種槽,程式碼如下: mainwindow.h檔案程

Qt學習啟動瀏覽器

       QtWebKit模組屬於第三方軟體模組,不過遵守LGPL協議。在使用網頁模組程式設計的時候,需要包含到下面的標頭檔案: #include<QtWebKit>為了支援使用這個庫需要在工程檔案中加入下面的這行: QT += webkitwidgets

UEditor二次開發新增定義按鈕

需求 現狀描述:目前預覽正文內容只是文字框放大的樣式 優化方向:建議點選預覽可直接預覽門戶介面的樣式 也就是現狀我們呼叫的是Ueditor自帶的預覽功能,而需求中的預覽功能則相當於要我們重寫預覽按鈕 在之前老版本的Ueditor中新增按鈕很麻煩,具體可以參考

Qt學習 QTextEdit 重溫

其實,QTextEdit 也有對文字的編輯函式, 剪下,複製,撤銷.....  看看下面的這個簡單的例子: 控制元件一目瞭然。按鈕 + QTextedit 物件 , 垂直佈局。 ----------------------------------------------

js學習心得js的定義事件-基於觀察者模式的實現

GOF對觀察者模式的定義:Observer的意圖是定義物件之間的一種一(被觀察者)對多(觀察者)的關係,當一個物件的狀態發生改變時,所有依賴它的物件得到通知,並且會自動更新自己。 從這段經典的定義中,可以推測下,觀察者模式中的倆個物件各自應該擁有的特徵 1,被觀察者應該可以

Qt學習獲取檔案資訊

QFileInfo類提供了對檔案進行操作時獲取的檔案資訊,包括檔名, 檔案大小(位元組), 檔案建立時間, 檔案最後修改時間,檔案最近訪問時間以及一些檔案是否為目錄,檔案,或者符號連線,和讀寫等屬性。 不廢話了,先看看程式碼~~~~ fileInfo_widget.h

Wordpress二__定義編輯器按鈕

做一個很簡單的功能 框架上大概就是新增一個快捷鍵 編輯文章的時候,可以在文章頭加上鍊接,例如:  =================== 明日花->2015  bababalabala ,bala, =================== 首先想到的當然是- 1.wo