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中绑定事件常用的两种方式:
- 通过指定onxxx方法:
这种方法能确保只绑定一次,事件发生时,对应的事件处理函数只执行一次。
"document.onmousedown = function(evt){...}"
- 通过 addEventListener 方法,把事件和函数绑定
addEventListener 方法如果调用多次,会导致事件发生的时候,对应的函数执行多次。
div_.addEventListener('click', function () {
alert('');
})