Storing the contents of text fields and inserting the stored values on button-click I've created a little GUI where the text entered in the text-fields is stored in a property of the currently selected button. If a different button is clicked, the contents stored for that button are inserted into the text-fields.
For storing the information I'm currently using a class where each text-field's contents represent a separate attribute:
from PyQt5.QtWidgets import *


class MainWindow(QMainWindow):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        v_layout = QVBoxLayout()
        cent_widget = QWidget()
        cent_widget.setLayout(v_layout)
        self.setCentralWidget(cent_widget)

        # Buttons
        h_layout = QHBoxLayout()
        v_layout.addLayout(h_layout)

        self.btn_group = QButtonGroup()
        self.btn_group.setExclusive(True)

        btn_1 = QPushButton('Button 1')
        btn_2 = QPushButton('Button 2')
        btn_3 = QPushButton('Button 3')

        for w in [btn_1, btn_2, btn_3]:
            w.setProperty('data', Storage())
            w.setCheckable(True)
            w.clicked.connect(self.set_data)
            self.btn_group.addButton(w)
            h_layout.addWidget(w)
        btn_1.setChecked(True)

        # Text Fields
        self.tf_1 = QLineEdit()
        self.tf_2 = QSpinBox()
        self.tf_3 = QLineEdit()

        for w in [self.tf_1, self.tf_2, self.tf_3]:
            w.editingFinished.connect(lambda x=w: self.update_storage(x))
            v_layout.addWidget(w)

    def update_storage(self, widget):
        active_storage = self.btn_group.checkedButton().property('data')

        if widget == self.tf_1:
            active_storage.field1 = self.tf_1.text()
        elif widget == self.tf_2:
            active_storage.field2 = self.tf_2.value()
        elif widget == self.tf_3:
            active_storage.field3 = self.tf_3.text()

    def set_data(self):
        btn = self.btn_group.checkedButton()
        storage = btn.property('data')

        self.tf_1.setText(storage.field1)
        self.tf_2.setValue(storage.field2)
        self.tf_3.setText(storage.field3)


class Storage:
    def __init__(self):
        self.field1 = ''
        self.field2 = -1
        self.field3 = ''


if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()


I have a feeling like I'm working against Qt here or I'm at least not using its full potential, because I think Qt could include some tools to make this more efficient and I just did not find them.
Your implementation of Storage lends itself nicely to using a dataclass.
from dataclasses import dataclass

@dataclass
class Storage:
    field1: str = &quot;&quot;
    field2: int = -1
    field3: str = &quot;&quot;

This makes your class definition really concise and readable and provides improved scalability and convenient implementations of built-in functions if you ever need them.
You should also consider giving fields and widgets more meaningful names (maybe even changing button text to match their functionality) to improve readability and usability.
Further material on dataclasses:

Data Classes in Python 3.7+ (Guide) on RealPython
Python dataclasses on Youtube by mCoding


The way you create the three buttons does not scale well, changing this part will have to be done by hand and is therefore error-prone. I'm talking about this code snippet:
btn_1 = QPushButton('Button 1')
btn_2 = QPushButton('Button 2')
btn_3 = QPushButton('Button 3')

for w in [btn_1, btn_2, btn_3]:
    w.setProperty('data', Storage())
    w.setCheckable(True)
    w.clicked.connect(self.set_data)
    self.btn_group.addButton(w)
    h_layout.addWidget(w)

I find the following approach to be a lot cleaner, while producing the same result. You basically only need to change the stop argument in range(start, stop) if you want to change the amount of buttons:
for i in range(start=1, stop=4):
    btn = QPushButton(f&quot;Button {i}&quot;)
    btn.setProperty('data', Storage())
    btn.setCheckable(True)
    btn.clicked.connect(self.set_data)

    self.btn_group.addButton(btn)
    h_layout.addWidget(btn)

    setattr(self, f&quot;btn_{i}&quot;, btn)


I'm sure there's a better way to set up update_storage and set_data without hardcoding the widgets, but I didn't think of a satisfactory approach yet.