Qt事件:自定义事件

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();
    }
}

效果:

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,可以通过自定义控件的鼠标事件来实现对鼠标操作的响应。下面是一般的步骤: 1. 继承QWidget或QAbstractButton等基类,创建自定义控件类。 2. 重写自定义控件类的鼠标事件处理函数,如mousePressEvent、mouseReleaseEvent、mouseMoveEvent等。 3. 在重写的鼠标事件处理函数中,根据需要实现相应的功能逻辑。 例如,如果你想在自定义控件上实现鼠标点击事件的响应,可以按照以下步骤进行: 1. 创建一个继承自QWidget的自定义控件类,例如MyWidget。 2. 在MyWidget类中重写mousePressEvent函数,该函数会在鼠标按下时被调用。 3. 在mousePressEvent函数中实现你想要的功能,比如显示一个提示框或改变控件的状态等。 下面是一个简单的示例代码: ```cpp #include <QWidget> #include <QMouseEvent> class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) {} protected: void mousePressEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { // 左键点击事件处理逻辑 // 例如显示一个提示框 qDebug() << "Left button pressed!"; } // 调用父类的事件处理函数,保证其他事件正常处理 QWidget::mousePressEvent(event); } }; ``` 在上述示例中,我们重写了MyWidget类的mousePressEvent函数,并在函数中判断鼠标按下的按钮是否为左键,如果是则输出一条调试信息。同时,我们还调用了父类的mousePressEvent函数,以确保其他事件的正常处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值