找回密码
 立即注册
收起左侧

《qt 快速入门》例子6-6关于timerevent的问题。

2
回复
7775
查看
[复制链接]
累计签到:2 天
连续签到:1 天
来源: 2014-12-25 12:01:41 显示全部楼层 |阅读模式
10Qter豆
《qt 快速入门》例子6-6中,我自己在面板上加入一个qpushbutton。
怎么能够截获这个QPushbutton的timerEvent的定时器到时间的事件?

  1. Widget::Widget(QWidget *parent) :
  2.     QWidget(parent),
  3.     ui(new Ui::Widget)
  4. {
  5.     ui->setupUi(this);

  6.     // 开启一个1秒定时器,返回其ID
  7.     id1 = startTimer(1000);
  8.     id2 = startTimer(2000);
  9.     id3 = startTimer(3000);
  10.     id4 = ui->pushButton->startTimer(1500);
  11. }

  12. Widget::~Widget()
  13. {
  14.     delete ui;
  15. }

  16. void Widget::timerEvent(QTimerEvent *event)
  17. {
  18.     // 判断是哪个定时器
  19.     static int i1 = 0;
  20.     static int i2 = 0;
  21.     static int i3 = 0;

  22.     if(event->timerId() == id4) qDebug()<<"---------------";

  23.     if(event->timerId() == id1){
  24.         qDebug() << "timer1";i1++;
  25.     }
  26.     else if(event->timerId() == id2){
  27.         qDebug() << "timer2";i2++;
  28.     }
  29.     else{
  30.         qDebug() << "timer3";i3++;
  31.     }
  32.     qDebug()<<i1<<i2<<i3;
  33. }
复制代码
if(event->timerId() == id4) qDebug()<<"---------------";这一句放在这里没有用。要怎么才能实现捕获Qobject的timerEvent呢?
是不是要重载?要在哪里重载呢?要自己写一个类,继承qpushbutton,然后再里面重载timerEvent,然后调用自己写的类才行?

最佳答案

查看完整内容

可以安装事件过滤器来处理 Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); ui->pushButton->installEventFilter(this);//安装事件过滤器 // 开启一个1秒定时器,返回其ID id1 = startTimer(1000); id2 = startTimer(2000); id3 = startTimer(3000); id4 = ui->pushButton->startTimer(1500); } Widget::~Widget() { delete ui; } v ...
回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2014-12-25 12:01:42 显示全部楼层
可以安装事件过滤器来处理

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);


    ui->pushButton->installEventFilter(this);//安装事件过滤器

    // 开启一个1秒定时器,返回其ID
    id1 = startTimer(1000);
    id2 = startTimer(2000);
    id3 = startTimer(3000);
    id4 = ui->pushButton->startTimer(1500);

}

Widget::~Widget()
{
    delete ui;
}

void Widget::timerEvent(QTimerEvent *event)
{
    // 判断是哪个定时器
    static int i1 = 0;
    static int i2 = 0;
    static int i3 = 0;

    if(event->timerId() == id4) qDebug()<<"---------------";

    if(event->timerId() == id1){
        qDebug() << "timer1";i1++;
    }
    else if(event->timerId() == id2){
        qDebug() << "timer2";i2++;
    }
    else{
        qDebug() << "timer3";i3++;
    }
    qDebug()<<i1<<i2<<i3;
}

bool Widget::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == ui->pushButton )//处理截获的ui->pushButton的事件,这里只处理Timer事件
    {
        if (event->type() == QEvent::Timer)
        {
            int nTimerId = ((QTimerEvent*)event)->timerId();
            if( nTimerId == id4)
            {
               qDebug()<<"MyWidget::eventFilter >> QEvent::Timer >> id4";
               return true;//这里return true表示事件不继续传递给pushButton,如果需要传递给pushButton,那么就return false;
            }
        }
    }

    return QWidget::eventFilter(obj,event);
}
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2014-12-25 15:14:38 显示全部楼层
leo_cao 发表于 2014-12-25 13:18
可以安装事件过滤器来处理

Widget::Widget(QWidget *parent) :

谢谢,我自己重写实现了。不过太复杂了。这样好很多哦 。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了