Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检查按钮按下的时间?_C++_Qt - Fatal编程技术网

C++ 如何检查按钮按下的时间?

C++ 如何检查按钮按下的时间?,c++,qt,C++,Qt,我正在寻找一种方法来检查按钮被按下的时间!我的想法是启动一个计数器,当按下时计数器启动,当释放时计数器停止。但我目前不知道如何等待发布或类似事件。通常我会用插槽连接信号,但在这种情况下,两者都是插槽。也许你有个更好的主意也许这个主意已经足够好了。按下时。启动计时器。释放时,检查计时器已运行多长时间并停止。将经过的时间保存在类中的变量中 至少这是一种方法。按下时。启动计时器。释放时,检查计时器已运行多长时间并停止。将经过的时间保存在类中的变量中 这至少是一种方法。发送按下的信号时,启动计时器。发送

我正在寻找一种方法来检查按钮被按下的时间!我的想法是启动一个计数器,当按下时计数器启动,当释放时计数器停止。但我目前不知道如何等待发布或类似事件。通常我会用插槽连接信号,但在这种情况下,两者都是插槽。也许你有个更好的主意也许这个主意已经足够好了。

按下时。启动计时器。释放时,检查计时器已运行多长时间并停止。将经过的时间保存在类中的变量中

至少这是一种方法。

按下时。启动计时器。释放时,检查计时器已运行多长时间并停止。将经过的时间保存在类中的变量中

这至少是一种方法。

发送按下的信号时,启动计时器。发送释放信号时,读取计时器上经过的时间

<>这是一个完整的例子,使用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();
}
当然,您可以尖叫控制器,即使没有真正耦合到其他代码,仍然在某种程度上依赖于代码其余部分的设计。谢天谢地,不必如此:lambdas使简单的适应变得简单

我们也可以使用大型商业供应商提供的国外控制器:

// 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,重建项目,然后继续

当你发布问题的测试用例时,你应该往回走:你从答案末尾的某个地方开始,然后朝着最开始的最小设置前进。它还将帮助您更好地理解自己的代码,因为详细程度已降至最低。我希望,它告诉我们,第一个版本和最后一个版本具有相同的功能。

当按下的信号被发送时,启动计时器。发送释放信号时,读取计时器上经过的时间

<>这是一个完整的例子,使用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();
}
当然,您可以尖叫控制器,即使没有真正耦合到其他代码,仍然在某种程度上依赖于代码其余部分的设计。谢天谢地,不必如此:lambdas使简单的适应变得简单

我们也可以使用大型商业供应商提供的国外控制器:

// 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,重建项目,然后继续


当你发布问题的测试用例时,你应该往回走:你从答案末尾的某个地方开始,然后朝着最开始的最小设置前进。它还将帮助您更好地理解自己的代码,因为详细程度已降至最低。我希望,这说明第一个版本和最后一个版本具有相同的功能。

一个问题:如果您将两个信号相互连接,它的功能是什么?这就是我想的:它就像一条链子。一个信号发射另一个信号,另一个信号激活连接的插槽。@t命令您可以将信号连接到任何可调用的对象:方法或函子。将一个信号连接到一个信号仅仅意味着当第一个信号被发射时,第二个信号被调用并因此被发射。请记住,信号只是moc生成的方法。一个问题:如果您将两个信号相互连接,它的功能是什么?这就是我想的:它就像一条链子。一个信号发射另一个信号,另一个信号激活连接的插槽。@t命令您可以将信号连接到任何可调用的对象:方法或函子。将一个信号连接到一个信号仅仅意味着当第一个信号被发射时,第二个信号被调用并因此被发射。请记住,信号只是moc生成的方法。