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头文件中,如果自动填充的头文件名与自定义头文件名不一致,就会报错):
有时候提升完毕,编译时会报错,如图,这是因为系统在ui头文件中添加自定义类头文件时把它当成了系统头文件,把包含方式改成自定义类就行了:
可以看到按钮提升为自定义控件类了,效果跟之前是一样的: