草庐IT

Qml 鼠标区域事件传递

边缘计算机 2023-04-11 原文

MouseArea    

MouseArea元素的一个很典型的用法是和一个可视的item一起用,处理这个item的鼠标响应。
我们将MouseArea放到Rectangle中,当单击Rectangle区域中时,Rectangle颜色会变成红色。

 import QtQuick 2.0

 Rectangle {
     width: 100; height: 100
     color: "green"

     MouseArea {
         anchors.fill: parent
         onClicked: { parent.color = 'red' }
     }
 }

鼠标MouseArea是一种不可见的项目,通常与可见项目结合使用,以便为该项目提供鼠标操作。通过有效地充当代理,鼠标处理的逻辑可以包含在MouseArea项中。

enabled属性用于启用和禁用代理项的鼠标处理。禁用时,鼠标区域对鼠标事件透明。

MouseArea是不可见的项目,但它有一个可见的属性。设置为false时,鼠标区域对鼠标事件透明。

pressed read-only属性指示用户是否在鼠标区域上按下鼠标按钮。此属性通常用于用户界面中属性之间的绑定。

containsMouse只读属性表示鼠标光标位于鼠标区域上,但默认情况下,仅当按下鼠标按钮时;有关详细信息,请参阅containsMouse文档。

有关鼠标位置和按钮点击的信息通过定义事件处理程序属性的信号提供。最常用的是处理鼠标按下和点击:onClicked、onDoubleClicked、onPressed、onrelease和onpresseandhold。还可以通过onWheel信号处理鼠标滚轮事件。

如果鼠标earea与其他鼠标earea项目的区域重叠,您可以通过将propagateComposedEvents设置为true并拒绝应传播的事件,选择将clicked、Double clicked和按住事件传播到这些其他项目。有关详细信息,请参阅propagateComposedEvents文档。

默认情况下,MouseArea项只报告鼠标单击,而不报告鼠标光标位置的更改。设置hoverEnabled属性可以确保使用为onPositionChanged、onEntered和onExited定义的处理程序,并且即使没有按下鼠标按钮,containsMouse属性也会更新。

有先后优先级

MouseArea的调用,有先后优先级,后续的设置会覆盖前面的设置。局部的调用没有被触发。
 

Rectangle
Text
MouseArea  其余地方响应
AvatarImage{ 
     MouseArea  先响应
}

书写在下面的元素,在界面中放置在上面。

MouseArea重叠穿透

像clicked, doubleClicked, pressAndHold这些事件称为 composed events(组合事件),而press、release 等事件则称为basic events(基本事件)。组合事件由基本事件组成。

正常点击的事件顺序是 : pressed->released->clicked 其中 clicked是组合事件。

重叠区域鼠标穿透。

比如桌面窗口是大矩形,程序窗口是小矩形。这时候就产生了mouseArea的重叠。

不做处理是上层区域会响应,而被遮挡区域不会响应。

我们希望点击重叠区域时, 小矩形先响应和被遮挡矩形后响应,  就需要穿透。

在上层区域的事件处理函数(如onClick)里 写 mouse.accepted = false ,同时在 MouseArea里将propagateComposedEvents:设置为true ,可以将事件传递给底层(parent)的MouseArea。

pressed等基本事件, 就会传递下去。

propagateComposedEvents默认为false   ,需要设置为true

proposal 提议,propagate 传播

propagateComposedEvents: true

mouse.accepted = false

propagateComposedEvents

propagateComposedEvents属性,控制组合鼠标事件是否能自动传播到与此鼠标区域重叠的而且视觉堆叠顺序较低的其他鼠标区域MouseArea中。默认情况下,propagateComposedEvents属性为false。

MouseArea包含几个组合事件:点击、双击和按住。它们由基本鼠标事件(如按下)组成,与基本事件相比,可以以不同的方式传播。

如果将propagateComposedEvents设置为true,则合成的事件将自动传播到场景中同一位置的其他鼠标区域。每个事件都会按堆叠顺序传播到它下面的下一个启用的MouseArea,沿着这个视觉层次结构传播,直到MouseArea接受该事件。与按下的事件不同,如果没有处理程序,则不会自动接受合成的事件。

例如,下面是一个包含蓝色矩形的黄色矩形。蓝色矩形是视觉堆叠顺序层次结构中最顶层的项目;它将在黄色矩形上方进行视觉渲染。由于蓝色矩形将所有接收到的单击事件的propagateComposedEvents设置为true,并将MouseeEvent::Accept设置为false,因此它接收到的任何单击事件都会传播到其下方黄色矩形的MouseeArea。

如下代码:

Rectangle {
        color: "yellow"
        width: 100; height: 100

        MouseArea {
            anchors.fill: parent
            onClicked: console.log("clicked yellow")
        }

        Rectangle {
            color: "blue"
            width: 50; height: 50

            MouseArea {
                anchors.fill: parent
                propagateComposedEvents: true
//propagateComposedEvents为FALSE,点击该区域只会打印"clicked blue",不会穿透到下层的父控件
                 //置为true后,不但打印"clicked blue",还会打印"clicked yellow"
                onClicked: {
                    console.log("clicked blue")
                    mouse.accepted = false
                }
            }
        }
    }

有关Qml 鼠标区域事件传递的更多相关文章

  1. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  2. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  3. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  4. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  5. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  6. ruby-on-rails - 缺失区域;使用 :region option or export region name to ENV ['AWS_REGION' ] - 2

    我知道还有其他相同的问题,但他们没有解决我的问题。我不断收到错误:Aws::Errors::MissingRegionErrorinBooksController#create,缺少区域;使用:region选项或将区域名称导出到ENV['AWS_REGION']。但是,这是我的配置开发.rb:config.paperclip_defaults={storage::s3,s3_host_name:"s3-us-west-2.amazonaws.com",s3_credentials:{bucket:ENV['AWS_BUCKET'],access_key_id:ENV['AWS_ACCE

  7. ruby - 如何将 Puma::Configuration 传递给 Sinatra? - 2

    这是我的网络应用:classFront我是这样开始的(请不要建议使用Rack):Front.start!这是我的Puma配置对象,我不知道如何传递给它:require'puma/configuration'Puma::Configuration.new({log_requests:true,debug:true})说真的,怎么样? 最佳答案 配置与您运行的方式紧密相关puma服务器。运行的标准方式puma-pumaCLI命令。为了配置puma配置文件config/puma.rb或config/puma/.rb应该提供(参见examp

  8. jquery - 如何将 AJAX 变量从 jQuery 传递到他们的 Controller ? - 2

    我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过ajax执行,并将整个内容粘贴到另一个电子邮件表单中。我不知道如何将变量从我的HAML发送到我的Controllernew.html.haml-form_tagadmin_email_blast_pathdoSubject%br=text_field_tag'subject',:class=>"mass_email_subject"%brBody%br=text_area_tag'message','',:nam

  9. ruby-on-rails - 事件管理员和自定义方法 - 2

    这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什

  10. ruby - 如何将 lambda 传递给 Hash.each? - 2

    如何将lambda传递给hash.each,以便我可以重复使用一些代码?>h={a:'b'}>h.eachdo|key,value|end=>{:a=>"b"}>test=lambdado|key,value|puts"#{key}=#{value}"end>test.call('a','b')a=b>h.each&testArgumentError:wrongnumberofarguments(1for2)from(irb):1:in`blockinirb_binding'from(irb):5:in`each'from(irb):5from/Users/jstillwell/.rv

随机推荐