qt的自定义事件分成两个步骤:
1、注册一个自定义事件的类型值
2、继承QEvent,继承时指定注册的类型值
下面注册一个文本改变事件。
#include <QEvent>
#include <QString>
extern int TextChangeEvent;
class textChangeEvent : public QEvent
{
public:
textChangeEvent();
virtual ~textChangeEvent();
void setString(QString string)
{
this->newString = string;
}
QString getString()const
{
return this->newString;
}
private:
QString newString;
};
int TextChangeEvent = QEvent::registerEventType();//1、注册自定义事件类型
textChangeEvent::textChangeEvent():QEvent(Type(TextChangeEvent)) //2、指定事件类型
{
}
textChangeEvent::~textChangeEvent()
{
}
非常简单的代码,自定义文本改变事件里定义了一个QString用来保存改变之后的文本。
然后来使用这个事件:
界面添加一个编辑框和按钮,当按钮按下时生成一个自定义的文本改变事件:
void Widget::on_pushButton_clicked()
{
QString text = ui->lineEdit->text().trimmed();
textChangeEvent * event = new textChangeEvent;
event->setString(text);
qApp->postEvent(this, event);
}
注意事件只能定义在堆上,也不用手动释放,系统会自动释放的。
qApp->postEvent(this, event);
这句的意思是由程序将事件添加到事件队列,此事件分配给this来处理。qApp的本质 ,qApp实际上就是main()里的QApplication a,程序开始的时候开启了一个事件循环a.exec(),这里是将此事件添加到QApplication a的事件循环队列中,并指派此事件最终由this来处理
事件处理:
事件处理有两种方式。
1、在自定义事件处理函数customEvent中处理
void Widget::customEvent(QEvent *event)
{
int type = event->type();
if (type == TextChangeEvent)
{
textChangeEvent * e = dynamic_cast<textChangeEvent*>(event);
qDebug()<<"从自定义事件获取编辑框的文本:"<<e->getString();
event->accept();
}
}
customEvent是重载自QObject的专门处理自定义事件的函数,自定义事件都会被分配到这里处理
效果:
2、在事件过滤器中处理
将本对象添加到程序的事件过滤器
qApp->installEventFilter(this);
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
if(event->type() == TextChangeEvent)
{
textChangeEvent * e = dynamic_cast<textChangeEvent*>(event);
qDebug()<<"事件过滤器--从自定义事件获取编辑框的文本:"<<e->getString();
event->accept();
}
}
效果: