Как в PyQt, используя spinBox, получить результат арифметической операции, выполняемой в другом классе?

Рейтинг: 1Ответов: 1Опубликовано: 03.04.2023

Я пытаюсь передать значение spinBox в класс New(), в котором функция foo() должна к значению из spinBox прибавлять единицу и выводить результат в label.

Помогите дописать код.

main.py

from PyQt6.QtCore import QThread
from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6.uic import loadUi
import sys

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        loadUi("Test.ui", self)

        self.label.setText("Привет")
        self.spinBox.valueChanged.connect(self.getValue)

    def getValue(self):
        self.value = self.spinBox.value()
        print('Value : {0}'.format(self.value))


class New(QThread):
    def foo(self):
        ''' Функция получает значение из spinBox,
        прибавляет единичку и результат выводит в окно label '''

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec())

Test.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>732</width>
    <height>539</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QGroupBox" name="groupBox">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>0</y>
      <width>701</width>
      <height>491</height>
     </rect>
    </property>
    <property name="title">
     <string>GroupBox</string>
    </property>
    <widget class="QSpinBox" name="spinBox">
     <property name="geometry">
      <rect>
       <x>520</x>
       <y>190</y>
       <width>131</width>
       <height>61</height>
      </rect>
     </property>
    </widget>
    <widget class="QLabel" name="label">
     <property name="geometry">
      <rect>
       <x>110</x>
       <y>190</y>
       <width>341</width>
       <height>51</height>
      </rect>
     </property>
     <property name="text">
      <string>TextLabel</string>
     </property>
    </widget>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>732</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

Ответы

▲ 1Принят

Вам не нужно создавать класс New().

void QSpinBox::valueChanged(int i)

Этот сигнал испускается всякий раз, когда изменяется значение счетчика. Целочисленное значение нового значения передается в i.

import sys
from PyQt6.QtCore import QThread
from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6.uic import loadUi


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        loadUi("Test.ui", self)

        self.label.setText("Привет")
        self.spinBox.valueChanged.connect(self.getValue)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    def getValue(self, value):
        self.label.setText(f"{value + 1}")
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

UPDATE:

Мне нужен этот класс, так как в моем проекте все вычисления должны проводиться в других классах, а не в классе с интерфейсом. Мне просто нужно понять принцип

Как вариант:

import sys
'''
from PyQt6.QtCore import QThread
from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6.uic import loadUi
'''
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.uic import loadUi
from PyQt5.Qt import *

#class New(QThread):
class New(QWidget):                                               # !!! QWidget
    def __init__(self, parent=None):
        super(New, self).__init__(parent)
        self.parent = parent

    def foo(self):
        ''' Функция получает значение из spinBox,
        прибавляет единичку и результат выводит в окно label '''
        value = self.parent.spinBox.value()
        value = value + 1
        self.parent.label.setText(f"{value}")
        

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        loadUi("q1510511_Test.ui", self)

        self.label.setText("Привет")
        self.spinBox.valueChanged.connect(self.getValue)
        
        

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        self.new = New(self)

    def getValue(self, value):
        self.new.foo()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

введите сюда описание изображения