精华内容
下载资源
问答
  • 本文主要总结在Qt5.9中的鼠标事件,该事件包括鼠标进入控件事件、鼠标离开控件事件、控件内摁下鼠标事件、控件内释放鼠标事件。 实现鼠标进入、离开、摁下、释放控件的事件,只需要改写事件过滤虚函数eventFilter()...

    本文主要总结在Qt5.9中的鼠标事件,该事件包括鼠标进入控件事件、鼠标离开控件事件、控件内摁下鼠标事件、控件内释放鼠标事件。

    实现鼠标进入、离开、摁下、释放控件的事件,只需要改写事件过滤虚函数eventFilter()就可以实现。

     

    具体的步骤如下所述:

    a1.首先注册目标控件,也就是将目标控件加入事件过滤器,用一个函数即可搞定:QPushbutton::installEventFilter(QObject *filterObj);

    a2.然后重写虚函数事件过滤虚函数bool eventFilter(QObject *watched, QEvent *event),注意重写后,最后一定要添加一句返回值return QWidget::eventFilter(watched, event),否则注册的控件显示不出来;

    a3.在事件过滤器虚函数内,用watched变量判断是否监控到控件(即watched==button);

    a4.监控到控件后,用变量event判断当前鼠标事件是哪种事件,然后做对应的操作,做完后返回true;

    比如是进入控件事件(event->type() == QEvent::Enter);

    比如是离开控件事件(event->type() == QEvent::Leave);

    比如是控件内摁下鼠标事件(event->type() == QEvent::MouseButtonPress);

    比如是控件内释放鼠标事件(event->type() == QEvent::MouseButtonRelease);

    a5.最后操作执行完后,一定要在末尾添加这条返回语句return QWidget::eventFilter(watched, event),否则注册的控件显示不出来。

     

    具体的代码如下:

    1.1新建一个widget工程,不要勾选ui界面。然后分别在widget.h,widget.cpp,main.cpp分别添加如下代码。

    widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QPushButton>
    #include <QEvent>
    #include <QMouseEvent>
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = 0);
        ~Widget();
    
    protected:
        bool eventFilter(QObject *watched, QEvent *event);
    
    private:
        void setupUI();
        QPushButton *button;
    };
    
    #endif // WIDGET_H
    

     

    widget.cpp

    #include "widget.h"
    #include <QVBoxLayout>
    #include <QDebug>
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
    {
        //窗口UI界面初始化
        setupUI();
    }
    
    Widget::~Widget()
    {    
    }
    
    bool Widget::eventFilter(QObject *watched, QEvent *event)
    {
        if(watched == button)
        {
            if(event->type() == QEvent::Enter)
            {
                /*鼠标进入按钮事件*/
                qDebug()<<tr("监控到按钮事件,鼠标进入按钮事件");
                return true;
            }
            else if(event->type() == QEvent::Leave)
            {
                /*鼠标离开按钮事件*/
                qDebug()<<tr("监控到按钮事件,鼠标离开按钮事件");
                return true;
            }
            else if(event->type() == QEvent::MouseButtonPress)
            {
                /*鼠标摁下按钮事件*/
                qDebug()<<tr("监控到按钮事件,鼠标摁下按钮事件");
                return true;
            }
            else if(event->type() == QEvent::MouseButtonRelease)
            {
                /*鼠标释放按钮事件*/
                qDebug()<<tr("监控到按钮事件,鼠标释放按钮事件");
                return true;
            }
    
        }
        return QWidget::eventFilter(watched, event);
    }
    
    void Widget::setupUI()
    {
        /*注册按钮事件,也即是将按钮加入事件过滤器*/
        button = new QPushButton("button");
        button->installEventFilter(this);
    
        QVBoxLayout *mainLayout = new QVBoxLayout();
        mainLayout->addWidget(button);
        mainLayout->addStretch();
        this->setLayout(mainLayout);
    }
    

     

    main.cpp

    #include "widget.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.resize(960,640);
        w.setWindowTitle(QString::fromUtf8("鼠标事件:进入控件事件、离开控件事件、控件内摁下鼠标事件、控件内释放鼠标事件"));
        w.show();
    
        return a.exec();
    }
    

     

    1.2程序构建和运行后,结果如下图所示:

     

     

     

    参考内容:

    https://blog.csdn.net/zhenyu5211314/article/details/25599085(参考:鼠标进入控件和离开控件事件)

    https://blog.csdn.net/xiezhongyuan07/article/details/80676047(参考:重写虚函数后,不显示按钮问题,需要返回上层)

    https://blog.csdn.net/yu275184637/article/details/22865015(参考:鼠标进入控件内摁下和释放事件)

    展开全文
  • Qt安装事件过滤器、过滤子控件事件、截获控件按键、鼠标事件 Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他QObject对象的事件,在事件到达之前对其进行处理。 假设我们有一个CustomerInfoDialog...

    Qt安装事件过滤器、过滤子控件事件、截获控件按键、鼠标事件

    Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他QObject对象的事件,在事件到达之前对其进行处理。

    假设我们有一个CustomerInfoDialog控件,由一些QLineEdit控件组成。我们希望使用Space键得到下一个QLineEdit的输入焦点。一个最直接的方法是继承QLineEdit重写keyPressEvent()函数,当点击了Space键时,调用focusNextChild()

    void MyLineEdit::keyPressEvent(QKeyEvent *event)

    {

        if (event->key() == Qt::Key_Space) {

            focusNextChild();

        } else {

            QLineEdit::keyPressEvent(event);

        }

    }

    这个方法有一个最大的缺点:如果我们在窗体中使用了很多不同类型的控件(QComboBoxQSpinBox等等),我们也要继承这些控件,重写它们的keyPressEvent()。一个更好的解决方法是让CustomerInfoDialog监视其子控件的键盘事件,在监视代码处实现以上功能。这就是事件过滤的方法。实现一个事件过滤包括两个步骤:

    1. 在目标对象上调用installEventFilter(),注册监视对象。
    2. 在监视对象的eventFilter()函数中处理目标对象的事件。

    注册监视对象的位置是在CustomerInfoDialog的构造函数中:

    CustomerInfoDialog::CustomerInfoDialog(QWidget *parent)

        : QDialog(parent)

    {

        ...

        firstNameEdit->installEventFilter(this);

        lastNameEdit->installEventFilter(this);

        cityEdit->installEventFilter(this);

        phoneNumberEdit->installEventFilter(this);

    }

    事件过滤器注册后,发送到firstNameEditlastNameEditcityEditphoneNumberEdit控件的事件首先到达CustomerInfoDialog::eventFilter()函数,然后在到达最终的目的地。

    下面是eventFilter()函数的代码:

    bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event)

    {

        if (target == firstNameEdit || target == lastNameEdit

                || target == cityEdit || target == phoneNumberEdit) {

            if (event->type() == QEvent::KeyPress) {

                QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

                if (keyEvent->key() == Qt::Key_Space) {

                    focusNextChild();

                    return true;

                }

            }

        }

        return QDialog::eventFilter(target, event);

    }

    首先,我们看是目标控件是否为QLineEdit,如果事件为键盘事件,把QEvent转换为QKeyEvent,确定被敲击的键。如果为Space键,调用focusNextChild(),把焦点交给下一个控件,返回true通知Qt已经处理了这个事件,如果返回falseQt将会把事件传递给目标控件,把一个空格字符插入到QLineEdit中。

    如果目标控件不是QLineEdit,或者事件不是Space敲击事件,把控制权交给基类QDialogeventFilter()。目标控件也可以是基类QDialog正在监视的控件。(在Qt4.1中,QDialog没有监视的控件,但是Qt的其他控件类,如QScrollArea,监视一些它们的子控件)

    Qt的事件处理有5中级别:

    1. 重写控件的事件处理函数:如重写keyPressEvent()mousePressEvent()paintEvent(),这是最常用的事件处理方法,我们已经看到过很多这样的例子了。
    2. 重写QObject::event(),在事件到达事件处理函数时处理它。在需要改变Tab键的惯用法时这样做。也可以处理那些没有特定事件处理函数的比较少见的事件类型(例如,QEvent::HoverEnter)。我们重写event()时,必须要调用基类的event(),由基类处理我们不需要处理的那些情况。
    3. QObject对象安装事件过滤器:对象用installEventFilter()后,所有达到目标控件的事件都首先到达监视对象的eventFilter()函数。如果一个对象有多个事件过滤器,过滤器按顺序激活,先到达最近安装的监视对象,最后到达最先安装的监视对象。
    4. QApplication安装事件过滤器,如果qApp(唯一的QApplication对象)安装了事件过滤器,程序中所有对象的事件都要送到eventFilter()函数中。这个方法在调试的时候非常有用,在处理非活动状态控件的鼠标事件时这个方法也很常用。
    5. 继承QApplication,重写notify()Qt调用QApplication::nofity()来发送事件。重写这个函数是在其他事件过滤器处理事件前得到所有事件的唯一方法。通常事件过滤器是最有用的,因为在同一时间,可以有任意数量的事件过滤器,但是notify()函数只有一个。

    许多事件类型,包括鼠标,键盘事件,是能够传播的。如果事件在到达目标对象的途中或者由目标对象处理掉,事件处理的过程会重新开始,不同的是这时的目标对象是原目标对象的父控件。这样从父控件再到父控件,知道有控件处理这个事件或者到达了最顶级的那个控件。

    7.2显示了一个键盘事件在一个对话框中从子控件到父控件的传播过程。当用户敲击一个键盘,时间首先发送到有焦点的控件上(这个例子中是QCheckBox)。如果QCheckBox没有处理这个事件,Qt把事件发送到QGroupBox中,如果仍然没有处理,则最后发送到QDialog中。

    https://p-blog.csdn.net/images/p_blog_csdn_net/iamdbl/306244/o_7-2.JPG

    展开全文
  • 控件事件包含数组的顺序是什么,控件中事件是怎么调用数组的?如果调用数组下标,怎么防止别的控件先调用了它?
  • C#动态创建窗口和创建事件,在新窗口添加控件和控件事件  话不多说送代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; ...
    C#动态创建窗口和创建事件,在新窗口添加控件和控件事件
          话不多说送代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;


    namespace form
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }


            private void button1_Click(object sender, EventArgs e)
            {
                //创建和设置新窗口里的按钮↓
                Button but = new Button();// 创建button按钮类
                but.Name = "mybut";//给按钮设置名字
                but.Text = "新窗口的按钮";//给按钮设置标题
                but.Click += new EventHandler(but_Click);//给按钮添加click事件
                but.Size = new Size(100, 25);// 设置按钮的大小
                but.Location = new Point(200, 240);//设置按钮的位置
                
                //创建和设置新窗口↓
                Form winform = new Form();//创建Form窗口类
                winform.Load += new EventHandler(winform_Load);//给窗口加load事件
                winform.Text = "新窗口";//给窗口设置标题
                winform.Height = 520;//给窗口设置高度
                winform.Width = 600;//给窗口设置宽地
                winform.Controls.Add(but);//给窗口添加设置好的按钮
                winform.ShowIcon = true;// 设置窗口的lcon是否显示
                winform.ShowDialog();//显示窗口显示形式是信息框,父窗口不能活动
                winform.Show(); //显示窗口显示形式父窗口能活动
            }


            void but_Click(object sender, EventArgs e) //新窗口的按钮的单击事件
            {
                MessageBox.Show("新窗口的按钮的click事件下的信息框");//单击新窗口的按钮显示信息框
            }


            void winform_Load(object sender, EventArgs e)//新窗口的加载事件
            {
                MessageBox.Show("新窗口的Load事件下的信息框");//加载新窗口时显示信息框
            }


            private void Form1_Load(object sender, EventArgs e)
            {


            }
        }
    }

    有问题加我 QQ1533458582
    展开全文
  • WPF 忽略子控件事件触发父控件事件

    千次阅读 2018-02-01 19:33:29
    IsHitTestVisible="False"  获取或设置此 UIElement 的包含区域是否可为命中测试  命中测试,则为 true;否则为 false。 默认值为 true。
    IsHitTestVisible="False"

      获取或设置此 UIElement 的包含区域是否可为命中测试


      命中测试,则为 true;否则为 false。 默认值为 true。


    展开全文
  • 自定义控件事件传递过程

    千次阅读 2012-03-12 16:41:03
    自定义控件事件传递过程 本人使用自定义控件发现如果自定义控件被另一个控件全部覆盖,当双击或 单击窗体时,事件引起控件事件不是主体事件,多次测试才找到这个技巧。 首先加一个自定义控件,然后在自定义控件...
  • 安装事件过滤器(installEventFilter) ,过滤子控件事件,截获控件按键、鼠标事件 分类: QT相关 2012-09-09 09:40 789人阅读 评论(0) 收藏 举报 qtdialog嵌入式活动 文章来自:...
  • 使用pycharm+pyqt5 控件事件触发(一)

    千次阅读 2019-05-22 21:32:10
    一、在QtDisigner添加控件事件 1)打开QtDesigner 载入上次构建ui文件: 2)添加控件事件: Qt中对控件事件触发都统一称为槽和信号,我这理解为触发源和目标源,事件的添加方法就是在QtDesigner中使用 编辑槽/信号 ...
  • ASP.NET-008—JS绑定控件事件

    千次阅读 2014-03-31 22:32:07
    界面上的事件一般可以通过控件自带的事件属性添加事件...JS绑定控件事件的格式如下: $("#").bind("事件名", function () { 事件对应的JS方法(); return false; }); 或者 $(控件对象).bind("事件名", function () {
  • iphone之控件、控件事件与OC代码关联

    千次阅读 2012-12-02 17:04:17
    ios中对应的控件(文本控件、按钮控件等)、控件事件(点击、拖动),两者的类型都非常多。 笔者以文本控控件、按钮事件来介绍它们与OC代码的关联。  我以下图为例,当鼠标点击按钮式,文本框显示“Hello Word.” ...
  • C#WPF VS2012 控件 事件窗口

    千次阅读 2015-01-08 21:37:52
    C#WPF VS2012 控件 事件窗口在哪 事件窗口位置 有图 图示
  • 控件状态和控件事件

    2016-02-27 15:47:23
    1、控件状态 按钮的状态 解释说明 Normal 常规状态 Highlighted 高亮状态 Disabled 禁用状态,不接受任何事件 Selected 选中状态 Application 应用程序标志 Reserved 为内部框架预留
  • 父控件对子控件事件拦截处理

    千次阅读 2018-10-12 09:20:06
    这次我就简单的讲解下简单的父控件对子控件的拦截事件的处理.  在工作中可能会遇到当这种情况 ,一个组合的搜索框,父控件中包含一个EditText 和一个清除的Button 当在搜索时候不容许点击清除按钮清除EditText的文本...
  • c#响应控件事件

    千次阅读 2018-05-22 16:59:09
     项目需求:项目中有一个控件,DateTimePicker,这个控件跟别的控件不太一样,在哪里呢,别的控件双击控件之后,进入的都是控件的点击事件,而这个控件进入的是dateTimePicker1_ValueChanged...
  • 一、在QtDisigner添加控件事件 1)打开QtDesigner 载入上次构建ui文件: 2)添加控件事件: Qt中对控件事件触发都统一称为槽和信号,我这理解为触发源和目标源,事件的添加方法就是在QtDesigner中使用 编辑槽/信号 ...
  • winform动态生成窗体及控件,并使用控件事件 private void 提交ToolStripMenuItem_Click(object sender, EventArgs e) { shipei(); } private void shipei() {
  • 子控件抢占父控件事件响应

    千次阅读 2017-09-17 09:07:17
    1.在普通布局中,父控件中含有button、ImageButton、CheckBox、EditText,RatingBar等时,点击事件失效。例如:列表中的item布局中含有RatingBar子控件。在item的根布局文件中加入:android:descendantFocusability=...
  • 在VB6.0语言中,控件缺少一些事件,比如菜单条缺少mousemove事件,而toolbar也缺少mouseenter控件,怎么扩展这些事件呢?
  • android 一个控件设置了事件响应(比如Button添加了OnClick回调响应),却在触发控件事件时,不执行事件处理函数
  • wxPython控件学习之TextCtrl(三)响应文本控件事件 2010-05-14 22:15:16 分类: Python/Ruby 示例: frame.Bind(wx.EVT_TEXT, frame.OnText, text) TextCtrl支持的...
  • ocx控件除了拥有功能方法外,有的控件还有事件回调,在vue中使用事件时需要特殊的技巧。 先来看下在传统项目中的使用方式: <script LANGUAGE=javascript FOR=MSComm1 EVENT=OnComm> MSComm1_OnComm(); &...
  • 【原创】vb.net 动态控件 事件添加

    千次阅读 2015-05-22 16:02:55
    【原创】vb.net 动态控件 事件添加 添加选项后: 为实现动态添加,所需代码如下(共三个函数): Private selectcond1 As String = "" '厂家 Private selectcond2 As String = "" '工程队 Private selectcond3 ...
  • VB窗体动态创建控件及控件事件

    千次阅读 2019-07-01 07:48:44
    接着创建一个控件,并在窗体加载事件中对控件进行一些设置和添加一个事件: 从上图看到有波浪线,鼠标移动到波浪线处,在弹出的纠正错误框中选择生成方法存根: 删除自动生成事件中的Throw New ...
  • 控件事件和数据回发概述本文节选自《庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术》一书 在讲解实现控件事件和数据回发功能之前,有必要先了解一下相关的基本概念。5.1.1 事件及其意义要为控件定制事件,先得...
  • Winform自定义控件事件

    2016-12-24 16:10:43
    控件代码: public partial class ButtonEx : Button { public event EventHandler OnButtonClick; public ButtonEx() { } [Description("On Click")]
  • 抓取第三方广告弹窗里的控件事件-测试成功
  • //通知父控件不要干扰,即屏蔽父控件的该事件以及该事件之后的一切action v.getParent().requestDisallowInterceptTouchEvent(true); } if(event.getAction()==MotionEvent.ACTION_MOVE){ //通知父控件不要干扰,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,616
精华内容 19,046
关键字:

控件事件