#include "mainwindow.h" #include #include #include #include #include #include #include #include #include EventLogger::EventLogger() {} bool EventLogger::eventFilter(QObject *, QEvent *pEvent) { switch (pEvent->type()) { case QEvent::TouchBegin: case QEvent::TouchUpdate: case QEvent::TouchEnd: { auto *touchEvent = static_cast(pEvent); emit log(QString("%1 - type: %2 - #points: %3") .arg(QDateTime::currentDateTime().toString("yyyyMMdd-hh:mm:ss.zzz")) .arg(pEvent->type()) .arg(touchEvent->points().size())); } break; default: break; } return false; } EventFilter::EventFilter(QPushButton *pPushButton) : m_pButton(pPushButton) {} bool EventFilter::eventFilter(QObject *pWatched, QEvent *pEvent) { if (m_pButton != pWatched) { return false; } switch (pEvent->type()) { case QEvent::TouchBegin: { emit log("processing events for 2s without user input"); auto tp = std::chrono::steady_clock::now() + std::chrono::seconds(2); while (std::chrono::steady_clock::now() < tp) { QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); std::this_thread::sleep_for(std::chrono::milliseconds(100)); } return false; } default: break; } return false; } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QWidget* pWidget = new QWidget(this); setCentralWidget(pWidget); QGridLayout* pLayout = new QGridLayout(this); pWidget->setLayout(pLayout); QPushButton* pButton = new QPushButton("Double tap here 1st", this); pButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); pButton->setAttribute(Qt::WA_AcceptTouchEvents); pLayout->addWidget(pButton, 0, 0); QLabel* pLabel = new QLabel("Touch here next", this); pLabel->setAlignment(Qt::AlignCenter); pLayout->addWidget(pLabel,0,1); QListWidget* pListWidget = new QListWidget(this); QFont f; f.setFamily("Courier"); pListWidget->setFont(f); pLayout->addWidget(pListWidget, 1, 0, 1, 2); EventLogger* pLogger = new EventLogger(); qApp->installEventFilter(pLogger); connect(pLogger, &EventLogger::log, this, [pListWidget](const QString& s){ pListWidget->addItem(s); pListWidget->scrollToBottom(); }); EventFilter* pFilter = new EventFilter(pButton); pButton->installEventFilter(pFilter); connect(pFilter, &EventFilter::log, this, [pListWidget](const QString& s){ pListWidget->addItem(s); pListWidget->scrollToBottom(); }); resize(500,500); } MainWindow::~MainWindow() { }