【问题标题】:Proper click event正确的点击事件
【发布时间】:2016-02-27 16:11:19
【问题描述】:

我有像question这样的按钮的无边框表单

问题是我不能点击按钮。它仅在我执行双击而不更改按钮位置时才有效。如何检查我执行点击(而不是拖动)的用户?

代码来了:

bool LoginForm::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QMouseEvent::MouseButtonPress)
    {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
        if (obj == ui.loginButton)
        {
            QPoint absPos = ui.loginButton->mapToParent(QPoint(0, 0));
            m_dragPosition = (mouseEvent->pos() + absPos);
            return true;
        }
    }
    return false;
}

void LoginForm::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {   
        m_dragPosition = event->globalPos() - frameGeometry().topLeft();
        event->accept();
    }
}

void LoginForm::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton)
    {
        QPoint coord = event->globalPos() - m_dragPosition;
        move(coord);
        event->accept();
    }
}

【问题讨论】:

    标签: c++ qt user-interface window borderless


    【解决方案1】:

    如何检查用户是否正在执行点击(而不是拖动)?

    应该更容易。不要从您的按钮中窃取事件。这种方法是从 Qt 示例中借用的:Music Player。详情请见musicplayer.cpp

    void LoginForm::mousePressEvent(QMouseEvent *event)
    {
        m_dragPosition = event->globalPos() - pos();
        event->accept();
    }
    
    
    void LoginForm::mouseMoveEvent(QMouseEvent *event)
    {
        move(event->globalPos() - m_dragPosition);
        event->accept();
    }
    
    
    void LoginForm::mouseReleaseEvent(QMouseEvent *event)
    {
        m_dragPosition = QPoint();
        event->accept();
    }
    

    【讨论】:

    • 如果我这样做并尝试拖动按钮,表单会像链接问题一样抖动
    • 你说问题出在点击上。该示例更多的是用户对 UI 的期望。用于单击而不用于拖动的按钮。
    【解决方案2】:

    最简单的方法是禁止在 buttonbool 上拖动鼠标

    LoginForm::LoginForm(QWidget *parent)
        : QWidget(parent)
    {
        ...
        m_isDragButton = false;
    } 
    
    LoginForm::eventFilter(QObject *obj, QEvent *event)
    {
        if (event->type() == QMouseEvent::MouseButtonPress)
        {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
            if (obj == ui.loginButton)
                m_isDragButton = true;
        }
        return false;
    }
    void LoginForm::mousePressEvent(QMouseEvent *event)
    {
        if (event->button() == Qt::LeftButton)
        {   
            m_dragPosition = event->globalPos() - frameGeometry().topLeft();
            event->accept();
        }
    }
    
    void LoginForm::mouseMoveEvent(QMouseEvent *event)
    {
        if (!m_isDragButton)
            if (event->buttons() & Qt::LeftButton)
            {
                QPoint coord = event->globalPos() - m_dragPosition;
                move(coord);
                event->accept();
            }
    }
    
    void LoginForm::mouseReleaseEvent(QMouseEvent *event)
    {
        m_isDragButton = false;
        m_dragPosition = QPoint();
        event->accept();
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多