我正在尋找一種方法來檢查一個按鈕被按下多久!我的想法是啓動一個計數器,該計數器在pressed()
發射時開始,並在發射released()
時停止。但我目前不知道如何等待發布的或類似的事件。通常我會給connect()
帶插槽的信號,但在這種情況下都是插槽。也許你有一個更好的主意,也許這個是足夠好的。如何檢查按鈕按下的時間?
1
A
回答
4
當時pressed
。啓動一個計時器。當released
檢查定時器運行了多久(並停止它)。將經過的時間保存在類中的變量中。
這是至少做到這一點的一種方法。
4
當pressed
信號發送時,啓動定時器。當發送relesed
信號時,請閱讀定時器已經過了多長時間。
這是使用Qt 5一個完整的示例和C++編譯器,這不是史前:
// https://github.com/KubaO/stackoverflown/tree/master/questions/button-timer-38645219
#include <QtWidgets>
int main(int argc, char ** argv) {
QApplication app{argc, argv};
QWidget w;
QFormLayout layout{&w};
QPushButton button{"Press Me"};
QLabel label;
layout.addRow(&button);
layout.addRow(&label);
QElapsedTimer timer;
QObject::connect(&button, &QPushButton::pressed, [&]{ timer.start(); });
QObject::connect(&button, &QPushButton::released, [&]{
label.setText(QStringLiteral("Pressed for %1 ms").arg(timer.elapsed()));
});
w.show();
return app.exec();
}
當然你也可以推所有變量爲一類。您會注意到C++ 11使得這種轉換幾乎毫無疑問:它是設計而非巧合。
#include <QtWidgets>
class Widget : public QWidget {
QFormLayout layout{this};
QPushButton button{"Press Me"};
QLabel label;
QElapsedTimer timer;
public:
Widget() {
layout.addRow(&button);
layout.addRow(&label);
connect(&button, &QPushButton::pressed, [&]{ timer.start(); });
connect(&button, &QPushButton::released, [&]{
label.setText(QStringLiteral("Pressed for %1 ms").arg(timer.elapsed()));
});
}
};
int main(int argc, char ** argv) {
QApplication app{argc, argv};
Widget w;
w.show();
return app.exec();
}
人們普遍不贊成以在UI對象「商業邏輯」,所以我們可以在此功能中分離出來成爲一個Timer
的,一個Widget
和的Controller
。所有這些對象外部的代碼都建立了必要的連接。
#include <QtWidgets>
class Timer : public QObject {
Q_OBJECT
QElapsedTimer timer;
public:
Q_SLOT void start() { timer.start(); }
Q_SLOT void stop() { emit elapsed(timer.elapsed()); }
Q_SIGNAL void elapsed(qint64);
};
class Widget : public QWidget {
Q_OBJECT
QFormLayout layout{this};
QPushButton button{"Press Me"};
QLabel label;
public:
Widget() {
layout.addRow(&button);
layout.addRow(&label);
connect(&button, &QPushButton::pressed, this, &Widget::pressed);
connect(&button, &QPushButton::released, this, &Widget::released);
}
Q_SIGNAL void pressed();
Q_SIGNAL void released();
Q_SLOT void setText(const QString & text) { label.setText(text); }
};
class Controller : public QObject {
Q_OBJECT
public:
Q_SLOT void elapsed(qint64 ms) {
emit hasText(QStringLiteral("Pressed for %1 ms").arg(ms));
}
Q_SIGNAL void hasText(const QString &);
};
int main(int argc, char ** argv) {
QApplication app{argc, argv};
Timer t;
Widget w;
Controller c;
w.show();
//
QObject::connect(&w, &Widget::pressed, &t, &Timer::start);
QObject::connect(&w, &Widget::released, &t, &Timer::stop);
QObject::connect(&t, &Timer::elapsed, &c, &Controller::elapsed);
QObject::connect(&c, &Controller::hasText, &w, &Widget::setText);
return app.exec();
}
#include "main.moc"
當然,你可以尖叫控制器,即使沒有真正連接到其他的代碼,仍然一定程度上取決於代碼的其餘部分的設計。幸運的是,它不一定如此:lambda使簡單的適應變得簡單。
我們可以用一個「洋」控制器,通過我們的大企業供應商提供的,太:
// use Timer and Widget from preceding example
#include <sstream>
#include <string>
#include <functional>
class Controller {
public:
using callback_t = std::function<void(const std::string&)>;
Controller(callback_t && callback) : callback{std::move(callback)} {}
void onElapsed(int ms) {
std::stringstream s;
s << "Pressed for " << ms << " ms";
callback(s.str());
}
private:
callback_t callback;
};
int main(int argc, char ** argv) {
QApplication app{argc, argv};
Timer t;
Widget w;
Controller c{ [&](const std::string & s){ w.setText(QString::fromStdString(s)); } };
QObject::connect(&w, &Widget::pressed, &t, &Timer::start);
QObject::connect(&w, &Widget::released, &t, &Timer::stop);
QObject::connect(&t, &Timer::elapsed, [&](qint64 ms) { c.onElapsed(ms); });
w.show();
return app.exec();
}
#include "main.moc"
所有以上的例子是可編譯:把它們中的任何一個進入main.cpp
,重建項目,走。
當你發佈測試用例的問題時,你應該倒退:你從這個答案的末尾開始,開始工作,最小化安裝。它會幫助你更好地理解你自己的代碼,因爲冗長度最小化。這是說,我希望,第一個和最後一個版本都具有相同的功能。
相關問題
- 1. 檢測時間按鈕被按下
- 2. 如何檢測Arduino中按下按鈕的時間?
- 3. 檢查按鈕按下並輸入按
- 4. 如何再檢查一下按鈕
- 5. 如何檢測按鈕按下和iphone
- 6. 如何檢測一個按鈕按下?
- 7. 如何檢查NSSearchField的搜索按鈕1是否被按下
- 8. iPhone開發如何檢查通知的發射按鈕按下
- 9. 如何檢查,按下按鈕後,如果填充了TextField
- 10. 當按下音量按鈕時檢測
- 11. 按下主頁按鈕時檢測iOS
- 12. 如何檢測當在按鈕片斷android按下後按鈕?
- 13. Android多時間按鈕按下問題?
- 14. 可可觸摸 - 時間按鈕按下
- 15. 如何在長時間按下按鈕的同時打開一個帶有其他按鈕的矩形按鈕?
- 16. 如何檢測何時按下按鈕並在android上釋放
- 17. 在Swift 3.0中,如何檢查按下哪個按鈕
- 18. 如何檢查是否仍然按下(點擊)按鈕?
- 19. 如何檢查窗口按鈕是否被按下C++
- 20. 如何檢查'破壞性'按鈕是否被按下(UIActionSheet-iPhone)?
- 21. 如何檢查音量按鈕被按下並覆蓋功能?
- 22. 如何檢查按鈕是否被按下
- 23. 如何按鈕1時按下
- 24. 按下按鈕時如何顯示UIPickerView?
- 25. 如何按下按鈕取消超時?
- 26. 如何檢查單選按鈕時如何獲取單選按鈕的文本?
- 27. 如何檢測2個按鈕同時按下?
- 28. 如何在按下開始按鈕(Windows Phone)時按下「開始」按鈕(Windows Phone)
- 29. 如何更改按鈕圖像時,按下按鈕
- 30. 如何在沒有按鈕時按下按鈕?
感謝您的回答!我一直在考慮這一點,但我不知道如何保存其他方法/插槽的起點......我忘了一個類的基本屬性:一個簡單的成員變量 - , - – tistCoder