【问题标题】:Mouse movements too fast for `mouseMoveEvent()``mouseMoveEvent()` 的鼠标移动太快
【发布时间】:2019-04-26 20:54:56
【问题描述】:

以下 Python 3 分别为UI XML 代码为每个鼠标方向显示 4 个QProgessBar(标记为 X+、X-、Y+、Y-)。

快速鼠标移动(以圆圈形式)将使 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()

主窗口.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>

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    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()。 但是您在mouseMoveEvent() 的第一行调用event.x()event.y()

    event.x()event.y()调用和new_xnew_y更新之间,有很短的时间。所以有时没有时间移动1。 这也是一个原因,但不是核心。

    请在_update_barprint(progress_bar.objectName(), new_value)

    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_x,new_y更新成self.old_x,self.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%,反之亦然。

    所以如果我将鼠标从我的电脑窗口的左侧位置快速移动到右侧位置,进度条根本不会增加。如果你在 99%,效果就很明显了。

    当你圈住鼠标的移动时,你经常会看到 99%。 但我认为如果你慢慢做,你可以毫无问题地达到100%。 盘旋包含所有方向移动。它不是一个进度条。 直到一个移动结束,下一个有时不会增加。 我假设盘旋使宽度逐渐变宽,比其他移动更容易达到99%。 假新闻。

    与桌面大小无关。

    2.如何修复代码,让 QProgessBar 在 99% 时没有中断?

    如果你理解了1的解释,你可以通过这段代码来逃避。

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

    if new_value > 1000:
       new_value = 1000
    

    【讨论】:

    • 你的修复效果很好,但我不太明白。为什么屏幕大小与鼠标在圆圈中的移动有关?
    • @Atalanttore 这是我忘记删除的东西,你说得对。我重新编辑了。
    • 很好,但我不完全理解你对原因的解释。你能更简单地描述一下吗?
    • @Atalanttore 是的,我会努力做到这一点。请给我一些时间。迟早,我会在一周内重新编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多