Я думаю, что вы можете рассчитывать на использование QTimer , то есть когда пользователь нажимает кнопку, вы можете запустить некоторый экземпляр QTimer с указанным интервалом, а когда QTimer истечет время ожидания, затем активировать сигнал. В случае, если пользователь прерывает действие, QTimer можно просто сбросить, и тогда сигнал не сработает. Пример кода можно увидеть ниже. Тем не менее, это в C ++, но, возможно, это не будет проблемой для вас.
Итак, ниже приведено определение MainWindow:
#pragma once
#include <memory>
#include <QMainWindow>
namespace Ui
{
class MainWindow;
}
class MainWindow
: public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
virtual ~MainWindow();
signals:
void SomeTimerSignal(); // Signal we are eager to fire on the specific event.
public slots:
void ButtonPressed(); // Button is clicked down.
void ButtonReleased(); // Button is released.
void OnTimeout(); // Timeout handling slot.
private:
std::unique_ptr<Ui::MainWindow> m_ui; // UI mockup that is provided by Qt for us under the hood.
QTimer* m_buttonTimer; // The timer we are going to control.
};
А теперь сам код, реализующий это определение:
#include <QPushButton>
#include <QTimer>
#include <QVBoxLayout>
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, m_ui(new Ui::MainWindow())
{
m_ui->setupUi(this);
// We could have chosen to instantiate timers on each signal, but it is much more efficient
// to create an instance of it once, and then use it appropriately.
m_buttonTimer = new QTimer(this);
// OnTimeout will get triggered after 10 seconds.
m_buttonTimer->setInterval(10000);
connect(m_buttonTimer, &QTimer::timeout, this, &MainWindow::OnTimeout);
auto layout = new QVBoxLayout();
auto button = new QPushButton();
button->setText("Click and hold me!");
button->setFixedSize(150, 50);
layout->addWidget(button);
m_ui->centralWidget->setLayout(layout);
// Listen to button being pressed down: https://doc.qt.io/qt-5/qabstractbutton.html#pressed
connect(button, &QPushButton::pressed, this, &MainWindow::ButtonPressed);
// Listen to button being released: https://doc.qt.io/qt-5/qabstractbutton.html#released
connect(button, &QPushButton::released, this, &MainWindow::ButtonReleased);
}
MainWindow::~MainWindow()
{
// Button timer will be taken care by Qt through its' memory model.
}
void MainWindow::ButtonPressed()
{
// Start the timer when button is pressed.
m_buttonTimer->start();
}
void MainWindow::ButtonReleased()
{
// Stop the timer, but don't delete it, since it can be reused.
m_buttonTimer->stop();
}
void MainWindow::OnTimeout()
{
// On timeout, we stop the timer, so it would not be triggered all over again when not needed.
m_buttonTimer->stop();
// And we fire some wanted signal.
emit SomeTimerSignal();
}
Чтобы использовать этот код, вы, вероятно, захотите создать экземпляр приложения следующим образом:
#include "MainWindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Другими словами, это довольно простое приложение Qt на C ++, которое заполняется для вас при создании вашего первого проекта Qt, если вы используете Qt Creator. Надеюсь, этот код проясняет идею, как вы могли бы достичь того, что вы хотите. Если у вас есть еще вопросы, пожалуйста, задавайте их. Надеюсь, я смогу вам помочь.