鼠标移动太快,导致无法使用`mouseMoveEvent()`

时间:2019-04-17 19:19:03

标签: python pyqt pyqt5

以下Python 3响应​​。 UI XML代码为每个鼠标方向(标记为X +,X-,Y +,Y-)显示4 QProgessBar

快速鼠标移动(以圆圈为单位)将使4个QProgessBar移动高达99%,然后QProgessBar中的某些区域会暂停一下,直到鼠标移动速度减慢到最终达到100%。

  1. 这种行为的原因是什么?
  2. 如何固定代码,以使QProgessBar不会中断99%?

main.py

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.uic import loadUi


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        loadUi("mainwindow.ui", self)
        self.showMaximized()
        self.setMouseTracking(True)
        self.centralWidget().setAttribute(Qt.WA_TransparentForMouseEvents)

        self._old_x = QCursor.pos().x()
        self._old_y = QCursor.pos().y()

    def _update_bar(self, progress_bar, delta):
        current_value = progress_bar.value()
        new_value = current_value + delta
        progress_bar.setValue(new_value)

    def mouseMoveEvent(self, event):
        new_x = event.x()
        new_y = event.y()

        if new_x > self._old_x:
            self._update_bar(self.progressBar_x_plus, new_x - self._old_x)
        if new_x < self._old_x:
            self._update_bar(self.progressBar_x_minus, self._old_x - new_x)

        if new_y > self._old_y:
            self._update_bar(self.progressBar_y_plus, new_y - self._old_y)
        if new_y < self._old_y:
            self._update_bar(self.progressBar_y_minus, self._old_y - new_y)

        self._old_x = new_x
        self._old_y = new_y


def main():
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Mouse Pointer</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout_2">
    <item row="0" column="0">
     <layout class="QGridLayout" name="gridLayout">
      <item row="0" column="0">
       <widget class="QLabel" name="label_x_plus">
        <property name="text">
         <string>X+</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
        </property>
       </widget>
      </item>
      <item row="0" column="1">
       <widget class="QProgressBar" name="progressBar_x_plus">
        <property name="maximum">
         <number>1000</number>
        </property>
        <property name="value">
         <number>0</number>
        </property>
       </widget>
      </item>
      <item row="1" column="0">
       <widget class="QLabel" name="label_x_minus">
        <property name="text">
         <string>X-</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
        </property>
       </widget>
      </item>
      <item row="1" column="1">
       <widget class="QProgressBar" name="progressBar_x_minus">
        <property name="maximum">
         <number>1000</number>
        </property>
        <property name="value">
         <number>0</number>
        </property>
       </widget>
      </item>
      <item row="2" column="0">
       <widget class="QLabel" name="label_y_plus">
        <property name="text">
         <string>Y+</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
        </property>
       </widget>
      </item>
      <item row="2" column="1">
       <widget class="QProgressBar" name="progressBar_y_plus">
        <property name="maximum">
         <number>1000</number>
        </property>
        <property name="value">
         <number>0</number>
        </property>
       </widget>
      </item>
      <item row="3" column="0">
       <widget class="QLabel" name="label_y_minus">
        <property name="text">
         <string>Y-</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
        </property>
       </widget>
      </item>
      <item row="3" column="1">
       <widget class="QProgressBar" name="progressBar_y_minus">
        <property name="maximum">
         <number>1000</number>
        </property>
        <property name="value">
         <number>0</number>
        </property>
       </widget>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>28</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

1 个答案:

答案 0 :(得分:2)

1。这种行为的原因是什么?

请输入print(self._old_x, new_x)并查看结果。

就我而言,部分结果是这样的。

681 673
673 666
666 660
660 660
660 660
660 661
661 670
670 681
681 693
693 708
708 732
732 750
750 779

您可以在self._old_xnew_x之间看到相同的位置。 并且您还可以看到结果中self._old_x大于new_x

为什么会出现相同的职位?

很容易说... event.pos()QCursor.pos()。 但是您在event.x()的第一行中呼叫event.y()mouseMoveEvent()

event.x()event.y()调用与new_xnew_y更新之间,时间非常短。因此,有时没有时间移动1。 这也是一个原因,但不是核心。

请在print(progress_bar.objectName(), new_value)中写_update_bar

