上機環境linux mint Qt5.11
- 需求:自定義一個label,使得label在點擊時可以顯示鼠標的坐標值
- 步驟一,新建一個QWidget項目
- 方便起見,設置如下
- 步驟二,新建一個Label類
自定義的控件,無非是在Qt官方控件的基礎上添加新的槽(通俗點就是響應事件的函數),那么必定要繼承基類,那么基類的具體名稱是什么?如何查找?我們不妨拖拽一個官方控件,以查看它的相關屬性
再一看,右邊屬性信息
- 為項目新添加一個C++類我暫且定義為mylabel,讓這一標簽繼承基類QLabel,根據需求,點擊標簽將會顯示鼠標,x,y軸坐標信息,這勢必關系到選擇哪些合適的微件(widget,說白了就是新時代優雅的控件)響應事件,具體做法是,把鼠標放在控件名,如QLabel處,按下F1
查看Reimplemented protected functions
感覺mousePressEvent甚得朕心,於是乎,在頭文件加上相關函數聲明(protected部分)
#ifndef MYLABEL_H #define MYLABEL_H #include <QWidget> #include<QLabel> class mylabel : public QLabel { Q_OBJECT public: explicit mylabel(QWidget *parent = nullptr); protected: void mousePressEvent(QMouseEvent *ev); void mouseReleaseEvent(QMouseEvent *ev); void mouseMoveEvent(QMouseEvent *ev); signals: public slots: }; #endif // MYLABEL_H
- 接下來,要寫下詳盡的功能,切換到類的實現文件mylabel.cpp
#include "mylabel.h" #include<QLabel> #include<QMouseEvent>//必須添加控件頭文件,否則程序會讓你好看 #include<QString>//必須添加控件頭文件,否則程序會讓你好看 mylabel::mylabel(QWidget *parent) : QLabel(parent) { } void mylabel::mousePressEvent(QMouseEvent *ev) { int x=ev->x();//把鼠標放在QMouseEvent處,按下F1可以發現該類的公共函數x(),y()是用來獲取x,y軸坐標的 int y=ev->y(); QString str=QString("x軸坐標:%1, y軸坐標:%2").arg(x).arg(y); this->setText(str); } void mylabel::mouseReleaseEvent(QMouseEvent *ev) { } void mylabel::mouseMoveEvent(QMouseEvent *ev) { }
以為這樣就萬事大吉了?......I‘m deeply sorry,點擊ui文件
選中label微件,鼠標右鍵 點擊promote to......
在promoted class name處添加你寫好的 類名----mylabel,添加成功后,下次打開,如上圖所示
接下來就是選中label組件,然后右鍵選擇promoted to 選擇擬定義好的類mylabel,最后運行結果如下,你的label控件最好拖的跟窗體一樣大,這樣才由更好的測試體驗