RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1385977
Accepted
MRX
MRX
Asked:2022-07-27 02:01:53 +0000 UTC2022-07-27 02:01:53 +0000 UTC 2022-07-27 02:01:53 +0000 UTC

Pyside6如何实时隐藏鼠标

  • 772

我试图根据鼠标在屏幕上的位置隐藏鼠标,我编写了一个实时跟踪鼠标的代码,如果位置没有改变则隐藏光标。

但是我遇到了一个问题,当我更改鼠标类型时setCursor(

简而言之,鼠标根本不会隐藏,直到鼠标离开窗口并重新进入。(这是我的问题)

我的代码:

import sys
import time

from PySide6 import QtCore, QtGui, QtWidgets
from PySide6.QtCore import QSize, QMetaObject, QCoreApplication, QRect, Qt
from PySide6.QtWidgets import QHBoxLayout, QLabel, QPushButton, QWidget, QGridLayout, QListWidget, QMenuBar, QStatusBar, \
    QMainWindow
from functools import partial
from threading import Thread
class Ui_Form(object):
    def setupUi(self, Form):
        if not Form.objectName():
            Form.setObjectName(u"Form")
        Form.resize(291, 53)
        self.horizontalLayout = QHBoxLayout(Form)
        self.horizontalLayout.setObjectName(u"horizontalLayout")
        self.label = QLabel(Form)
        self.label.setObjectName(u"label")
        self.label.setMinimumSize(QSize(200, 20))

        self.horizontalLayout.addWidget(self.label)

        self.pushButton = QPushButton(Form)
        self.pushButton.setObjectName(u"pushButton")
        self.pushButton.setMinimumSize(QSize(50, 20))

        self.horizontalLayout.addWidget(self.pushButton)

        self.retranslateUi(Form)

        QMetaObject.connectSlotsByName(Form)

    # setupUi

    def retranslateUi(self, Form):
        Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
        self.label.setText(QCoreApplication.translate("Form",
                                                      u"\u0422\u0443\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0442\u0435\u043a\u0441\u0442",
                                                      None))
        self.pushButton.setText(QCoreApplication.translate("Form", u"PushButton", None))
    # retranslateUi


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setMouseTracking(True)
        self.centralwidget.setObjectName(u"centralwidget")
        self.gridLayout = QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(u"gridLayout")
        self.listWidget = QListWidget(self.centralwidget)
        self.listWidget.setObjectName(u"listWidget")

        self.gridLayout.addWidget(self.listWidget, 0, 0, 1, 1)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 800, 22))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")
        MainWindow.setStatusBar(self.statusbar)

        QMetaObject.connectSlotsByName(MainWindow)


# class TestWidget(QtWidgets.QMainWindow, Ui_Form):
#                          vvvvvvv
class TestWidget(QtWidgets.QWidget, Ui_Form):  # +++
    def __init__(self, parent=None):
        super(TestWidget, self).__init__(parent)
        self.setupUi(self)

    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))

    # retranslateUi

    def setText(self, text):
        self.label.setText(text)

    def sizeHint(self):
        return QSize(200, 40)


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.show()
        self.setMouseTracking(True)
        for i in range(20):
            testwidget = TestWidget()
            item = QtWidgets.QListWidgetItem(self.listWidget)
            testwidget.setText(f"Это элемент {i}")
            # +++
            #            testwidget.pushButton.clicked.connect(lambda: self.test(i))
            testwidget.pushButton.clicked[bool].connect(lambda ch, i=i: self.test(i))  # +++

            item.setSizeHint(testwidget.sizeHint())
            self.listWidget.addItem(item)
            self.listWidget.setItemWidget(item, testwidget)
        self.oldxposition = 0
        self.oldyposition = 0
        self.xposition = 1
        self.yposition = 1
        self.th_1 = Thread(target=self.test2)
        self.th_1.start()
        self.listWidget.setMouseTracking(True)

    def mouseMoveEvent(self, event):
        self.xposition = int(event.position().x())
        self.yposition = int(event.position().y())
        print(self.xposition, self.yposition)


    def test2(self):
        while True:
            print(f"X старый: {self.oldxposition}, X новый: {self.xposition}, Y Старый: {self.oldyposition}, Y новый: {self.yposition}")
            if int(self.oldxposition) == int(self.xposition) and int(self.yposition) == int(self.oldyposition):
                self.setCursor(Qt.BlankCursor)
                print("Сработал")
            else:
                self.oldyposition = self.yposition
                self.oldxposition = self.xposition
                self.unsetCursor()
                print("Не сработал")
            time.sleep(1)



