摘要:自定義控件方法第一步創建一個基類為勾選第二步在界面中創建所需控件第三步在這個中點擊名添加新文件添加一個繼承第四步在這個的中拖一個控件然后選擇右鍵提升輸入第一個的類名第五步關聯第一個類中的控件之間的聯系例子片段拓展在第一個創建的自定
QT自定義控件
方法:
第一步 創建一個QTProject,基類為QWidget(勾選ui); 第二步 在.ui界面中創建所需控件; 第三步 在這個Project中點擊Project名添加新文件, 添加一個C++ class,繼承QWidget; 第四步 在這個的.ui中拖一個Widget控件,然后選擇Widget右鍵提升,輸入第一個的類名; 第五步 關聯第一個類中的控件之間的聯系.
例子:horizintalSlider and spinbox
api(片段):
setRange(0,100) connect(ui->horizontalSlider,&QSlider::valueChanged,[=](int value){ ui->spinBox->setValue(value); connect(ui->spinBox, static_cast(&QSpinBox::valueChanged), ui->horizontalSlider,&QSlider::setValue);
拓展:
set two PushButtons and one can get the value of the horizontalSlider, the another one can set the value of the horizontalSlider.
Mind:
在第一個創建的自定義Widget中給出2個函數, int get_value()----the first PushButton和void set_value(int value)--- the second PushButton, 最后通過按鈕的槽函數就可以實現了.
常用事件處理
方法: 在所有組件的父類 QWidget 中,定義了很多事件處理的函數,如
? keyPressEvent():鍵盤按鍵按下事件
? keyReleaseEvent():鍵盤按鍵松開事件
? mouseDoubleClickEvent():鼠標雙擊事件
? mouseMoveEvent():鼠標移動事件
? mousePressEvent():鼠標按鍵按下事件
? mouseReleaseEvent() : 鼠標按鍵松開事件
? 等等
這些函數都是 protected virtual 的,也就是說,我們可以在子類中重新實
現這些函數。
例子:
第一步 創建一個QTProject,基類為QWidget(勾選ui); 第二步 在.ui中拖一個Label的控件; 第三步 在這個Project中點擊Project名添加新文件, 添加一個C++ class,繼承QLabel; 第四步 把窗口的Label控件提升為第三步創建的類; 第五步 在新建類中重寫方法中的虛函數.
api(片段):
頭文件 #include//設置一開始就有鼠標跟蹤 setMouseTracking(true) void mousePressEvent(QMouseEvent *e): e->x; e->y; int button=e->button(); if( button==Qt::LeftButton); .. button==Qt::RightButton; .. button==Qt::RightButton; ..//Label支持html的寫法 QString str=QString(" "). arg(x).arg(y); this->setText(str); void mouseMoveEvent(QMouseEvent *e): 其他同上,補充如下 int button=e->buttons(); ..if(buttons & Qt::LeftButton) ..if(buttons & Qt::RightButton) ..if(buttons & Qt::MidButton)
pressed[%1,%2]
3.事件分發器(事件分發函數)
作用: 分發各種事件到事件處理函數中.
方法:
第一步 創建一個QTProject,基類為QWidget(勾選ui); 第二步 在.ui中拖一個Label的控件; 第三步 在這個Project中點擊Project名添加新文件, 添加一個C++ class,繼承QLabel; 第四步 把窗口的Label控件提升為第三步創建的類; 第五步 在新建類中重寫事件分發函數.
api:
//事件分發函數 bool myLabel::event(QEvent *e) { //如果返回值是true, 表示事件被處理了 //如果返回值是false,表示事件沒有被處理 比如:if(e->type()==QEvent::MouseMove) { return true; } //讓其他事件傳遞下去 return QLabel::event(e); }
4.事件過濾器
作用:
1.事件到達窗口之前要經過事件過濾器 與事件分發器不同的地方: 如果窗口中有多個label,那么點擊多個label,這時,多個label都可以接收到鼠標點擊事件, 如果要截取鼠標點擊事件,那么可以從事件過濾器中統一截取; 2.事情過濾器是一個object的對象或子類的對象; 3.事件過濾器需要安裝; 4.在object的對象或子類對象中重寫事件過濾器函數.
方法一:
第一步 創建一個QTProject,基類為QWidget(勾選ui); 第二步 在.ui中拖一個Label的控件; 第三步 在這個Project中點擊Project名添加新文件, 添加一個C++ class,繼承QLabel; 第四步 把窗口的Label控件提升為第三步創建的類; 第五步 在這個新建的類中重寫了事件過濾器函數.
api:
//重寫事件過濾器函數 bool myLabel::eventFilter(QObject *watched, QEvent *event) { //返回值是true,表示該事件受到攔截,不會到達窗口 //返回值是false,表示該事件沒有受到攔截 if(event->type()==QEvent::MouseButtonPress) { return true; } return false; } Finally://新建的Label類構造函數中,安裝事件過濾器 this->installEventFilter(this);
方法二:
第一步 創建一個QTProject,基類為QWidget(勾選ui); 第二步 在.ui中拖一個Label的控件; 第三步 在這個Project中點擊Project名添加新文件, 添加一個C++ class,繼承QLabel; 第四步 把窗口的Label控件提升為第三步創建的類; 第五步 再創建一個類,繼承Object; 第六步 在該類中重寫了事件過濾器函數;
api:
#include//事件過濾器的頭文件 bool myEvent::eventFilter(QObject *watched, QEvent *event) { //返回值是true,表示該事件受到攔截,不會到達窗口 //返回值是false,表示該事件沒有受到攔截 if(event->type()==QEvent::MouseButtonPress) { //return true; } return false; } Finally://安裝事件過濾器,在新建的繼承Label的類中 myEvent *filter=new MyEvent(this); this->installEventFilter(filter);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/114696.html
摘要:熱門編程語言特點包羅萬物精細對底層知識涉列廣泛。特點語法簡單可移植性良好。編寫代碼的工具建議新手先使用編程工具,學習兩個月后再嘗試其他的編譯器,推薦使用大后期熟練掌握,因為實際開發環境多在上進行。 熱門編程語言 ? ? ?1、C++: ? ? ? ? ? ?特點:包羅萬物、精細、對底層知識...
摘要:首發于我的博客線程池進程池網絡編程之同步異步阻塞非阻塞后端掘金本文為作者原創,轉載請先與作者聯系。在了解的數據結構時,容器可迭代對象迭代器使用進行并發編程篇二掘金我們今天繼續深入學習。 Python 算法實戰系列之棧 - 后端 - 掘金原文出處: 安生??? 棧(stack)又稱之為堆棧是一個特殊的有序表,其插入和刪除操作都在棧頂進行操作,并且按照先進后出,后進先出的規則進行運作。 如...
摘要:也是可以設置使用靜態庫的溫馨提示對兼容性比較好,因此推薦使用編譯器。下安裝編譯器溫馨提示如果中已經安裝編譯器,則該安裝步驟可以跳過。 00. 目錄 文章目錄 00...
閱讀 3416·2021-11-24 09:39
閱讀 1806·2021-11-17 09:33
閱讀 3530·2021-10-12 10:12
閱讀 5037·2021-09-22 15:51
閱讀 1120·2019-08-30 13:11
閱讀 3580·2019-08-30 10:59
閱讀 573·2019-08-30 10:48
閱讀 1321·2019-08-26 13:48