progressBar_y_plus 394
progressBar_x_minus 368
progressBar_y_plus 400
progressBar_x_minus 372
progressBar_y_plus 405
progressBar_x_minus 375
progressBar_y_plus 409
progressBar_x_minus 378
progressBar_y_plus 412
progressBar_x_minus 381
progressBar_y_plus 415
progressBar_x_minus 383
progressBar_y_plus 418
progressBar_x_minus 387
progressBar_y_plus 424
progressBar_x_minus 389
progressBar_y_plus 427
progressBar_x_minus 394
progressBar_y_plus 431
progressBar_x_minus 397
progressBar_y_plus 434
progressBar_x_minus 400
progressBar_y_plus 438
progressBar_x_minus 404
progressBar_y_plus 443
progressBar_x_minus 409
progressBar_y_plus 449
progressBar_x_minus 414
progressBar_y_plus 454
progressBar_x_minus 419
progressBar_y_plus 458
progressBar_x_minus 423
progressBar_y_plus 463
progressBar_x_minus 428
progressBar_y_plus 468
progressBar_x_minus 436
progressBar_y_plus 476
progressBar_x_minus 440
progressBar_y_plus 479
progressBar_x_minus 448
progressBar_y_plus 484
progressBar_x_minus 456
progressBar_y_plus 489
progressBar_x_minus 462
progressBar_y_plus 493
progressBar_x_minus 467
progressBar_y_plus 495
progressBar_x_minus 475
progressBar_y_plus 497
progressBar_x_minus 482
progressBar_y_plus 500
progressBar_x_minus 489
progressBar_x_minus 503
progressBar_y_plus 504
progressBar_x_minus 515
progressBar_x_minus 529
progressBar_x_minus 541
progressBar_x_minus 559
progressBar_x_minus 575
progressBar_x_minus 598
progressBar_x_minus 619
progressBar_x_minus 631
progressBar_x_minus 657
progressBar_x_minus 675
progressBar_x_minus 679
progressBar_x_minus 682
progressBar_x_minus 707
progressBar_y_minus 807
progressBar_x_minus 742
progressBar_y_minus 818
progressBar_x_minus 767
progressBar_y_minus 819
progressBar_x_minus 799
progressBar_x_minus 814
progressBar_x_minus 825
progressBar_y_minus 822
progressBar_x_minus 842
progressBar_y_minus 823
progressBar_x_minus 857
progressBar_y_minus 825
progressBar_x_minus 863
progressBar_y_minus 826
progressBar_x_minus 877
progressBar_y_minus 831
progressBar_x_minus 892
progressBar_x_minus 907
progressBar_x_minus 918
progressBar_y_minus 835
progressBar_x_minus 928
progressBar_x_minus 931
progressBar_x_minus 936
progressBar_x_minus 940
progressBar_x_minus 945
progressBar_x_minus 949
progressBar_x_minus 952
progressBar_x_minus 956
progressBar_x_minus 959
progressBar_x_minus 963
progressBar_x_minus 970
progressBar_x_minus 975
progressBar_x_minus 980
progressBar_x_minus 987
progressBar_x_minus 992
progressBar_x_minus 998
progressBar_x_minus 1002
progressBar_x_minus 1001
progressBar_x_minus 1000
progressBar_x_minus 1004
progressBar_x_minus 1003
progressBar_x_minus 1001
progressBar_x_minus 1001
progressBar_x_minus 1001
progressBar_x_minus 1001
progressBar_x_plus 475
progressBar_x_plus 482
progressBar_x_plus 496
progressBar_x_plus 509
progressBar_x_plus 524
progressBar_x_plus 548
progressBar_x_plus 579
progressBar_x_plus 614
progressBar_x_plus 673
progressBar_x_plus 718
progressBar_x_plus 756
progressBar_x_plus 788
progressBar_x_plus 826
progressBar_x_plus 848
progressBar_y_minus 836
progressBar_x_plus 898
progressBar_y_plus 507
progressBar_x_plus 940
progressBar_x_plus 978
progressBar_x_plus 993
progressBar_x_plus 1014
progressBar_x_plus 1014
progressBar_x_plus 1010
progressBar_x_plus 1016
progressBar_x_plus 1015
progressBar_y_plus 509
progressBar_x_plus 1018
progressBar_x_plus 1012
progressBar_x_plus 1011
progressBar_x_plus 1000
progressBar_x_plus 1012
progressBar_x_plus 1019
progressBar_x_plus 1015
progressBar_x_plus 1012
progressBar_x_plus 1015
progressBar_x_plus 1019
progressBar_x_plus 1015
progressBar_x_plus 1015
progressBar_x_plus 1012
progressBar_x_plus 1014
progressBar_x_plus 1005
progressBar_x_plus 1003
progressBar_x_plus 1009
progressBar_y_minus 839
progressBar_x_plus 1008
progressBar_y_minus 841
progressBar_x_plus 1012
progressBar_y_minus 844
progressBar_x_plus 1011
progressBar_y_minus 848
progressBar_x_plus 1006
progressBar_y_minus 851
progressBar_x_plus 1007
progressBar_y_minus 855
progressBar_x_plus 1006
progressBar_y_minus 860
progressBar_x_plus 1007
progressBar_y_minus 865
progressBar_x_plus 1001
progressBar_y_minus 866
progressBar_x_plus 1001
progressBar_x_plus 1004
progressBar_y_minus 872
progressBar_x_plus 1005
progressBar_y_minus 881
progressBar_x_plus 1005
progressBar_y_minus 889
progressBar_x_plus 1007
progressBar_y_minus 898
progressBar_x_plus 1004
progressBar_y_minus 907
progressBar_x_plus 1005
progressBar_y_minus 917
progressBar_x_plus 1005
progressBar_y_minus 931
progressBar_x_plus 1004
progressBar_y_minus 941
progressBar_x_plus 1004
progressBar_y_minus 952
progressBar_x_plus 1005
progressBar_y_minus 965
progressBar_x_plus 1002
progressBar_y_minus 977
progressBar_x_plus 1001
progressBar_y_minus 991
progressBar_x_plus 1001
progressBar_y_minus 1004
progressBar_y_minus 1005
progressBar_x_plus 1003
progressBar_y_minus 1001
progressBar_y_minus 1007
progressBar_y_minus 1004
progressBar_y_minus 1005
progressBar_y_minus 1005
progressBar_x_minus 1003
progressBar_y_minus 1001
progressBar_x_minus 1004
progressBar_y_minus 1004
progressBar_y_minus 996
progressBar_x_minus 1006
progressBar_y_minus 1007
progressBar_x_minus 1008
progressBar_y_minus 1007
progressBar_x_minus 1007
progressBar_y_minus 1007
progressBar_x_minus 1008
progressBar_y_minus 1009
progressBar_x_minus 1009
progressBar_y_minus 1007
progressBar_x_minus 1005
progressBar_y_minus 1005
progressBar_x_minus 1010
progressBar_y_minus 1006
progressBar_x_minus 1007
progressBar_y_minus 1004
progressBar_x_minus 1010
progressBar_y_minus 1004
progressBar_x_minus 1008
progressBar_y_minus 1001
progressBar_x_minus 1008
progressBar_y_minus 1005
progressBar_x_minus 1013
progressBar_y_minus 1005
progressBar_x_minus 1012
progressBar_y_minus 1003
progressBar_x_minus 1023
progressBar_y_minus 1004
progressBar_x_minus 1013
progressBar_y_minus 1003
progressBar_x_minus 1016
progressBar_y_minus 1003
progressBar_x_minus 1015
progressBar_y_minus 1003
progressBar_x_minus 1014
progressBar_y_minus 1002
progressBar_x_minus 1018
progressBar_y_minus 1000
progressBar_x_minus 1015
progressBar_y_minus 1005
progressBar_x_minus 1009
progressBar_y_minus 1002
progressBar_x_minus 1018
progressBar_y_minus 1003
progressBar_x_minus 1015
progressBar_y_minus 1003
progressBar_x_minus 1014
progressBar_y_minus 1001
progressBar_x_minus 1015
progressBar_y_minus 1005
progressBar_x_minus 1009
progressBar_x_minus 1012
progressBar_y_minus 1001
progressBar_x_minus 1012
progressBar_x_minus 1014
progressBar_x_minus 1008
progressBar_x_minus 1014
progressBar_x_minus 1012
progressBar_x_minus 1015
progressBar_x_minus 1014
progressBar_x_minus 1012
progressBar_x_minus 1013
progressBar_x_minus 1014
progressBar_y_plus 512
progressBar_x_minus 1014
progressBar_y_plus 515
progressBar_x_minus 1014
progressBar_y_plus 519
progressBar_x_minus 1018
progressBar_y_plus 525
progressBar_x_minus 1009
progressBar_y_plus 528
progressBar_x_minus 1012
progressBar_y_plus 532
progressBar_x_minus 1013
progressBar_y_plus 536
progressBar_x_minus 1014
progressBar_y_plus 540
progressBar_x_minus 1010
progressBar_y_plus 546
progressBar_x_minus 1015
progressBar_y_plus 553
progressBar_x_minus 1012
progressBar_y_plus 558
progressBar_x_minus 1010
progressBar_y_plus 565
progressBar_x_minus 1012
progressBar_y_plus 572
progressBar_x_minus 1013
progressBar_y_plus 580
progressBar_x_minus 1008
progressBar_y_plus 586
progressBar_x_minus 1012
progressBar_y_plus 596
progressBar_x_minus 1010
progressBar_y_plus 604
progressBar_x_minus 1009
progressBar_y_plus 612
progressBar_x_minus 1010
progressBar_y_plus 623
progressBar_x_minus 1006
progressBar_y_plus 629
progressBar_x_minus 1007
progressBar_y_plus 637
progressBar_x_minus 1005
progressBar_y_plus 648
progressBar_x_minus 1003
progressBar_y_plus 655
progressBar_x_minus 1002
progressBar_y_plus 663
progressBar_x_minus 1003
progressBar_y_plus 673
progressBar_x_minus 1004
progressBar_y_plus 684
progressBar_x_minus 1001
progressBar_y_plus 693
progressBar_y_plus 702
progressBar_y_plus 712
progressBar_y_plus 713
progressBar_y_plus 718
progressBar_y_plus 724
progressBar_x_plus 1001
progressBar_y_plus 734
progressBar_x_plus 1002
progressBar_y_plus 743
progressBar_y_plus 757
progressBar_y_plus 769
progressBar_y_plus 780
progressBar_y_plus 794
progressBar_y_plus 803
progressBar_y_plus 815
progressBar_y_plus 822
progressBar_x_plus 1003
progressBar_y_plus 829
progressBar_x_plus 1002
progressBar_y_plus 836
progressBar_x_plus 1002
progressBar_y_plus 844
progressBar_x_plus 1004
progressBar_y_plus 850
progressBar_x_plus 1002
progressBar_y_plus 857
progressBar_x_plus 1004
progressBar_y_plus 865
progressBar_x_plus 1002
progressBar_y_plus 872
progressBar_x_plus 1006
progressBar_y_plus 880
progressBar_x_plus 1002
progressBar_y_plus 884
progressBar_x_plus 1002
progressBar_y_plus 893
progressBar_x_plus 1003
progressBar_y_plus 899
progressBar_x_plus 1003
progressBar_y_plus 905
progressBar_x_plus 1002
progressBar_y_plus 907
progressBar_x_plus 1002
progressBar_x_plus 1002
progressBar_y_plus 913
progressBar_x_plus 1001
progressBar_y_plus 918
progressBar_x_plus 1004
progressBar_y_plus 924
progressBar_x_plus 1001
progressBar_y_plus 927
progressBar_y_plus 931
progressBar_x_plus 1003
progressBar_y_plus 938
progressBar_x_plus 1002
progressBar_y_plus 941
progressBar_x_plus 1002
progressBar_y_plus 945
progressBar_x_plus 1004