if __name__ == "__main__":
    if not QtWidgets.QApplication.instance():
        app = QtWidgets.QApplication(sys.argv)
    else:
        app = QtWidgets.QApplication.instance()
    window = MainWindow()
    sys.exit(app.exec())
python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    S. Nick
    2022-07-27T04:35:44Z2022-07-27T04:35:44Z

    我不完全确定我是否正确理解了您。

    笔记:

    • 您的任务中不需要额外的线程。您只需要使用QTimer。

    • 我添加了一个类ListWidget并将mouseMoveEvent事件处理程序移到那里


    import sys
    #- import time
    '''
    from PySide6 import QtCore, QtGui, QtWidgets
    from PySide6.QtCore import QSize, QMetaObject, QCoreApplication, QRect, Qt
    from PySide6.QtWidgets import QHBoxLayout, QLabel, QPushButton, QWidget, QGridLayout, QListWidget, QMenuBar, QStatusBar, \
        QMainWindow
    '''
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.Qt import *    
        
    #from functools import partial
    #- from threading import Thread
    
    
    class Ui_Form(object):
        def setupUi(self, Form):
            if not Form.objectName():
                Form.setObjectName(u"Form")
            Form.resize(291, 53)
            self.horizontalLayout = QHBoxLayout(Form)
            self.horizontalLayout.setObjectName(u"horizontalLayout")
            self.label = QLabel(Form)
            self.label.setObjectName(u"label")
            self.label.setMinimumSize(QSize(200, 20))
            self.horizontalLayout.addWidget(self.label)
    
            self.pushButton = QPushButton(Form)
            self.pushButton.setObjectName(u"pushButton")
            self.pushButton.setMinimumSize(QSize(50, 20))
            self.horizontalLayout.addWidget(self.pushButton)
    
            self.retranslateUi(Form)
            QMetaObject.connectSlotsByName(Form)
    
    
        def retranslateUi(self, Form):
            Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
            self.label.setText(QCoreApplication.translate("Form",
                                                          u"\u0422\u0443\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0442\u0435\u043a\u0441\u0442",
                                                          None))
            self.pushButton.setText(QCoreApplication.translate("Form", u"PushButton", None))
    
    
    # +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    class ListWidget(QtWidgets.QListWidget):
        def __init__(self, parent=None):
            super(ListWidget, self).__init__(parent)
            
            self.xposition = 1
            self.yposition = 1
    
        def mouseMoveEvent(self, event):
    #        self.xposition = int(event.position().x())                             # PySide6
    #        self.yposition = int(event.position().y())                             # PySide6
            self.xposition = int(event.pos().x())                            # PyQt5
            self.yposition = int(event.pos().y())                            # PyQt5
            
            print(self.xposition, self.yposition, '-----------------------------------------')            
        
            super(ListWidget, self).mouseMoveEvent(event)
    # +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            if not MainWindow.objectName():
                MainWindow.setObjectName(u"MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QWidget(MainWindow)
            self.centralwidget.setMouseTracking(True)
            self.centralwidget.setObjectName(u"centralwidget")
            self.gridLayout = QGridLayout(self.centralwidget)
            self.gridLayout.setObjectName(u"gridLayout")
            
    #        self.listWidget = QListWidget(self.centralwidget)
            self.listWidget = ListWidget(self.centralwidget)                             # !!! +++ 
            
            self.listWidget.setObjectName(u"listWidget")
    
            self.gridLayout.addWidget(self.listWidget, 0, 0, 1, 1)
    
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QMenuBar(MainWindow)
            self.menubar.setObjectName(u"menubar")
            self.menubar.setGeometry(QRect(0, 0, 800, 22))
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QStatusBar(MainWindow)
            self.statusbar.setObjectName(u"statusbar")
            MainWindow.setStatusBar(self.statusbar)
    
            QMetaObject.connectSlotsByName(MainWindow)
    
    
    class TestWidget(QtWidgets.QWidget, Ui_Form):  
        def __init__(self, parent=None):
            super(TestWidget, self).__init__(parent)
            self.setupUi(self)
    
        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
    
        def setText(self, text):
            self.label.setText(text)
    
        def sizeHint(self):
            return QSize(200, 40)
    
    
    class MainWindow(QMainWindow, Ui_MainWindow):
        def __init__(self):
            super(MainWindow, self).__init__()
            self.setupUi(self)
            self.show()
            self.setMouseTracking(True)
            for i in range(20):
                testwidget = TestWidget()
                item = QtWidgets.QListWidgetItem(self.listWidget)
                testwidget.setText(f"Это элемент {i}")
                testwidget.pushButton.clicked[bool].connect(lambda ch, i=i: self.test(i))
    
                item.setSizeHint(testwidget.sizeHint())
                self.listWidget.addItem(item)
                self.listWidget.setItemWidget(item, testwidget)
                
            self.oldxposition = 0
            self.oldyposition = 0
            
    #        self.xposition = 1
    #        self.yposition = 1
            
    #        self.th_1 = Thread(target=self.test2)
    #        self.th_1.start()
    
            self.timer = QtCore.QTimer(self)                                                     # +++
            self.timer.timeout.connect(self.test2)                                               # +++
            self.timer.start(1000)                                                               # +++
            
            self.listWidget.setMouseTracking(True)
    
        '''
        def mouseMoveEvent(self, event):
    #        self.xposition = int(event.position().x())                           # PySide6
    #        self.yposition = int(event.position().y())                           # PySide6
            self.xposition = int(event.pos().x())                            # PyQt5
            self.yposition = int(event.pos().y())                            # PyQt5
            print(self.xposition, self.yposition)
        
        def test2(self):
            while True:
                print(f"X старый: {self.oldxposition}, X новый: {self.xposition}, Y Старый: {self.oldyposition}, Y новый: {self.yposition}")
                if int(self.oldxposition) == int(self.xposition) and int(self.yposition) == int(self.oldyposition):
                    self.setCursor(Qt.BlankCursor)
                    print("Сработал")
                else:
                    self.oldyposition = self.yposition
                    self.oldxposition = self.xposition
                    self.unsetCursor()
                    print("Не сработал")
                time.sleep(1)
        '''
        
        def test2(self):
            print(f"X старый: {self.oldxposition}, X новый: {self.listWidget.xposition}, "
                  f"\nY Старый: {self.oldyposition}, Y новый: {self.listWidget.yposition}")
            if int(self.oldxposition) == int(self.listWidget.xposition) and \
               int(self.listWidget.yposition) == int(self.oldyposition):
                self.setCursor(Qt.BlankCursor)
                print("Сработал")
            else:
                self.oldyposition = self.listWidget.yposition
                self.oldxposition = self.listWidget.xposition
                self.unsetCursor()
                print("Не сработал")
    
        def test(self, i):                                                                   # +++
            print(f'def test(self, i): это элемент {i}')                                     # +++
    
    
    if __name__ == "__main__":
        if not QtWidgets.QApplication.instance():
            app = QtWidgets.QApplication(sys.argv)
        else:
            app = QtWidgets.QApplication.instance()
        window = MainWindow()
        sys.exit(app.exec())
    

    在此处输入图像描述

    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5