海南手机网站建设公司,创建网站免费,如何弄网站排名,搞好姓氏源流网站建设文章目录 摘要实现思路键盘鼠标监控百度到的方法我的自己方法 最后 关键字#xff1a;
Qt、
Qml、
QInputEvent 、
QStandardItem、
eventFilter 摘要
今日需求#xff1a;
项目中需要实时检测用户是否长时间为操作键盘和鼠标#xff0c;如果超过预设时间未操作键盘和… 文章目录 摘要实现思路键盘鼠标监控百度到的方法我的自己方法 最后 关键字
Qt、
Qml、
QInputEvent 、
QStandardItem、
eventFilter 摘要
今日需求
项目中需要实时检测用户是否长时间为操作键盘和鼠标如果超过预设时间未操作键盘和鼠标则退出到锁屏界面准确的说是启动屏保当用户再次操作键盘或鼠标则进去登录界面及实现长时间未操作键盘鼠标就锁屏的功能。
实现思路 大致的实现想法如上图所示就是启动一个QTimer定时器输入参数就是要规定的微操作时间如果到时间没有检测到键盘和鼠标的操作就出发屏幕保护程序接着持续监听如果依旧为监测到键盘和鼠标操作那就一直停留在屏保画面如果有键盘或鼠标操作那就进入到登录界面。如果检测到了键盘或鼠标操作那就重置定时器是定时器重新开始计时。
题外话
这里因为我的时间是一个大致的时间范围对时间的精确是要求其实没有多高所以这里就直接使用了QTimer但是Qt的定时器那精确性是出了名的所以在对精确性要求比较高的场景下可以使用其他方式实现定时器而不用Qt自带的定时器。
键盘鼠标监控
百度到的方法
这个就有好多了 可知直接重写键鼠事件这个网上一大堆示例代码如下
class MyWidget : public QWidget {
public: MyWidget(QWidget *parent nullptr) : QWidget(parent) { setMouseTracking(true); setFocusPolicy(Qt::StrongFocus); } void handleMousePressEvent(QMouseEvent *event) override { if (event-button() Qt::LeftButton) { // 处理鼠标左键按下事件 } else if (event-button() Qt::RightButton) { // 处理鼠标右键按下事件 } else if (event-button() Qt::MiddleButton) { // 处理鼠标中键按下事件 } } void handleMouseMoveEvent(QMouseEvent *event) override { // 处理鼠标移动事件 } void handleMouseReleaseEvent(QMouseEvent *event) override { if (event-button() Qt::LeftButton) { // 处理鼠标左键释放事件 } else if (event-button() Qt::RightButton) { // 处理鼠标右键释放事件 } else if (event-button() Qt::MiddleButton) { // 处理鼠标中键释放事件 } } void handleKeyPressEvent(QKeyEvent *event) override { if (event-key() Qt::Key_Space) { // 处理空格键按下事件 } else if (event-key() Qt::Key_Enter) { // 处理回车键按下事件 } else if (event-key() Qt::Key_Backspace) { // 处理退格键按下事件 } } private: QPoint lastPos_{};
};
或者使用QInputEvent 和QStandardItem ,示例代码如下
监测键盘事件:
void MainWindow::on_pushButton_clicked() { QStandardItem *standardItem new QStandardItem(0); table-appendRow(standardItem); connect(table-model(), QTableModel::rowInserted, this, MainWindow::updateNum);
}void MainWindow::updateNum(const QModelIndex index) { if (index.row() 0) { QStandardItem *standardItem static_castQStandardItem*(index.internalPointer()); connect(standardItem, QStandardItem::textChanged, this, []() { qDebug() Key released: standardItem-text(); }); }
}
监测鼠标事件:
void MainWindow::on_pushButton_clicked() { QStandardItem *standardItem new QStandardItem(0); table-appendRow(standardItem); connect(table-model(), QTableModel::rowInserted, this, MainWindow::updateNum);
}void MainWindow::updateNum(const QModelIndex index) { if (index.row() 0) { QStandardItem *standardItem static_castQStandardItem*(index.internalPointer()); connect(standardItem, QStandardItem::textChanged, this, []() { qDebug() Mouse released: standardItem-text(); }); }
}
我的自己方法
但是上面都不是我想要的还是太复杂我仅仅想要的就是检测键盘和鼠标操作至于操作了什么我并不关心。所以我开辟的新的方法。我这里使用了Qt 的事建过滤器eventFilter
1 首先安装全局事件过滤器
这我们需要给我们的QApplication安装事建过滤器代码如下
QApplication::instance()-installEventFilter(this);2 在事件过滤器中监听键盘事件和鼠标事件
我们在事件过滤器中只需要比较事件是否为键盘事件或鼠标事件代码如下 /*** 捕获键盘事件**/if(event-type() QEvent::KeyPress || event-type() QEvent::MouseMove || event-type() QEvent::MouseButtonPress){m_lockScreenTimer-start(m_timerLong);setLockScreen(false);}如上述代码我监听了键盘按下事件、鼠标移动事件和鼠标按键按下事件。并且在监听到这三个事件中的其中一个的时候就重置了定时器并且锁屏标志位置位了false
3 实现定时器到时间触发锁屏信号
connect(m_lockScreenTimer,QTimer::timeout,this,[](){setLockScreen(true);m_lockScreenTimer-stop();});上述代码如果到达预定时间这触发对应的槽函数这里我懒得写个函数了直接使用了Lambda表达式主要就是把锁屏标志位置位true,
4 使用Qt的属性系统
因为我参与的项目实际是QML项目所以这里就能体现所Qt属性系统的香了可以直接和QML 中的属性做无缝绑定。代码如下 Q_PROPERTY(bool lockScreen READ lockScreen WRITE setLockScreen NOTIFY lockScreenChanged)最后
因为是实际生产力业务代码不方便暂时完整代码仅分享一个思路供小伙伴们参考如果哪里有不懂的地方或者疑问可以直接留言问我就可以。