0 / 0 / 0
Регистрация: 09.06.2022
Сообщений: 20
PyQt5

Как получать координаты от джойстика

12.08.2022, 10:15. Показов 1635. Ответов 3

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Нашел в интернете код для реализации джойстика на QT5. Но мене нужно было его переделать под свои задачи и я зашел в тупик. Как сделать что бы когда джойстик в центре то значения 50, 50, а когда отклоняется влево то идет на уменьшение до 0, а вправо увеличивается до 100? (тоже самое для вертикали)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
from PyQt5.QtGui import QPainter, QPixmap, QPen, QColor
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore    import *
from PyQt5.QtWidgets import * 
import sys
from enum import Enum
 
class Direction(Enum):
    Pan = 0
    Tilt = 1
   
 
class Joystick(QWidget):
    def __init__(self, parent=None):
        super(Joystick, self).__init__(parent)
        self.setMinimumSize(200, 200)
        self.movingOffset = QPointF(0, 0)
        self.grabCenter = False
        self.__maxDistance = 100
 
    def paintEvent(self, event):
        painter = QPainter(self)
        bounds = QRectF(-self.__maxDistance, -self.__maxDistance, self.__maxDistance * 2, self.__maxDistance * 2).translated(self._center())
        painter.drawEllipse(bounds)
        painter.setBrush(Qt.black)
        painter.drawEllipse(self._centerEllipse())
 
    def _centerEllipse(self):
        if self.grabCenter:
            return QRectF(-20, -20, 40, 40).translated(self.movingOffset)
        return QRectF(-20, -20, 40, 40).translated(self._center())
 
    def _center(self):
        return QPointF(self.width()/2, self.height()/2)
 
 
    def _boundJoystick(self, point):
        limitLine = QLineF(self._center(), point)
        if (limitLine.length() > self.__maxDistance):
            limitLine.setLength(self.__maxDistance)
        return limitLine.p2()
 
    def joystickDirection(self):
        if not self.grabCenter:
            return 0
        normVector = QLineF(self._center(), self.movingOffset)
        currentDistance = int(normVector.length())
        
 
        '''angle = normVector.angle()
 
        distance = min(currentDistance / self.__maxDistance, 100)
        if 45 <= angle < 100:
            return (Direction.Tilt, distance)
        elif 100 <= angle < 225:
            return (Direction.Pan, distance)
        elif 225 <= angle < 315:
            return (Direction.Tilt, distance)
        return (Direction.Pan, distance)'''
 
        
        return (Direction.Tilt, currentDistance, Direction.Pan, currentDistance)
 
 
 
    def mousePressEvent(self, ev):
        self.grabCenter = self._centerEllipse().contains(ev.pos())
        return super().mousePressEvent(ev)
 
    def mouseReleaseEvent(self, event):
        self.grabCenter = False
        self.movingOffset = QPointF(50, 50)
        self.update()
 
    def mouseMoveEvent(self, event):
        if self.grabCenter:
            self.movingOffset = self._boundJoystick(event.pos())
            self.update()
        print(self.joystickDirection())
 
if __name__ == '__main__':
    # Create main application window
    app = QApplication([])
    app.setStyle(QStyleFactory.create("Cleanlooks"))
    mw = QMainWindow()
    mw.setWindowTitle('Joystick example')
 
    # Create and set widget layout
    # Main widget container
    cw = QWidget()
    ml = QGridLayout()
    cw.setLayout(ml)
    mw.setCentralWidget(cw)
 
    # Create joystick 
    joystick = Joystick()
 
    # ml.addLayout(joystick.get_joystick_layout(),0,0)
    ml.addWidget(joystick,0,0)
 
    mw.show()
 
    ## Start Qt event loop unless running in interactive mode or using pyside.
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QApplication.instance().exec_()
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.08.2022, 10:15
Ответы с готовыми решениями:

Как получать координаты компонентов на форме
Как получать координаты PictureBox, чтоб верхний левый угол PictureBox было 0,0; А то когда делаю Mouse_Move - x = MousePosition.X; - не те...

Не правильно считываются координаты джойстика
Создается поток следующим образом: joypotok1:=joypotok.Create(False); joypotok1.FreeOnTerminate:=true; Далее такая...

Простой 2D редактор: При перетаскивании нужно получать координаты линий. Как их получить
Вообщем. Делал пример по МакДональду. Но его надо модернизировать. Первая проблема, с которой я столкнулся когда я добавляю линии в ...

3
 Аватар для kapbepucm
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
12.08.2022, 13:36
Лучший ответ Сообщение было отмечено Flight_ как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from PyQt5.QtGui import QPainter, QPixmap, QPen, QColor
from PyQt5.QtCore    import QPointF, QRectF, Qt, QLineF
from PyQt5.QtWidgets import QWidget, QMainWindow, QApplication, QStyleFactory, QGridLayout
import sys
 
class Joystick(QWidget):
    def __init__(self, parent=None):
        super(Joystick, self).__init__(parent)
        self.setMinimumSize(200, 200)
        self.movingOffset = QPointF(0, 0)
        self.grabCenter = False
        self.__maxDistance = 100
 
    def paintEvent(self, event):
        painter = QPainter(self)
        bounds = QRectF(-self.__maxDistance, -self.__maxDistance, self.__maxDistance * 2, self.__maxDistance * 2).translated(self._center())
        painter.drawEllipse(bounds)
        painter.setBrush(Qt.black)
        painter.drawEllipse(self._centerEllipse())
 
    def _centerEllipse(self):
        if self.grabCenter:
            return QRectF(-20, -20, 40, 40).translated(self.movingOffset)
        return QRectF(-20, -20, 40, 40).translated(self._center())
 
    def _center(self):
        return QPointF(self.width()/2, self.height()/2)
 
    def _boundJoystick(self, point):
        limitLine = QLineF(self._center(), point)
        if (limitLine.length() > self.__maxDistance):
            limitLine.setLength(self.__maxDistance)
        return limitLine.p2()
 
    def mousePressEvent(self, ev):
        self.grabCenter = self._centerEllipse().contains(ev.pos())
        return super().mousePressEvent(ev)
 
    def mouseReleaseEvent(self, event):
        self.grabCenter = False
        self.movingOffset = QPointF(50, 50)
        self.update()
 
    def mouseMoveEvent(self, event):
        if self.grabCenter:
            self.movingOffset = self._boundJoystick(event.pos())
            self.update()
 
            x = (self.movingOffset.x() - self.width()/2 + self.__maxDistance)/2
            y = (self.movingOffset.y() - self.height()/2 + self.__maxDistance)/2
            print(x,y)
 
if __name__ == '__main__':
    # Create main application window
    app = QApplication([])
    app.setStyle(QStyleFactory.create("Cleanlooks"))
    mw = QMainWindow()
    mw.setWindowTitle('Joystick example')
 
    # Create and set widget layout
    # Main widget container
    cw = QWidget()
    ml = QGridLayout()
    cw.setLayout(ml)
    mw.setCentralWidget(cw)
 
    # Create joystick 
    joystick = Joystick()
 
    ml.addWidget(joystick,0,0) 
    mw.show()
 
    ## Start Qt event loop unless running in interactive mode or using pyside.
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QApplication.instance().exec_()
1
0 / 0 / 0
Регистрация: 09.06.2022
Сообщений: 20
13.08.2022, 23:57  [ТС]
Спасибо Большое! А можно еще вопрос, как добавить этот джойстик во вкладку?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from PyQt5 import QtCore, QtGui, QtWidgets
 
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1519, 816)
        MainWindow.setMaximumSize(QtCore.QSize(1920, 1080))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(0, 0, 2305, 1000))
        self.tabWidget.setMouseTracking(False)
        self.tabWidget.setFocusPolicy(QtCore.Qt.WheelFocus)
        self.tabWidget.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.tabWidget.setAutoFillBackground(False)
        self.tabWidget.setObjectName("tabWidget")
        self.tab_1 = QtWidgets.QWidget()
        self.tab_1.setObjectName("tab_1")
        self.tabWidget_2 = QtWidgets.QTabWidget(self.tab_1)
        self.tabWidget_2.setGeometry(QtCore.QRect(-4, -1, 1271, 761))
        self.tabWidget_2.setObjectName("tabWidget_2")
        self.tab_1_1 = QtWidgets.QWidget()
        self.tab_1_1.setObjectName("tab_1_1")
        self.tabWidget_2.addTab(self.tab_1_1, "")
        self.tab_1_2 = QtWidgets.QWidget()
        self.tab_1_2.setObjectName("tab_1_2")
 
       
 
 
        
    
    
 
        self.tabWidget_2.addTab(self.tab_1_2, "")
        self.tabWidget.addTab(self.tab_1, "")
        MainWindow.setCentralWidget(self.centralwidget)
 
        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(0)
        self.tabWidget_2.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
      
    def handleButton(self):
        print(self.sender().text())
 
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_1_1), _translate("MainWindow", "tab_1_1"))
      
        self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_1_2), _translate("MainWindow", "tab_1_2"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_1), _translate("MainWindow", "tab 1"))
 
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
0
 Аватар для kapbepucm
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
15.08.2022, 15:34
Лучший ответ Сообщение было отмечено Flight_ как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import sys
from PyQt5.QtGui import QPainter, QPixmap, QPen, QColor
from PyQt5.QtCore    import QPointF, QRectF, Qt, QLineF, QSize, QRect, QCoreApplication, QMetaObject
from PyQt5.QtWidgets import QWidget, QMainWindow, QApplication, QStyleFactory, QGridLayout, QTabWidget
 
class Joystick(QWidget):
    def __init__(self, parent=None):
        super(Joystick, self).__init__(parent)
        self.setMinimumSize(200, 200)
        self.movingOffset = QPointF(0, 0)
        self.grabCenter = False
        self.__maxDistance = 100
    def paintEvent(self, event):
        painter = QPainter(self)
        bounds = QRectF(-self.__maxDistance, -self.__maxDistance, self.__maxDistance * 2, self.__maxDistance * 2).translated(self._center())
        painter.drawEllipse(bounds)
        painter.setBrush(Qt.black)
        painter.drawEllipse(self._centerEllipse())
    def _centerEllipse(self):
        if self.grabCenter:
            return QRectF(-20, -20, 40, 40).translated(self.movingOffset)
        return QRectF(-20, -20, 40, 40).translated(self._center())
    def _center(self):
        return QPointF(self.width()/2, self.height()/2)
    def _boundJoystick(self, point):
        limitLine = QLineF(self._center(), point)
        if (limitLine.length() > self.__maxDistance):
            limitLine.setLength(self.__maxDistance)
        return limitLine.p2()
    def mousePressEvent(self, ev):
        self.grabCenter = self._centerEllipse().contains(ev.pos())
        return super().mousePressEvent(ev)
    def mouseReleaseEvent(self, event):
        self.grabCenter = False
        self.movingOffset = QPointF(50, 50)
        self.update()
    def mouseMoveEvent(self, event):
        if self.grabCenter:
            self.movingOffset = self._boundJoystick(event.pos())
            self.update()
            x = (self.movingOffset.x() - self.width()/2 + self.__maxDistance)/2
            y = (self.movingOffset.y() - self.height()/2 + self.__maxDistance)/2
            print(x,y)
 
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1519, 816)
        MainWindow.setMaximumSize(QSize(1920, 1080))
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tabWidget = QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QRect(0, 0, 2305, 1000))
        self.tabWidget.setMouseTracking(False)
        self.tabWidget.setFocusPolicy(Qt.WheelFocus)
        self.tabWidget.setLayoutDirection(Qt.LeftToRight)
        self.tabWidget.setAutoFillBackground(False)
        self.tabWidget.setObjectName("tabWidget")
        self.tab_1 = QWidget()
        self.tab_1.setObjectName("tab_1")
        self.tabWidget_2 = QTabWidget(self.tab_1)
        self.tabWidget_2.setGeometry(QRect(-4, -1, 1271, 761))
        self.tabWidget_2.setObjectName("tabWidget_2")
        self.tab_1_1 = QWidget()
        self.tab_1_1.setObjectName("tab_1_1")
        self.tabWidget_2.addTab(self.tab_1_1, "")
        self.tab_1_2 = QWidget()
        self.tab_1_2.setObjectName("tab_1_2")
 
        ml = QGridLayout()
        joystick = Joystick()
        ml.addWidget(joystick,0,0) 
        self.tab_1_2.setLayout(ml)
 
        self.tabWidget_2.addTab(self.tab_1_2, "")
        self.tabWidget.addTab(self.tab_1, "")
        MainWindow.setCentralWidget(self.centralwidget)
 
        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(0)
        self.tabWidget_2.setCurrentIndex(1)
        QMetaObject.connectSlotsByName(MainWindow)
 
    def handleButton(self):
        print(self.sender().text())
 
    def retranslateUi(self, MainWindow):
        _translate = QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_1_1), _translate("MainWindow", "tab_1_1"))
      
        self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_1_2), _translate("MainWindow", "tab_1_2"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_1), _translate("MainWindow", "tab 1"))
 
 
if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.08.2022, 15:34
Помогаю со студенческими работами здесь

Как получать координаты мыши когда его курсор находится внутри, например Canvas
Необходимо отслеживать движение курсора чтобы возвращались его координаты относительно контейнера каждый тик.

Как кроме фиксирования нажатий кнопок мышки еще получать координаты курсора в x11-dev?
int fd; struct input_event ie; Display *dpy; Window root, child; int rootX, rootY, winX, winY; unsigned int...

Как получать координаты мыши в "textBox" в реальном времени?
Как получать координаты мыши в &quot;textBox&quot; в реальном времени?

Получать глобальные координаты мыши
Как получать координаты мыши по таймеру на форме и вне формы т.е. глобальные координаты мыши? Добавлено через 1 час 12 минут Нашёл...

Получать координаты курсора и по ним вычислять угол
Доброго времени суток! Мучаюсь уже часа 2 не могу понять, в чем дело... Суть программы, получать координаты курсора и по ним...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru