1. 程式人生 > >Happy coder :Qt 自定義 Button 之美

Happy coder :Qt 自定義 Button 之美

✿題記

      上次經理批評我幫同事寫現成程式碼的行為,他說:授之以魚,不如授之以漁。我想想也對,可是【漁】很枯燥人家不愛學怎麼辦?

      於是乎我想,授之以,不如授之以

✿正文   

        在不支援qml的Qt 4.6 ,很多時候,需要我們自定義控制元件。其實自定義一點也不難,並不是要從頭開始寫一個控制元件類,而是繼承它,在其基礎上,加些佐料,錦上添點花。

        曾經也有人對我的方案產生了質疑,說qss就可以解決,為什麼要費勁自己寫?

        我想說,第一qss不能解決全部,寫一個功能函式無非是3、4行程式碼的事情,不費勁,同時所有特效都封裝在一起,統一管理方便工程中任何一個widget的呼叫。第二,vim可以開啟讀檔案,為什麼還有cat的存在?一個道理,可有其利。第三,對於嵌入式終端的UI實現方案來說,越多越好,在比較下根據實際情況選取最優,因為嵌入式對檔案系統大小,庫的裁剪要求比較嚴格。

        以Button為例吧,為什麼要以Button為例,因為在我看來,Button是萬能的,只是看你會不會用。如果把Button屬性設定為flat平滑且不可點選,那麼它就是個label;如果把許多上述的label按一定的順序和佈局排成行或列,那它就是listview……載入不同背景圖片、點選、懸浮、動畫、click on槽靈活處理,等等把所有屬性都打亂隨機組合,沒有不能拼湊出的效果和特效。

✿某phone 抽獎小例子

滑鼠懸浮於按鈕上時,載入誘惑iphone圖片,離開載入蘋果標,點選載入嘆氣背景…偷笑


✿其實還可以載入更多

 

✿My button list滑鼠劃過

 

✿隨你拖

 

✿關於自定義Button和特效方法的封裝

  
Button::Button(QWidget *parent) : QPushButton(parent)
{
        //儲存圖片成員初始化
        buttonPicture = new QPixmap();
        pressPicture = new QPixmap();
        releasePicture = new QPixmap();

        enterPicture = new QPixmap();
        leavePicture = new QPixmap();

        //關閉按鈕的預設顯示
        this -> setFlat(true);
        this->setFocusPolicy(Qt::NoFocus);

        //初始化flag
        flag=false;


}

void Button::setButtonPicture(QPixmap pic)
{
        *buttonPicture = pic;

        this -> setIcon(QIcon(*buttonPicture));
}

void Button::setPressPicture(QPixmap pic)
{
        *pressPicture = pic;
}

void Button::setReleasePicture(QPixmap pic)
{
        *releasePicture	= pic;
}

void Button::setEnterPicture(QPixmap pic)
{
    *enterPicture = pic;
}

void Button::setLeavePicture(QPixmap pic)
{
    *leavePicture = pic;
}

void Button::set_X_Y_width_height(int x, int y, int width, int height)
{
        this -> setIconSize(QSize(width, height));
        this -> setGeometry(x, y, width, height);
}

void Button::mouseDoubleClickEvent(QMouseEvent *event)
{
        //null
}

void Button::mousePressEvent (QMouseEvent *event)
{
        this -> setIcon (QIcon(*pressPicture));
}

void Button::mouseMoveEvent(QMouseEvent *event)
{
        //null
}


void Button::mouseReleaseEvent (QMouseEvent *event)
{
        this -> setIcon(QIcon(*releasePicture));
        emit clicked();
}

void Button::enterEvent(QEvent *)
{
    this->setIcon(QIcon(*enterPicture));
    flag=true;
  //  this->resizeit();

}

void Button::leaveEvent(QEvent *)
{
    this->setIcon(QIcon(*leavePicture));
    flag=false;
}

void Button::resizeit(int w , int h)
{
    this->raise();
    this->resize(w,h);
    this ->setIconSize(QSize(w, h));

}

把這些方法按照自己的思路,配合paintEvent、Animation、qss等等,美化Qt 應用程式的UI 和動畫效果基本沒什麼問題了。一時之間想不出還有什麼新鮮的需求來寫個小demo,就這樣吧,歡迎交流。

✿由Button想到的

           就一句話:你說什麼控制元件不能自定義啊?

✿後記

         興趣和快樂是進步的動力和源泉

                                             ——以漁為娛,以漁為樂,以漁為生活。

相關推薦

Happy coder Qt 定義 Button

✿題記      上次經理批評我幫同事寫現成程式碼的行為,他說:授之以魚,不如授之以漁。我想想也對,可是【漁】很枯燥人家不愛學怎麼辦?      於是乎我想,授之以漁,不如授之以漁為娛。✿正文            在不支援qml的Qt 4.6 ,很多時候,需要我們自定義控制

QTQT從零入門教程(十一)QT定義視窗

  首先是借鑑了網上的部落格,實現無邊框,自由拖動的自定義視窗效果。 #ifndef CUSTOMWINDOW_H #define CUSTOMWINDOW_H #include <QtGui> #include <QtWidg

機器學習 tensorflow 定義 損失函數

cond pre port var IV 學習 col float ria git: https://github.com/linyi0604/MachineLearning/tree/master/07_tensorflow/ 1 import tensor

小程式定義元件button登陸

閒著沒事玩了下自定義元件,只推薦自己玩下。登陸請不要使用此方法。 如有需要,可借鑑之前小程式登陸維護3rdsession文章。 由於前段時間,wx.getUserInfo被改還必須使用button登陸,獲取使用者資訊操作就變得比較繁瑣。 建立小程式。 在專案上建立名為comp

