Solved How to avoid clicking button twice in Qt
-
Hello !
I want to avoid clicking button twice during sometime.
I tried some method in the following
Method 1int clicktime = 0; void start() { ui->button->setEnabled(false); clicktime++; qDebug() << clicktime ; QThread::msleep(1000); ui->button->setEnabled(true); }
when I clicked the button many times quickly, the function will run many times slowly.
now I try to block the signals of button
Method 2
int clicktime = 0; void start() { ui->button->blocksignals(true); ui->button->setEnabled(false); clicktime++; qDebug() << clicktime ; QThread::msleep(1000); ui->button->setEnabled(true); ui->button->blocksignals(false); }
After I push the button many times, quickly, the function also run many times.
The result of Method 1 is the same with Method 2I tried to disconnected the button from function start.
It is not work.Could any one can help me or get me some suggestions?
Thanks in advance. -
If possible, do not use the sleep () function in the GUI. Thereby causing the GUI to be blocked.
See the following sample:
connect(ui->button, &QPushButton::clicked, [&]{ qDebug() << "clicked"; ui->button->setEnabled(false); QTimer::singleShot(1000, [&]{ ui->button->setEnabled(true); }); });
-
Thank you for your solution.
Your solution is work well in Qt 5.9.3, but there are some errors in Qt 5.3.2.
I find another solution is work OK, also
int clicktime = 0; void start() { ui->button->blocksignals(true); ui->button->setEnabled(false); clicktime++; qDebug() << clicktime ; QThread::msleep(1000); ui->button->setEnabled(true); ui->button->blocksignals(false); QCoreApplication::processEvents(QEventLoop::AllEvents, 1000); }
I think your method is batter.
I will study how to using your method in Qt 5.3.2thanks again.
LeonSu -
@LeonSu said in How to avoid clicking button twice in Qt:
QThread::msleep(1000);
Sorry, but anything which involves
QThread::msleep();
or::sleep()
, regardless of Qt version, is just wrong/bad/unusable/interferes unacceptably with user interaction. -
@LeonSu said in How to avoid clicking button twice in Qt:
I will study how to using your method in Qt 5.3.2
Just don't use lambda, use normal slot in older Qt versions instead...
-
@LeonSu
BTW, what is so special about preventing another click within 1 second? Why not half a second or 2 seconds or whatever? Is your actual intention to prevent a second click while the code for the first click is still executing? In which case, your re-enablement of the button should not be on some kind of timer but rather when the first click handler's code has completed? -
Your solution is work well in Qt 5.9.3, but there are some errors in Qt 5.3.2.
Qt 5.3.2 supports C++11. If the compiler supports it, add the following directive in your .pro file. I tested it with the Qt 5.3.2 / MinGW 4.8.2 version.
like this:
CONFIG += c++11
-
@jsulm
lambda can be compiled with C++11.
but I get the error message : "no matching function for call to 'QTimer::singleShot(int, MainWindow::bigbuttontest()<lambda()>'.....The Qt 5.3.2 does not support this method.
There are only two overloaded functions./ void singleShot(int msec, const QObject * receiver, const char * member) void singleShot(int msec, Qt::TimerType timerType, const QObject * receiver, const char * member)
In Qt 5.9.3 had ten overloaded functions
void singleShot(int msec, const QObject *receiver, const char *member) void singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member) void singleShot(int msec, const QObject *receiver, PointerToMemberFunction method) void singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, PointerToMemberFunction method) void singleShot(int msec, Functor functor) void singleShot(int msec, Qt::TimerType timerType, Functor functor) void singleShot(int msec, const QObject *context, Functor functor) void singleShot(int msec, Qt::TimerType timerType, const QObject *context, Functor functor) void singleShot(std::chrono::milliseconds msec, const QObject *receiver, const char *member) void singleShot(std::chrono::milliseconds msec, Qt::TimerType timerType, const QObject *receiver, const char *member)
@JonB
I try to avoid to clicking button twice during 1 second.@Devopia53
Qt 5.3.2 does not support this method. -