• 9487阅读
  • 17回复

[提问]问个菜鸟级得问题,高手不要笑话俺!!!(定时器实现进度条递增) [复制链接]

上一主题 下一主题
离线aishang
 
只看楼主 倒序阅读 楼主  发表于: 2011-03-29
关键的控件就是一个按键,一个Qspinbox和一个进度条。点击按键的时候获取QSpinix里面的值,用它给进度条设置最大范围,让后定时器开始工作,让进度条从0开始每秒增加一次一直到最大值。按键有两个text。一个开始,一个结束。当进度条到最大值得时候按键的text会显示为开始状态。
现在的问题是:当我每次让进度条自己增加到最大值以后在开始下一次点击的话是对的。但是,如果我在进度条没到达最大值的时候点击一次按键。(这个时候我将进度条值设置为最大,定时器也停止,按键显示开始)。当我再次点击按键让进度条开始的时候,进度条的增加速度会比正常的快一倍,当我再中途点击按键再重新开始的时候会再快一倍!!!求原因,就给力啊!!!代码如下:
int i= 0;
int xx=0;
void MainWindow::Start_Scan()
{
    Time = new QTimer;
    spinBox->setRange(10,2000);
    temp = spinBox->value();
    spinBox->setEnabled(true);
    plan->setRange(0,temp-1);
    if(xx%2 <= 0)
    {
        Time->start(1000);
        connect(Time, SIGNAL(timeout()), this, SLOT(plan_show()));
        Start->setText("Stop Scan");
        plan->setValue(0);
        T->setText("0");
        i=0;
        xx++;
     }
     else
     {
         Start->setText("Start Scan");
         Time->stop();
         plan->setValue(temp-1);
         T->setText(QString::number(temp));
         xx++;
         i = temp;
     }
}

void MainWindow::plan_show()
{
    //qDebug() << i << 1;
    if(i<temp)
    {
        plan->setValue(++i);
        T->setText(QString::number(i));
        //qDebug() << i << 2;
    }
    else
    {
        Time->stop();
        //delete Time;
        Start->setText("Start Scan");
        xx++;
    }
}
离线zjfshowtime
只看该作者 1楼 发表于: 2011-03-29
sf !我也是菜鸟,刚开始学qt。感觉你再次点击时没有将那些数据初始化!也请教高手指教
离线zjfshowtime
只看该作者 2楼 发表于: 2011-03-29
不知道说的对不对啊,高手指教
离线83888788
只看该作者 3楼 发表于: 2011-03-29
初步猜想是因为你点一次按键就出一个新的timer,源代码不全,不好判断啊
离线aishang
只看该作者 4楼 发表于: 2011-03-29
回 2楼(zjfshowtime) 的帖子
你说的再次是那次?是进度条在递增是我点击按键中断嘛?     else
     {
         Start->setText("Start Scan");
         Time->stop();
         plan->setValue(temp-1);
         T->setText(QString::number(temp));
         xx++;
         i = temp;
     }
这个是初始化。如果是中断以后再次点击开始进度条的话会回到
    if(xx%2 <= 0)
    {
        Time->start(1000);
        connect(Time, SIGNAL(timeout()), this, SLOT(plan_show()));
        Start->setText("Stop Scan");
        plan->setValue(0);
        T->setText("0");
        i=0;
        xx++;
     }
离线梅克斯
只看该作者 5楼 发表于: 2011-03-29
因为原来的信号的连接连接了很多次,connect这个语句不要一直执行.
楼主试试
离线aishang
只看该作者 6楼 发表于: 2011-03-29
回 3楼(83888788) 的帖子
我也这样想过。可是每次中断的时候我的定时器都close了啊?求原因?
离线aishang
只看该作者 7楼 发表于: 2011-03-29
回 3楼(83888788) 的帖子
不对,是stop了。代码都在了啊!定时器是在头文件里面定义的。QTimer *Time;想问下Time如何去掉?
离线zjfshowtime
只看该作者 8楼 发表于: 2011-03-29
你能把前面的头文件也发过来么,或者是控件objectName,
离线aishang
只看该作者 9楼 发表于: 2011-03-29
回 8楼(zjfshowtime) 的帖子
QTimer *Time;
QSpinBox *spinBox;
QPushButton *Start;
QProgressBar *plan;
    QLabel *T;
    QLabel *S;
以上是头文件里面的
int temp;(全局的,和i,xx是一样的)
离线aishang
只看该作者 10楼 发表于: 2011-03-29
回 5楼(梅克斯) 的帖子
这个如何试啊?不要多吃连接connect()?还是?我菜鸟级啊!大哥给具体点啊!!!求指教!!!
离线梅克斯
只看该作者 11楼 发表于: 2011-03-29
回 10楼(aishang) 的帖子
就是把connect那个语句写到外面去,别写在循环里
离线aishang
只看该作者 12楼 发表于: 2011-03-29
回 11楼(梅克斯) 的帖子
谢谢兄弟,问题搞定。我放在主函数里面就可以了。高手就是高手啊!再次感谢!
离线aishang
只看该作者 13楼 发表于: 2011-03-29
回 11楼(梅克斯) 的帖子
高手要有时间再帮一个忙呗http://www.qtcn.org/bbs/read.php?tid=35293谢谢了
离线zjfshowtime
只看该作者 14楼 发表于: 2011-03-29
楼主,我刚才把你发的代码编译了一遍,又加了一个button的onclick槽,貌似没问题啊,就是要多按一下就可以了!速度什么的都没有问题的!!!你自己关掉程序,重新编译运行下试试吧
离线aishang
只看该作者 15楼 发表于: 2011-03-29
问题已经搞定,是按照11楼得做的。谢谢大家支持。
离线83888788
只看该作者 16楼 发表于: 2011-03-30
我实现了一下,不知道是不是楼主的意思
源代码如下
main.cpp
  1. #include"spinbox.h"
  2. int main(int argc,char*argv[])
  3. {
  4.     QApplication app(argc,argv);
  5.     Example e;
  6.     e.show();
  7.     return app.exec();
  8. }




spinbox.h
  1. #ifndef SPINBOX_H
  2. #define SPINBOX_H
  3. #include<QtGui>
  4. class Example:public QWidget
  5. {
  6.     Q_OBJECT
  7. public:
  8.     Example(QWidget *parent=0);
  9. protected slots:
  10.     void slotSpinBoxValueChanged(int value);
  11.     void slotButtonClicked();
  12.     void slotTimerTimeOut();
  13.     void slotProgressBarValueChanged(int value);
  14. private:
  15.     QSpinBox *spinBox;
  16.     QProgressBar *progressBar;
  17.     QTimer *timer;
  18.     QPushButton *button;
  19. };




spinbox.cpp
  1. #include "spinbox.h"
  2. Example::Example(QWidget *parent):QWidget(parent)
  3. {
  4.     spinBox=new QSpinBox(this);
  5.     progressBar=new QProgressBar(this);
  6.     timer=NULL;
  7.     button=new QPushButton("start",this);
  8.     spinBox->setRange(10,1000);
  9.     progressBar->setRange(0,100);
  10.     QVBoxLayout *layout=new QVBoxLayout;
  11.     layout->addWidget(progressBar);
  12.     layout->addWidget(spinBox);
  13.     layout->addWidget(button);
  14.     this->setLayout(layout);
  15.     connect(spinBox,SIGNAL(valueChanged(int)),this,SLOT(slotSpinBoxValueChanged(int)));
  16.     connect(button,SIGNAL(clicked()),this,SLOT(slotButtonClicked()));
  17.     connect(progressBar,SIGNAL(valueChanged(int)),this,SLOT(slotProgressBarValueChanged(int)));
  18. }
  19. void Example::slotSpinBoxValueChanged(int value)
  20. {
  21.     progressBar->setRange(0,value);
  22. }
  23. void Example::slotButtonClicked()
  24. {
  25.     if(button->text()=="start")
  26.     {
  27.         button->setText("pause");
  28.         spinBox->setDisabled(true);
  29.         timer=new QTimer(this);
  30.         timer->setInterval(100);
  31.         timer->start();
  32.         connect(timer,SIGNAL(timeout()),this,SLOT(slotTimerTimeOut()));
  33.     }
  34.     else
  35.     {
  36.         button->setText("start");
  37.         disconnect(timer,SIGNAL(timeout()),this,SLOT(slotTimerTimeOut()));
  38.         timer->stop();
  39.         timer->deleteLater();
  40.         timer=NULL;
  41.     }
  42. }
  43. void Example::slotProgressBarValueChanged(int value)
  44. {
  45.     if(value==progressBar->maximum())
  46.     {
  47.         button->setText("start");
  48.         spinBox->setEnabled(true);
  49.         disconnect(timer,SIGNAL(timeout()),this,SLOT(slotTimerTimeOut()));
  50.         timer->stop();
  51.         timer->deleteLater();
  52.         timer=NULL;
  53.         progressBar->setValue(0);
  54.     }
  55. }
  56. void Example::slotTimerTimeOut()
  57. {
  58.     progressBar->setValue(progressBar->value()+1);
  59. }





随便测试了一下
楼主可以试试
离线aishang
只看该作者 17楼 发表于: 2011-04-03
回 16楼(83888788) 的帖子
谢谢,问题搞定了!
快速回复
限100 字节
 
上一个 下一个