WPF編程定義Button控件樣式

基礎 wpf sed lin proc 區域 nta 灰色 框架   自.NET Framework 3.0 以後,WPF編程框架可使開發人員開發出更加令人耳目一新的桌面應用程序。它使開發工作更加方便快捷,它將設計人員和編程人員的工作分離開來。至於WPF的背景歷史、框架特點

碼農裝13寶典系列Ubuntu定義字型縮放級別

目前主流顯示器都有一個很高的解析度,而使用預設的解析度會使字型顯示過小,單純地調整解析度又容易讓字看起來發虛。 系統提供了一個字型縮放級別調整的功能。Windows初始化時就已經為使用者設定好了,而Ubuntu只有兩個選項:100%、200%,顯然不能滿足需求。 那怎麼辦? 這裡需要

Hive定義函式UDF,UDAF和UDTF

hive允許使用者使用自定義函式解決hive 自帶函式無法處理的邏輯。hive自定義函式只在當前執行緒內臨時有效,可以使用shell指令碼呼叫執行hive命令。 UDF 輸入一行資料輸出一行資料。  解決問題描述  想要比較兩個逗號分隔的字串是否相同。  -使用方法  如果

Android註解定義註解原始碼註解

首先如果你對註解沒有太多瞭解,建議先看一下我之前的兩篇部落格 Android註解:Java註解 Android註解:Android 常用註解   這兩篇部落格都詳細介紹了關於Android註解的一些基礎知識。這是Android自定義註解的第一篇,原始碼註解。A

WPF程式設計定義Button控制元件樣式

自.NET Framework 3.0 以後,WPF程式設計框架可使開發人員開發出更加令人耳目一新的桌面應用程式。它使開發工作更加方便快捷,它將設計人員和程式設計人員的工作分離開來。至於WPF的背景歷史、框架特點、框架結構這裡就不再贅述。有興趣的同袍可在百度搜索關於WPF的相

微信小程式分享或轉發功能(定義button樣式)

小程式頁面內發起轉發 通過給 button 元件設定屬性open-type="share",可以在使用者點選按鈕後觸發 Page.onShareAppMessage 事件,如果當前頁面沒有定義此事件,則點選後無效果。相關元件:button wxml: <!-- 分享 --> <!--/

Android繪圖定義View——矩形進度條、圓環進度條、填充型進度條、時鐘

主函式 這幾種進度條的主函式都是類似的,所以下面我只給出了一個填充型進度條的主函式,其他幾個主函式只是在這基礎上改動一下按鈕id(即與各自佈局裡面的id相同即可),還有改動一下相對應的類即可。 public class MainActivity

activiti定義流程Spring整合activiti-modeler5.16例項(六)啟動流程

1.啟動流程並分配任務是單個流程的正式開始,因此要使用到runtimeService介面,以及相關的啟動流程的方法。我習慣於用流程定義的key啟動,因為有多個版本的流程定義時,用key啟動預設會使用最新版本。同時,因為啟動中查詢了流程部署時xml檔案中流程節點的資訊,也用

JSP定義標籤標籤

public class IfTag extends SimpleTagSupport {          private boolean test;          public void setTest(boolean test) {                    this.test =

PyQt玩轉signal(訊號)與slot(槽)二新增定義

上文中我們實現了一個非常簡單的功能:點選按鈕關閉應用。不過那種呼叫connect函式的寫法是在QT程式設計中常用的(用C++語言寫QT應用),顯得中規中矩,我們這裡是PyQt,自然要來一種PyQt的寫法,我們先看程式碼: import sys from P

學習筆記Qt定義對話方塊

1、用qt creator 建立一個名為mydialog的qt empty project工程; 2、在該工程中新增logindlg.cpp、logindlg.h、mydialog.cpp檔案,程式碼如下:logindlg.h //定義巨集變數,確保該標頭檔案只被包含一次

Android定義ViewListView實現時間軸效果我只是個送快遞的。

先上效果圖: 實現時間軸的原理 listview的基本使用,相信大家都很熟悉。先在layout下新建一個xml佈局檔案,對應一個子項的listView的顯示內容。在上面的圖我們可以看到,每一項都是 有3個 textview控制元件

activiti定義流程Spring整合activiti-modeler5.16例項(二)建立流程模型

1.maven導包,這裡就沒有什麼多的好說了,直接程式碼: <dependencies> <dependency> <groupId>junit</groupId> <artifact

activiti定義流程整合(四)整合定義表單部署流程定義

綜合前幾篇博文內容,我想在整合這一部分中應該會有很多模組會跳過不講,就如自定義表單的表單列表那一塊,因為這些模組在整合的過程中都幾乎沒有什麼改動,再多講也是重複無用功。 正因為如此,在建立了流程模型之後,模型列表的展示也是和之前的沒有什麼區別,而且都是很簡單的後臺查詢以及前

Qt定義控制元件的建立與初步使用(二)圖片上繪製文字、箭頭、曲線

本文目的:編輯自定義控制元件的介面ui,並在圖片上添文字、箭頭、曲線、開啟、儲存等功能。並說明了如何去使用這個編輯好的ui介面控制元件! 上次簡單的說明了如何去建立Qt自定義控制元件,當時還是對其瞭解不夠深刻,現在看來,QT自定義控制元件就是你事先把介面寫好(一般基於QWi

Android小記定義Button導致RecyclerView列表監聽onScroll回撥異常

背景 一天,搭檔告知筆者,在使用了自定義Button後,RecyclerView的onScroll回撥一直被重複回撥,導致程式執行異常。 排查 檢視該自定義控制元件,主要重寫了onDraw方法,發現引