How to display the result of an operation in incremental fashion strating from 0?
-
- Ex: Multiplication of two numbers results in 200. I want to display the result from 0 to 200 in an incremental fashion.
The code which I used is:
void MainWindow::on_controlButton_clicked() { double num1 = ui->num1->value(); double num2 = ui->num2->value(); double product= num1*num2; int temp=0; for(int i = 0; i<product; i++){ temp++; ui->product->display(temp); } }
- Ex: Multiplication of two numbers results in 200. I want to display the result from 0 to 200 in an incremental fashion.
-
- Ex: Multiplication of two numbers results in 200. I want to display the result from 0 to 200 in an incremental fashion.
The code which I used is:
void MainWindow::on_controlButton_clicked() { double num1 = ui->num1->value(); double num2 = ui->num2->value(); double product= num1*num2; int temp=0; for(int i = 0; i<product; i++){ temp++; ui->product->display(temp); } }
@Santhoshpl You did not write what the problem is, but I think I know what happens: you see the result only when the loop finishes, right? Not while it runs. The problem is: the for-loop is blocking the Qt event loop as long as it is running, so the UI will not be updated until the loop finishes.
Or do you mean that you only see the last result? If this is the case than please tell us what ui->product is and what ui->product->display does.
- Ex: Multiplication of two numbers results in 200. I want to display the result from 0 to 200 in an incremental fashion.
-
- Ex: Multiplication of two numbers results in 200. I want to display the result from 0 to 200 in an incremental fashion.
The code which I used is:
void MainWindow::on_controlButton_clicked() { double num1 = ui->num1->value(); double num2 = ui->num2->value(); double product= num1*num2; int temp=0; for(int i = 0; i<product; i++){ temp++; ui->product->display(temp); } }
hi
@Santhoshpl said in How to display the result of an operation in incremental fashion strating from 0?:double num1 = ui->num1->value();
double num2 = ui->num2->value();
double product= num1*num2;
int temp=0;
for(int i = 0; i<product; i++){
temp++;
ui->product->display(temp);you can use QTimer for that
double num1 = 10; double num2 = 2; double product = num1*num2; int currentDisplay=0; //< QTimer *timer = new QTimer(); QObject::connect(timer, &QTimer::timeout,[&](){ if(currentDisplay>=product){ timer->stop(); } qDebug()<<currentDisplay; // ui->product->display(temp); if(currentDisplay<product)currentDisplay++; }); timer->start(50);
- Ex: Multiplication of two numbers results in 200. I want to display the result from 0 to 200 in an incremental fashion.
-
@Santhoshpl You did not write what the problem is, but I think I know what happens: you see the result only when the loop finishes, right? Not while it runs. The problem is: the for-loop is blocking the Qt event loop as long as it is running, so the UI will not be updated until the loop finishes.
Or do you mean that you only see the last result? If this is the case than please tell us what ui->product is and what ui->product->display does.
@jsulm Yes, you are right. I am seeing only the end result after the loop exits.
I want to update the UI as it runs. The ui->product->display(product) displays the result in the UI. -
@jsulm Yes, you are right. I am seeing only the end result after the loop exits.
I want to update the UI as it runs. The ui->product->display(product) displays the result in the UI.@Santhoshpl So try @LeLev's suggested code.
-
hi
@Santhoshpl said in How to display the result of an operation in incremental fashion strating from 0?:double num1 = ui->num1->value();
double num2 = ui->num2->value();
double product= num1*num2;
int temp=0;
for(int i = 0; i<product; i++){
temp++;
ui->product->display(temp);you can use QTimer for that
double num1 = 10; double num2 = 2; double product = num1*num2; int currentDisplay=0; //< QTimer *timer = new QTimer(); QObject::connect(timer, &QTimer::timeout,[&](){ if(currentDisplay>=product){ timer->stop(); } qDebug()<<currentDisplay; // ui->product->display(temp); if(currentDisplay<product)currentDisplay++; }); timer->start(50);
@LeLev Thank you for the solution, but its crashing.
The error message displayed is:
The program has unexpectedly finished.
The process was ended forcefully.
productApplication.exe is crashed -
@LeLev Thank you for the solution, but its crashing.
The error message displayed is:
The program has unexpectedly finished.
The process was ended forcefully.
productApplication.exe is crashed@Santhoshpl said in How to display the result of an operation in incremental fashion strating from 0?:
crash
can you please show your code ?
-
@Santhoshpl said in How to display the result of an operation in incremental fashion strating from 0?:
crash
can you please show your code ?
@LeLev please find the below code:
void MainWindow::on_controlButton_clicked()
{
double num1 = ui->num1->value();
double num2 = ui->num2->value();
double product = num1 * num2;
double currentDisplay=0;
QTimer *timer = new QTimer();
QObject::connect(timer, &QTimer::timeout,&{
if(currentDisplay>=product){
timer->stop();
}
ui->product->display(currentDisplay);
QApplication::processEvents();
if(currentDisplay<meetingCost)currentDisplay++;
});
timer->start(500);
}
} -
@LeLev please find the below code:
void MainWindow::on_controlButton_clicked()
{
double num1 = ui->num1->value();
double num2 = ui->num2->value();
double product = num1 * num2;
double currentDisplay=0;
QTimer *timer = new QTimer();
QObject::connect(timer, &QTimer::timeout,&{
if(currentDisplay>=product){
timer->stop();
}
ui->product->display(currentDisplay);
QApplication::processEvents();
if(currentDisplay<meetingCost)currentDisplay++;
});
timer->start(500);
}
}@Santhoshpl
It helps others if you put literal code in this forum's code markers.Meanwhile, I don't know, @Lelev writes
QObject::connect(timer, &QTimer::timeout,[&](){
while you write
QObject::connect(timer, &QTimer::timeout,&{
so do you know what you're doing there with your lambda? Is there any reason you change his code for this?
Otherwise run under debugger and look at the context/stack trace when the crash occurs.
-
@JonB said in How to display the result of an operation in incremental fashion strating from 0?:
[&]
Please take a c++ book about lambdas - you're passing by reference and it will therefore go out of scope...
-
@Gerd said in How to display the result of an operation in incremental fashion strating from 0?:
QApplication::processEvents();
This is an ugly work-around and should be avoided. It is better to program in asynchronous way instead of calling processEvents().
-
lol
then you should tell the qt people to remove such examples from the examples in qt sources...@Gerd said in How to display the result of an operation in incremental fashion strating from 0?:
then you should tell the qt people to remove such examples from the examples in qt sources...
you're right, it shouldn't be there, can you name/link such an example?
-
Qt\5.12.6.src\qtbase\examples\widgets\dialogs\findfiles
Qt\5.12.6.src\qtbase\examples\widgets\itemviews\pixelator
Qt\5.12.6.src\qtbase\examples\widgets\painting\fontsampler -
for these it isnt in the doc pages but in the sourcecode..
pixelator
fontsampler@Gerd
Well these examples haven't been touched in years, are very basic but never the less badly designed.One can redesign those examples, without the need for a processEvent calls, which will make them bigger (source code size).
But IMHO that's something that should be done. -
hi
@Santhoshpl said in How to display the result of an operation in incremental fashion strating from 0?:double num1 = ui->num1->value();
double num2 = ui->num2->value();
double product= num1*num2;
int temp=0;
for(int i = 0; i<product; i++){
temp++;
ui->product->display(temp);you can use QTimer for that
double num1 = 10; double num2 = 2; double product = num1*num2; int currentDisplay=0; //< QTimer *timer = new QTimer(); QObject::connect(timer, &QTimer::timeout,[&](){ if(currentDisplay>=product){ timer->stop(); } qDebug()<<currentDisplay; // ui->product->display(temp); if(currentDisplay<product)currentDisplay++; }); timer->start(50);
@LeLev
I just read your response and it seemed what I need as well.
However, I just get a crash with this code:I have been having the same problems as the OP (and everyone else, I guess)
This code snippet is just for testing messages written to a QPlainTextEdit widget, nothing else.void MainWindow::writeLeft() { int32_t cnt = 100; QString msg, cno; QTimer *ltimer = new QTimer(); do{ QTextStream(&cno) << cnt; msg = ("Hello left no : "+ cno); //message has been constructed, stop the process and display it QObject::connect(ltimer, &QTimer::timeout,[&](){ if(cnt > 0){ ltimer->stop(); } ui->memo1->appendPlainText(msg); }); cno.clear(); QThread::sleep(1); ltimer->start(10); cnt--; }while(cnt > 0); }
If I remove the QTimer statements then I just get the whole lot dumped to the QPlainTextEdit in one go.