QT/MFC中對很多控件進行了封裝,常用的消息/事件也都可以很方便地添加,但是有些控件類的消息或者屬性,QT/MFC都默認沒有提供重寫方法,這時就只能定義某個控件的子類,並重寫其響應消息/事件/屬性,比如我們想定義一個按鈕的雙擊事件,可以按照以下步驟執行:
定義一個按鈕子類→重寫按鈕子類窗口的雙擊事件→在主窗口中使用此按鈕子類;
(1) 定義一個按鈕子類
在項目中添加一個QT類,因爲不需要新的UI文件,這裏選擇Qt Class:
這裏基類默認只有兩種,我們選擇QWidget,等文件創建成功再把基類改成QPushButton:
(2) 重寫按鈕子類窗口的雙擊事件
.h文件
#pragma once
#include <QWidget>
#include <QPushButton>
#include <QMouseEvent>
class MyButton : public QPushButton /*父類改成QPushButton*/
{
Q_OBJECT
public:
MyButton(QWidget *parent);
~MyButton();
protected:
void mouseDoubleClickEvent(QMouseEvent *ev); /*雙擊事件響應函數*/
};
.cpp文件
#include "MyButton.h"
#include <QMessageBox>
#include <QString>
MyButton::MyButton(QWidget *parent)
: QPushButton(parent)
{
this->setParent(parent);
this->setText(QString::fromLocal8Bit("我是自定義按鈕"));
this->setFixedSize(QSize(100, 50));
}
MyButton::~MyButton()
{
}
void MyButton::mouseDoubleClickEvent(QMouseEvent * ev)
{
if (ev->buttons() == Qt::LeftButton)
{
QMessageBox::information(NULL, "666", "double click", QMessageBox::Yes);
}
}
(3)在主窗口中使用此按鈕子類
運行結果如下,搞定!
/萬能的分割線*/
順帶一提,QT的UI文件中有個類提升功能,可以很簡單的把某個控件基類提升爲我們的自定義控件類,而且省去一些設置的代碼,步驟如下;
如圖所示,在控件設置中選擇"提升爲…"
將自定義類添加到可提升列表,然後再點擊提升:
有時候提升完畢,編譯時會報錯,如圖,這是因爲系統在ui頭文件中添加自定義類頭文件時把它當成了系統頭文件,把包含方式改成自定義類就行了:
可以看到按鈕提升爲自定義控件類了,效果跟之前是一樣的: