QT控件


事件

处理流程

  • QApplication 先得到 ==> 具体应该处理的窗口:event() ==> event() 根据消息的类型来调用具体的虚函数

  • 重载具体的虚函数来实现对消息的相应

  • 重载 event 函数来处理或截取消息

具体流程

  1. 在处理的类里重载事件

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = nullptr);

// *************** event **********************
//    bool event(QEvent *);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void keyPressEvent(QKeyEvent *event);

    void closeEvent(QCloseEvent *event);
    void hideEvent(QHideEvent *event);
    void paintEvent(QPaintEvent *event);
    void resizeEvent(QResizeEvent *event);

// *********************************************

    QPushButton *button;
    QPushButton *button1;

    QVBoxLayout *vlay;

    QTextEdit * edit;

    void sl_buttonChecked();

signals:

};

  1. 截断消息

    重载event函数来处理或者截取消息


bool MyWidget::event(QEvent *ev)
{
    if(ev->type() == QEvent::MouseButtonPress)
    {
        qDebug()<<"111";
        return QWidget::event(ev);
    }
}

  1. 重写 事件

    重载具体的虚函数来实现对消息的相应


void MyWidget::keyPressEvent(QKeyEvent *event)
{
    event->modifiers() ;
    int key = event->key();
    qDebug()<<key;
    char keys = key;
    qDebug()<<keys;

}

void MyWidget::mousePressEvent(QMouseEvent *event)
{
    QPoint pt = event->pos();
    qDebug()<<pt;
    if(event->button() == Qt::LeftButton)
    {
        qDebug()<<"left";
    }

    if(event->modifiers()== Qt::ShiftModifier)  //  修饰符shift
    {
        qDebug()<<"shift press";
    }
    if(event->modifiers() == Qt::ControlModifier)
    {
        qDebug()<<"control";
        return ;
    }
}   

  1. 注意事项

    • 鼠标事件在窗口上处理不包含按钮等部件 鼠标按下才会有反应

      解决方法:

        this->setMouseTracking(true);
* 键盘事件在主窗口上处理, 不会处理按键等

    解决方法: 设置 焦点 or 将按键设置默认

        button->setFocus(); //  设置焦点
        button->setDefault(true);   //  设为默认

事件过滤

  1. Widget 安装一个消息过滤器, 经过 Widget 的消息都要先经过 eventfilter

     button->installEventFilter(this);
  2. 重写 eventFilter 函数

     bool eventFilter(QObject *, QEvent *);
    
     bool MyWidget::eventFilter(QObject *o, QEvent *e)
     {
         if(((QPushButton *)_button == o ) &&
                 (e->type() == QEvent::MouseButtonRelease ||
                 e->type() == QEvent::MouseButtonDblClick||
                 e->type() == QEvent::MouseButtonPress))
         {
             return true;
         }
         return QWidget::eventFilter(o,e);
     }

文章作者: bySouffle
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 bySouffle !
  目录