Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 09.06.2022
Сообщений: 20
PyQt5

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

12.08.2022, 10:15. Показов 1631. Ответов 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 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru