2

だから私が欲しいのは、タイマーでプログレスバーをインクリメントすることです。しかし、どういうわけか、プログレスバーが必要以上に増加します。

メインウィンドウ.h:

Class MainWindow {
//...
private slots:
//...
    void update();
private:
    Ui::MainWindow *ui;
    QTimer *timer;
    unsigned int counter;
};

メインウィンドウ.cpp:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    counter = 0;
    connect(timer, SIGNAL(timeout()), this, SLOT( update() ) );
}

void MainWindow::on_actionStart_triggered()
{
    if( ui->txtTime->text().isEmpty() || (ui->txtTime->text().toInt() == 0) )
    {
        QMessageBox::warning(this, "Error", "Could not start the timer.", QMessageBox::Ok);
        return;
    }

    ui->cmdStart->setEnabled(false);
    timer->start(ui->txtTime->text().toInt() * 60000  / 60);
}


void MainWindow::update()
{
    counter++;
    ui->progressBar->setValue( counter ); //Should be incremented by one
    if( ui->progressBar->value() == 60 )
    {
        timer->stop();
        Phonon::MediaObject *music = Phonon::createPlayer(Phonon::MusicCategory,
                                                          Phonon::MediaSource( ":/Music/" + ui->chkMusic->currentText() ));
        music->play();  //Playing music
        delete timer;
    }
}

デバッガーで、プログレスバーの値が 6 であるのに対し、カウンターの値は 4 しかないことに気付きました。また、最初に 1、次に 2、次に 2、次に 1 というようにインクリメントします。私は何を間違っていますか?!

編集:プログレスバーだと思います。アクションを次のように変更しました。

void MainWindow::on_actionStart_triggered()
{
    if( ui->txtTime->text().isEmpty() || (ui->txtTime->text().toInt() == 0) )
    {
        QMessageBox::warning(this, "Error", "Could not start the timer.", QMessageBox::Ok);
        return;
    }

   // ui->cmdStart->setEnabled(false);
   // ui->progressBar->setMaximum( ui->txtTime->text().toInt() * 60 );
   // timer->start( 1000 );
    counter++;
    ui->progressBar->setValue( counter );
}

コメントアウトしたので、タイマーは開始されません。アクションボタンをクリックすると、常にプログレスバーが1、2、2、1の順にインクリメントされます。同じ動作です。だからタイマーじゃない!

4

1 に答える 1

1

QProgressBar の値 (minimum() と maximum() の間の整数) と、表示される進行状況のパーセンテージ (おおよそ (value-min)/(max-min)) が一致していないと思います。

フロア(1/60*100) = 1%

フロア(2/60*100) = 3%

フロア(3/60*100) = 5%

フロア(4/60*100) = 6%

したがって、value() を 1 ずつ増やすと、1%、2%、2%、1%... の順序でパーセンテージが増加します。

カウンターが 60 になったときに 60% を表示したい場合は、setMaximum(100) が必要です。

私は正しいですか?

于 2013-09-12T10:21:49.383 に答える