QT开发中文网

qt中单击事件和双击事件要发出不同的信号,那么双击事件势必会先发送单击事件信号后再发送双击事件的信号,那么如何使双击事件只发送双击事件的信号呢

在Qt中,可以通过重写事件处理函数来实现单击和双击事件的区分。以下是一个示例:

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr)
        : QWidget(parent)
    {
        setMouseTracking(true); // 开启鼠标跟踪以捕捉移动事件
    }

protected:
    void mousePressEvent(QMouseEvent *event) override
    {
        if (event->button() == Qt::LeftButton)
        {
            if (event->modifiers() & Qt::ControlModifier) // 判断是否按下了Ctrl键
            {
                emit doubleClickEvent(); // 发送双击事件信号
            }
            else
            {
                m_lastMousePressPos = event->pos(); // 记录上次点击位置
                m_lastMousePressTime = QDateTime::currentDateTime(); // 记录上次点击时间
            }
        }
        QWidget::mousePressEvent(event);
    }

    void mouseReleaseEvent(QMouseEvent *event) override
    {
        if ((event->button() == Qt::LeftButton) && (m_lastMousePressPos == event->pos()))
        {
            QDateTime currentTime = QDateTime::currentDateTime();
            qint64 elapsedTime = m_lastMousePressTime.msecsTo(currentTime); // 计算两次点击之间的时间间隔

            if (elapsedTime <= QApplication::doubleClickInterval()) // 如果时间间隔小于系统定义的双击时间阈值,则认为触发了双击事件
            {
                emit doubleClickEvent(); // 发送双击事件信号
                return;
            }
        }
        
        QWidget::mouseReleaseEvent(event);
    }

signals:
    void doubleClickEvent();

private:
    QPoint m_lastMousePressPos;
    QDateTime m_lastMousePressTime;
};

在这个示例中,我们通过重写mousePressEventmouseReleaseEvent函数来捕捉鼠标单击和释放事件。当按下鼠标左键时,如果同时按下了Ctrl键,则发送双击事件信号;否则,记录当前点击位置和时间。当释放鼠标左键时,检查是否与上次点击位置相同,并计算两次点击之间的时间间隔,如果满足系统定义的双击时间阈值,则认为触发了双击事件,并发送双击事件信号。

使用该自定义小部件时,可以连接到doubleClickEvent()信号来处理双击事件。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=3913

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?