Это задания для тех, кто хочет испытать себя. Так что тут просто набор подсказок:

Именования

Называйте элементы в соответствии с их логикой. Например, кнопку для добавления цифры 1 назовите btn1, кнопку умножения btnProd и так далее:

Обобщайте код

Создайте одну функцию с параметром чтобы добавлять число в поле для ввода, примерно такого вида:

def addNumber(self, value):
    text = self.ui.txtInput.text()
    if text != "0":
        text += value
    else:
        text = value
    self.ui.txtInput.setText(text)

а затем привяжите ее к кнопкам чисел следующим образом

self.ui.btn0.clicked.connect(lambda _: self.addNumber('0'))
self.ui.btn1.clicked.connect(lambda _: self.addNumber('1'))
self.ui.btn2.clicked.connect(lambda _: self.addNumber('2'))
self.ui.btn3.clicked.connect(lambda _: self.addNumber('3'))
self.ui.btn4.clicked.connect(lambda _: self.addNumber('4'))
self.ui.btn5.clicked.connect(lambda _: self.addNumber('5'))
self.ui.btn6.clicked.connect(lambda _: self.addNumber('6'))
self.ui.btn7.clicked.connect(lambda _: self.addNumber('7'))
self.ui.btn8.clicked.connect(lambda _: self.addNumber('8'))
self.ui.btn9.clicked.connect(lambda _: self.addNumber('9'))
self.ui.pushButton.clicked.connect(lambda _: self.addNumber('.'))

при таком подходе вам не придется создавать отдельную функцию на каждую кнопку

Расчет операций

Так как в калькуляторе всегда есть некое предыдущее значение его надо хранить в переменной. Также есть операция на которую тыкнули последний раз, которую тоже надо хранить в переменной.

Создайте в функции init две этих переменных и привяжите их к self, это даст возможность обращаться к этим переменным их других функций

# ...
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.last_number = None  # под последнее число
        self.last_operation = None # под последнюю операцию
        
        # ...

а затем при выполнении операции считывайте число из инпута

def on_btnAdd_clicked(self):
    # сохранил число с поля для ввода в операцию
    self.last_number = float(self.ui.txtInput.text())
    # сбросил txtInput
    self.ui.txtInput.setText("0")  
    
    # зафиксировал в переменную операцию
    self.last_operation = '+'

помните, что такую функцию надо сделать на каждую кнопку операции и не забыть привязать к событию клика, типа

self.ui.btnAdd.clicked.connect(self.on_btnAdd_clicked)

Кнопка равно

Для расчета надо просто взять текущее значение с формы и выполнить над ним операцию с последним числом, типа так:

def on_btnEq_clicked(self):
    current_number = float(self.ui.txtInput.text())
    if self.last_operation == '+':
        c = self.last_number + current_number
    elif self.last_operation == '*':
        c = self.last_number * current_number         
    elif self.last_operation == '/':
        c = self.last_number / current_number                 
    elif self.last_operation == '-':
        c = self.last_number - current_number  

    self.ui.txtInput.setText(str(c))

Кнопка сброса C

кнопка должна сбрасывать значения на форме и переменных self.last_number и self.last_operation на начальные значения

Cтилизация

Вы можете прописывать стили сразу всем кнопками. Например, мы можем добавить отступы кнопками и сделать их шрифт побольше и жирным если добавить следующий код

QPushButton {
    padding: 8px;
    font-size: 15px;
    font-weight: bold;
}

вот сюда:

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

цвета можно передавать либо использую имена, либо hex или rgb формат

для быстрого выбора цвета можно использовать гугловскую выбиралку цвета https://www.google.com/search?q=color+selector&sourceid=chrome&ie=UTF-8

А вообще список возможных свойств можно глянуть тут https://doc.qt.io/qt-6/stylesheet-reference.html#list-of-properties, правда там все на инглише.

Задание

Создать калькулятор, какой-нибудь такой, в общем как получится: