• 7512阅读
  • 18回复

[提问]timer用按鍵啟動與停止的問題 [复制链接]

上一主题 下一主题
离线x135481
 
只看楼主 倒序阅读 楼主  发表于: 2012-07-11
关键词: QTimerupdate


小弟我想用鍵盤(空白鍵)來控制time的開始與停止


但目前只知道怎麼開始
void PI::keyPressEvent(QKeyEvent *event)
{
    QTimer *timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(update()));
    if(event->key()==Qt::Key_Space)
    {
              timer->start(200);
    }
這樣能開始 但每按一次space 就會加速一次
也不知道怎麼按空白鍵停止
請各位高手指點一下 拜託....
离线uidab

只看该作者 1楼 发表于: 2012-07-11
回 楼主(x135481) 的帖子
每次按键都new一次,而且没有stop
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线x135481
只看该作者 2楼 发表于: 2012-07-11
回 1楼(uidab) 的帖子
感謝一樓大大回覆

我不知道..用什麼方法呈現按一次空白鍵啟動一次time 再按一次停止  time

可否請大大指點
离线roywillow

只看该作者 3楼 发表于: 2012-07-11
把timer声明为成员变量
可以用QShortcut来关联一个槽控制这个timer
槽中根据timer的状态来启动或停止这个timer
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线x135481
只看该作者 4楼 发表于: 2012-07-11
回 3楼(roywillow) 的帖子
3樓大大

小弟我剛開始QT 不太明白您的說法

可否舉具體的例子工小弟參考

還有單一鍵盤控制開始停止的問題 我實在是沒頭緒
离线uidab

只看该作者 5楼 发表于: 2012-07-11
if(timer->isActive ())
    timer.stop();
else
    timer.start(200);

timer按三楼说的定义为成员变量,在构造函数中new一下,并且connect
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线x135481
只看该作者 6楼 发表于: 2012-07-11
回 5楼(uidab) 的帖子
5樓大大

請問那單一按鍵控制的方式是採用...?
离线uidab

只看该作者 7楼 发表于: 2012-07-11
当然还是在你原来的函数里,多看看帮助。你为啥习惯用繁体字,南方人?
void PI::keyPressEvent(QKeyEvent *event)
{
    if(event->key()==Qt::Key_Space)
    {
             if(timer->isActive ())
                  timer.stop();
             else
                   timer.start(200);
    }
......
}
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线x135481
只看该作者 8楼 发表于: 2012-07-11
回 7楼(uidab) 的帖子
7樓神人

請求time寫在構造中的方法 爬文爬很多 實在是沒辦法
這問題卡了我整天了

PS: 用繁體字 是因為簡體字掛了 電腦不許使用
离线uidab

只看该作者 9楼 发表于: 2012-07-11
回 8楼(x135481) 的帖子
这个是C++ 基本功。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线x135481
只看该作者 10楼 发表于: 2012-07-11
回 9楼(uidab) 的帖子
大大

可以給我sample嗎?

离线roywillow

只看该作者 11楼 发表于: 2012-07-11
类的声明中来一个
private:
    QTimer *timer;
private slots:
    timerStartStop();

类的构造函数中加上
timer = new QTimer(this);
connect(【把timer连接上你需要的槽】)
new QShortcut(QKeySequence(Qt:::Key_Space), this, SLOT(timerStartStop)); //因为暂且用不到对这个QShortcut加以其他的控制,所以只new,不用声明指针变量来保存了

timerStartStop()槽中
{
    if (timer->isActive())
        timer->stop();
    else
        timer->start(【间隔毫秒】);
}
随手一写,未经调试

专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线itstudy
只看该作者 12楼 发表于: 2012-07-11
QT  key_pressEvent()不太好用
前短时间做快捷键时 如果MainWidget不得到焦点 就无法响应
逼得我最后用了WIn32钩子实现的
离线roywillow

只看该作者 13楼 发表于: 2012-07-11
回 12楼(itstudy) 的帖子
本来快捷键就只给当前活动窗口的,除非是全局快捷键
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线itstudy
只看该作者 14楼 发表于: 2012-07-11
回 13楼(roywillow) 的帖子
全局快捷键如何实现的呢
离线itstudy
只看该作者 15楼 发表于: 2012-07-11
回 13楼(roywillow) 的帖子
声明QShortCut的全局对象 然后连接到对应的事件?可如果我有很多个快捷键 那会不会定义很多全局对象那
离线roywillow

只看该作者 16楼 发表于: 2012-07-11
回 14楼(itstudy) 的帖子
global shortcut可以参考QxtGlobalShortcut源代码

本来QShortcut就是只对应一个快捷键的呀,一个快捷键当然就需要一个QShortcut啊
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线x135481
只看该作者 17楼 发表于: 2012-07-11
小弟我改寫成下列
在.h裡增加
private:
      QTimer *timer;
private slot:
       timerStartStop();

在.cpp裡增加

void PI::timerStartStop()
{
  
    if (timer->isActive())
        timer->stop();
    else
        timer->start(200);
}

timer = new QTimer(this);

void PI::keyPressEvent(QKeyEvent *event)
{
     new QShortcut(QKeySequence(Qt:::Key_Space), this, SLOT(timerStartStop));
    
     connect(timer,SIGNAL(timeout()),this,SLOT(update()));
}

這樣寫 行不通..  一樣不會停止

很認真想過 想不通 不知能在指點問題出在哪?
离线roywillow

只看该作者 18楼 发表于: 2012-07-11
回 17楼(x135481) 的帖子
不是说了么……那三句是加在类的构造函数中的……
你被keyPressEvent这个东西给限制住思路了……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
快速回复
限100 字节
 
上一个 下一个