Qt 小技巧(1~9)

1. QTableWidget滚动条

  • 如果当前只有一页,不会有滚动条显示。打印 verticalScrollBar()->minimum() 和 verticalScrollBar()->maximum(),发现滚动条最大值和最小值都是0。
  • 即使是通过setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn);设置成总是显示,也只会在右侧多了一条满的滚动条,无法移动。
  • 例如,当前一共2页,当滚动条verticalScrollBar()->value()为0时,表示第一页,当verticalScrollBar()->value() 为1~max时,表示滚动到了第二页 (max为第二页显示满,1表示第二页刚显示一点。

2. verticalScrollBar()-setvalue(int val)小技巧:

  • 当val值为负数,发送valueChanged信号,value 值为0.
  • 当val值大于max时,发送valueChanged信号,value 值为max.
  • 有时候,明明调用了setvalue(val),并给了一个合法的值,却收不到valueChanged信号,是因为传进来的val和当前的value值相同。所以,不重复发送信号。

3. 鼠标事件无法直接设置触发频率,这取决于操作系统底层的响应速度。

QEvent::MouseButtonPress,QEvent::MouseButtonRelease,QEvent::MouseMove等上来的速度和频率无法控制。

4. 运行时log显示 QMetaObject::connectSlotsByName: No matching signal for on_scrollBar_rangeChanged

这不是说槽没有信号匹配,而是槽的命名方式采用了“on_控件名_信号名”的格式。
解决方式:修改槽函数名称。但是不改也不会有问题。

5. 在xxEvent方法中处理指定event事件和在父窗口的eventfilter中处理该event事件的区别。

重写wheelEvent(QWheelEvent *event)方法,如果event->accept(),事件就不会传到父窗口。
滚轮轻微滚动一次,wheelEvent(QWheelEvent *event)方法响应一次,并打印出

numSteps= -1 value= 129 point= QPoint(0,-120)

如果大力度滚动,会产生多次QWheelEvent事件,wheelEvent(QWheelEvent *event)方法响应多次,并 打印出多条一样的值

numSteps= -1 value= 129 point= QPoint(0,-120)
numSteps= -1 value= 129 point= QPoint(0,-120)
numSteps= -1 value= 129 point= QPoint(0,-120)

测试代码如下:

void PScrollTableWidget::wheelEvent(QWheelEvent *event)
{
    int numDegrees = event->angleDelta().y() / 8;
    int numSteps = numDegrees / 15;

    qDebug()<<" numSteps="<<numSteps<<" value="<<verticalScrollBar()->value()<<"point="<<event->angleDelta();
    }

6. Qt触摸屏事件默认走的是鼠标的处理过程

手指点住页面不动,并滑动,会默认识别成鼠标的按下,移动,释放事件。
mousePressEvent
mouseMoveEvent
mouseReleaseEvent
这是因为Qt参数 Qt::AA_SynthesizeMouseForUnhandledTouchEvents默认为true。可以通过设置该参数来选择是否用鼠标事件处理触屏事件。
在这里插入图片描述

7. js脚本问题及解决方案。

  • 对于Chrome浏览器,document.activeElement.tagName始终返回BODY,无法通过activeElement得到实际的点击位置的具体元素。可以通过addEventListener绑定mousedown事件,通过evt.target获取产生事件的目标元素。
  • 判断当前元素有无滚动条:
    思路:先通过scrollBy(0,2)移动2个像素,再判断scrollTop看是否有卷去的高度,如果有说明有滚动条,反之则无。

8. Qt内嵌 js 脚本避坑点!!!。

Qt内部调用runJavaScript()执行js脚本是一个异步的过程。

  • 如果想要马上得到返回值retValue(让脚本马上执行),必须用一个while循环,调用processEvent()来执行脚本直到得到返回值,否则会导致在使用retValue的时候,由于脚本还未执行完毕,导致使用一个没有被填充的值。
  • 如果执行的是不带返回值的脚本,或者不太在意执行时效,通常不用调用processEvent()。
  • 调用processEvent有时候会引起一些问题:比如:
    在mousePressEvent()执行了一个简单的脚本用来返回document.activeElement.tagName,由于要得到返回值,需要调用qt的processEvent()。在用鼠标操作的时候运行一切正常,但是用触摸屏操作的时候会出现触摸响应不灵敏 - 手指点击网页的一个href,正常速度点击不会发生网页跳转,必须触摸之后停留0.5~1s再松开,或者手指双击,网页才能跳转。原因就是在mousePressEvent()处理函数中使用了processEvent(), 导致mouseButtonRelease 事件被提前处理 - mousePressEvent()还没返回,就处理了mouseReleaseEven从而导致鼠标释放事件失效。

9. 在js代码中绑定事件最好用onxxx.

js中绑定事件常用的两种方式:

  1. 通过指定onxxx方法:
    这种方法能确保只绑定一次,事件发生时,对应的事件处理函数只执行一次。
 "document.onmousedown = function(evt){...}" 
  1. 通过 addEventListener 方法,把事件和函数绑定
    addEventListener 方法如果调用多次,会导致事件发生的时候,对应的函数执行多次
div_.addEventListener('click', function () {
        alert('');
    })
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值