原因1。 我假设progressBar将1000计为100%。因此990 ~ 999被计为99%。 要停止在99%的位置,通常会发生鼠标移动比以前慢的情况(因为鼠标指向屏幕的边缘。)有时我们很快就会达到100%。

原因2。

您将new_xnew_y更新为self.old_xself.old_y,因此贵重物品几乎彼此相等。这似乎很容易从99个增加到100个。大多数情况下,我们很快就会达到100%。但是事实并非总是如此。因为即使您加上990 + 11,即使该点超过1000,进度条也不会变为100%。 。这是停在99%的主要原因。

作为证据,您输入_update_bar,例如new_value = 900 + 11,您喜欢的任何数字,但结果必须大于1000。您的进度条绝对不会变满。 ,它们根本不会动。

progressBar_y_minus 992
109 132
progressBar_y_minus 1012
98 121

我想缓慢移动鼠标。您可以看到比快速移动鼠标更容易达到100%。因为问题是移动宽度为9 **〜1000。

如果您更快地移动鼠标,则self._pos_x和event.pos()。x()的宽度将变大。为此,它导致无法达到100%的反之。

因此,如果将鼠标从PC窗口的左侧快速移至右侧,进度条根本不会增加。如果您的鼠标指针为99%,效果将清晰显示。

当您绕鼠标移动时,通常会看到99%。 但我认为,如果您慢慢进行,则可以毫无问题地达到100%。 盘旋包含所有方向的移动。不适用于一个进度条。 在一个动作结束之前,下一个动作有时不会增加。 我认为盘旋使宽度逐渐变小,比其他移动更容易达到99%。 假新闻。

它与桌面大小无关。

2。如何修复代码,以使QProgessBar不会中断99%?

如果您理解1的解释,则可以通过此代码停止运行。

请尝试在_update_bar y punto中编写此代码...

if new_value > 1000:
   new_value = 1000