diff --git a/GUI_16_10_staticWorkflow_Multithreading.py b/GUI_16_10_staticWorkflow_Multithreading.py
deleted file mode 100644
index 776caf1..0000000
--- a/GUI_16_10_staticWorkflow_Multithreading.py
+++ /dev/null
@@ -1,950 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file 'test.ui'
-#
-# Created by: PyQt5 UI code generator 5.15.9
-#
-# WARNING: Any manual changes made to this file will be lost when pyuic5 is
-# run again. Do not edit this file unless you know what you are doing.
-
-
-########## beim Static workflow funktionieren die Threads ab dem zweiten nicht mehr
-
-#from PyQt5 import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QProgressBar
-from PyQt5 import QtCore, QtGui, QtWidgets
-from PyQt5.QtWidgets import QApplication, QComboBox
-from PyQt5.QtCore import QTimer, QThread, pyqtSignal, QObject, Qt
-from PyQt5.QtGui import QColor
-
-import serial
-import binascii
-import math
-import mariadb
-import time
-import threading
-
-
-# db_config = {
-# 'user': 'dbUser',
-# 'password': 'dbPassword',
-# 'host': '127.0.0.1', # 'host': 'localhost',
-# 'database': 'projectGeislinger',
-# 'port': 3306 # Standard port for MariaDB
-# }
-
-db_config = {
- 'user': 'dbUser',
- 'password': 'dbPassword',
- 'host': '127.0.0.1', # 'host': 'localhost',
- 'database': 'projectGeislinger',
- 'port': 3306 # Standard port for MariaDB
-}
-
-
-# Establishing the connection
-conn = mariadb.connect(**db_config)
-# Create a cursor to execute queries
-cursor = conn.cursor()
-
-# Konfiguration der seriellen Schnittstelle
-ser = serial.Serial('/dev/ttyUSB0', 9600)
-#ser = serial.Serial('/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0', 9600) #dadurch garantiert immer die gleiche Schnittstelle verwendet
-# und nicht die Schnittstelle, welche die Bezeichnung ttyUSB0 verwendet (welche sich ändern könnte)
-# um die ID der USB-Schnittstelle heraus zu finden im Terminal folgendes eingeben: ls -l /dev/serial/by-id/
-
-
-waageEingeschwungen = False
-
-
-def wahrscheinlichkeitsDichte(x,mue, var):
- # in der Funktion wird der Wahrscheinlichkeitsdichtenwert der Variable x für eine bestimmte Normalverteilung berechnet
- standardabweichung = var**0.5
-
- result = 1/(standardabweichung * (2*math.pi)**0.5 ) * math.exp(-0.5 * ((x-mue)/standardabweichung)**2)
-
- return result
-
-def calcWahrscheinlichkeitFromDichte(x,mue, var):
- # in der Funktion wird die Wahrscheinlichkeit via der Wahrscheinlichkeitsdichte berechnet, indem das Verhältnis aus der dem Bauteil zugehörigen Wahrscheinlichkeitsdichte zu der maximalen Wahrscheinlichkeitsdichte berechnet wird
- p1 = wahrscheinlichkeitsDichte(x,mue, var)
- p_max = wahrscheinlichkeitsDichte(mue,mue, var)
-
- return p1/p_max
-
-
-
-#class Worker(QThread):
-class Worker(QObject):
- #progress = pyqtSignal(int)
- objectDetectionStartSignal = pyqtSignal(str)
- objectDetectionFinishedSignal = pyqtSignal(int, object)
-
- checkWaageStartSignal = pyqtSignal(int, int, str)
- checkWaageUpdateSignal = pyqtSignal(int, int)
- checkWaageFinishedSignal = pyqtSignal(int)
-
- waageStoppedSignal = pyqtSignal(int)
- stopLoopSignal = pyqtSignal(bool) #das Signal wird verwendet um direkt den stopLoop-Wert zu ändern (also kein Funktionsaufruf)
-
- stopLoop = False
- btTypeIsSet = False
- correctBtNr = False
-
-
- def __init__(self):
- super(Worker, self).__init__()
- stopLoop = False
-
-
- def getDataOfArticleType(self, allArticles, articleType):
- # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
- for i in allArticles:
- if i[1] == articleType:
- return i
-
- return -1
-
- def waageNichtEingeschwungenOutput(self):
- print("Die Waage ist noch nicht eingeschwungen - Ergebnisse sind dadurch noch fehlerhaft.")
-
- def readWaage(self):
- # in folgender Funktion wird die Waage ausgelesen
-
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
- #print("port to which it is connected: ", ser.portstr) #Debuggingausgabe
-
-
- if ser.is_open == False:
- ser.open()
-
-
- #an die Waage den Befehl senden, dass sie ausgelesen werden soll
- ser.write(b'getWeight\n')
- #ser.write(b'tare\n')
- serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
-
- # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
- lenString = len(serialString)-1
- if serialString[lenString] == "g" and serialString[lenString-1] == "k":
- #print("ist eingeschwungen") #Debuggingausgabe
- waageEingeschwungen = True
- else:
- print("die Waage ist noch nicht eingeschwungen")
- waageEingeschwungen = False
-
- #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
- intString = ""
- for i in serialString:
- if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
- intString = intString + i
- print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
- ## Waage auslesen - ENDE
-
- ser.close()
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
-
- return waageEingeschwungen, intString
-
- def objectTypeDetectionThread(self, auftragsnummer):
- # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
-
- #print("objectTypeDetectionThread - Running in thread:", threading.current_thread().name) #Debuggausgabe
-
- # Parameterdefinition
- propDensVect = []
-
- self.btTypeIsSet = False
-
- while(self.btTypeIsSet == False and self.stopLoop == False):
-
- # Auslesen der Waage
- waageEingeschwungen, intString = self.readWaage()
- if waageEingeschwungen == False:
- self.waageNichtEingeschwungenOutput()
- else:
-
- # Datenbankabfrage
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
- cursor.execute(sql_query)
- auftragEinzelteilDaten = cursor.fetchall()
-
- '''
- # Display data #Debugausgabe
- print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
- for row in auftragEinzelteilDaten:
- print(row)
- '''
-
- # in der Folge werden alle Wahrscheinlichkeitsdichten der Auftragsbauteile berechnet und in dem Vektor gesammelt
- for row in auftragEinzelteilDaten:
- propDensVect.append([wahrscheinlichkeitsDichte(float(intString),float(row[6]), float(row[7])), row[1], row[5]])
-
- # Jenen Eintrag des propDensVect raussuchen, welcher die größte Wahrscheinlichkeitsdichte beinhaltet
- maxpropDens = 0
- einzelteilID = 0
- rowData = None
- for row in propDensVect:
- if row[0] > maxpropDens:
- maxpropDens = row[0]
- einzelteilID = row[1]
- rowData = row
-
- # überprüfen, ob das aufliegende Bauteil in der Auftragstabelle vorhanden ist
- if(einzelteilID == 0):
- print("Es wurde kein Bauteil aus der Auftragsliste (Tabelle) erkannt.")
- else:
- print("Bei dem Bauteil" , einzelteilID , "wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
-
- # Wahrscheinlichkeit berechnen, dass das angegebene Bauteil auch wirklich diesem entspricht
- prop = 0
- for row in auftragEinzelteilDaten:
- if row[1] == einzelteilID:
- prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6]), float(row[7]))
- break
- print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
-
- # den Bool auf true setzen, damit die Schleife beendet wird - dieser wird auf True gesetzt, wenn ein Bauteiltyp erkannt wird
- self.btTypeIsSet = True
-
- if(self.stopLoop == False):
- # ein Signal zurück an den MainThreat senden, mit den Infos/Ergebnissen, der Typenbestimmung
- self.objectDetectionFinishedSignal.emit(einzelteilID, rowData)
- else:
- self.waageStoppedSignal.emit(einzelteilID)
-
- def checkWaageThread(self, einzelteilID, teileZuViel, auftragsnummer):
-
- self.correctBtNr = False
- prevAnzahl = 0
- anzahl = 0
- einzelteilID = einzelteilID
-
- while (self.correctBtNr == False and self.stopLoop == False):
-
- #überprüfen, ob die Waage eingeschwungen ist (und damit korrekte Ergebnisse liefert)
- waageEingeschwungen, intString = self.readWaage()
- if waageEingeschwungen == False:
- self.waageNichtEingeschwungenOutput()
- else:
-
- # Datenbankabfrage - holen der Auftrags- und Bauteilinfos
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
- cursor.execute(sql_query)
- auftragDaten = cursor.fetchall()
-
- '''
- # Display data - zum Debuggen
- print("Ausgabe der Auftragsdetails:")
- print("id|EinzelteilID|Auftragsnummer|Anzahl")
- for row in auftragDaten:
- print(row)
- '''
-
- #auslesen, wie viele Bauteile des Types laut Auftrag vorhanden sein sollen
- anzBauteile_soll = 0
- idVorhanden = False
-
- for row in auftragDaten:
- if row[1] == einzelteilID:
- anzBauteile_soll = row[3]
- idVorhanden = True
-
- if(idVorhanden == False):
- print("Die gewählte Pos.Nr ist nicht in der Auftragsliste (Tabelle) vorhanden.")
- return
-
- # Berechnen der Wahrscheinlichkeitsdichten - der Betrag aller Wahrscheinlichkeitsdichten werden im propDensVect gespeichert
- propDensVect = []
- articleData = self.getDataOfArticleType(auftragDaten, einzelteilID)
- for i in range(1,anzBauteile_soll+teileZuViel+1):
- # Mathematische Sätze, auf welchen die Berechnung basiert:
- # seien X1,..., Xn unabhängige Zufallsvariablen die N(mue_i, sigma_i^2) verteilt sind, dann ist X = X1+...+Xn - N(mue, sigma^2) verteilt mit mue=mue1+...+mue_n, sigma^2 = sigma_1^2+...+sigma_n^2
- mueGes = float(articleData[6])*i # Berechnen des äquivalenten Mittelwert
- varGes = float(articleData[7])*i # Berechnen der äquivalenten Varianz
- propDensVect.append([wahrscheinlichkeitsDichte(float(intString),mueGes, varGes), i])
-
- # durch den propDensVect iterieren und jenen Eintrag mit der höchsten Wahrscheinlichkeitsdichte raussuchen
- maxpropDens = 0
- for row in propDensVect:
- if row[0] > maxpropDens:
- maxpropDens = row[0]
- anzahl = row[1]
-
- # damit nur etwas gemacht wird (zb ein Updatesignal an den Hauptthread zurücksenden), wenn sich die berechnete Anzahl ändert
- if prevAnzahl != anzahl:
- prevAnzahl = anzahl
-
- # Die Wahrscheinlichkeit berechnen, dass das obige Ergebnis auch dem Bauteil entspricht
- if anzahl > 0:
- for row in auftragDaten:
- if row[1] == einzelteilID:
- prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6])*anzahl, float(row[7])*anzahl)
- break
- print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
-
- # wenn genug Bauteile vorhanden sind, dann soll die Schleife beendet werden
- if (anzahl == anzBauteile_soll):
- self.correctBtNr = True
-
- # Konsolenausgabe
- if maxpropDens > 0:
- print("Bei der Anzahl" , anzahl , "des Bauteiltypes", einzelteilID, ",wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
- self.checkWaageUpdateSignal.emit(einzelteilID, anzahl)
-
- else:
- print("Von der ausgewählten Bauteiltype liegt die berechnete Wahrscheinlichkeit bei 0, dass zwischen 0 und", anzBauteile_soll+teileZuViel, "Bauteilen auf der Waage liegen.")
- print("Falls die korrekte Anzhl an Bauteilen auf der Waage liegt, könnte der Fehler in einer falschen Kalibrierung der Waage liegen (TARE).")
-
- if(self.stopLoop == False):
- self.checkWaageFinishedSignal.emit(einzelteilID)
- else:
- self.waageStoppedSignal.emit(einzelteilID)
-
-
-
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- self.auftragsnummer = ""
- self.teileZuViel = 100 # Anzahl an Bauteilen, welche zu viel drinnen sein können - der Parameter kann selbst gesetzt werden #####
- self.correctBtNr = False
- self.btTypeIsSet = False
-
-
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1400, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.btn1 = QtWidgets.QPushButton(self.centralwidget)
- self.btn1.setGeometry(QtCore.QRect(700, 45, 111, 25))
- self.btn1.setObjectName("btn1")
- # Tabelle zur Darstellung der Auftragsdetails
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 100, 661, 400))
- self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
- self.AuftragsdetailsTable.setColumnCount(7)
- self.AuftragsdetailsTable.setRowCount(0)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(5, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(6, item)
-
- # Tabelle zur Darstellung der Arbeitsschritte
- self.ArbeitsschrittTable = QtWidgets.QTableWidget(self.centralwidget)
- self.ArbeitsschrittTable.setGeometry(QtCore.QRect(1000, 50, 395, 400))
- self.ArbeitsschrittTable.setObjectName("AuftragsdetailsTable")
- self.ArbeitsschrittTable.setColumnCount(2)
- self.ArbeitsschrittTable.setRowCount(4)
- self.ArbeitsschrittTable.setColumnWidth(0, 100)
- self.ArbeitsschrittTable.setColumnWidth(1, 280)
- self.ArbeitsschrittTable.setRowHeight(0, 80)
- self.ArbeitsschrittTable.setRowHeight(1, 180)
- self.ArbeitsschrittTable.setRowHeight(2, 50)
- self.ArbeitsschrittTable.setRowHeight(3, 50)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.ArbeitsschrittTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.ArbeitsschrittTable.setHorizontalHeaderItem(1, item)
-
- self.label = QtWidgets.QLabel(self.centralwidget)
- self.label.setGeometry(QtCore.QRect(500, 20, 121, 17))
- self.label.setObjectName("label")
- self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit.setGeometry(QtCore.QRect(450, 40, 221, 31))
- self.textEdit.setObjectName("textEdit")
- self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
- self.bauteilTypBtn.setGeometry(QtCore.QRect(700, 100, 161, 25))
- self.bauteilTypBtn.setObjectName("bauteilTypBtn")
- self.checkWaageBtn = QtWidgets.QPushButton(self.centralwidget)
- self.checkWaageBtn.setGeometry(QtCore.QRect(700, 150, 161, 25))
- self.checkWaageBtn.setObjectName("checkWaageBtn")
- self.stopLoopBtn = QtWidgets.QPushButton(self.centralwidget)
- self.stopLoopBtn.setGeometry(QtCore.QRect(700, 350, 161, 25))
- self.stopLoopBtn.setObjectName("stopLoopBtn")
- self.waageTareBtn = QtWidgets.QPushButton(self.centralwidget)
- self.waageTareBtn.setGeometry(QtCore.QRect(700, 400, 161, 25))
- self.waageTareBtn.setObjectName("waageTareBtn")
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
- self.bauteiltypTextbox.setGeometry(QtCore.QRect(700, 290, 221, 31))
- self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
- self.BezeichnungLabel = QtWidgets.QLabel(self.centralwidget)
- self.BezeichnungLabel.setGeometry(QtCore.QRect(700, 270, 181, 20))
- self.BezeichnungLabel.setObjectName("BezeichnungLabel")
- self.PosNrLabel = QtWidgets.QLabel(self.centralwidget)
- self.PosNrLabel.setGeometry(QtCore.QRect(700, 200, 67, 17))
- self.PosNrLabel.setObjectName("PosNrLabel")
- self.PosNrTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
- self.PosNrTxtFeld.setGeometry(QtCore.QRect(700, 220, 191, 31))
- self.PosNrTxtFeld.setObjectName("PosNrTxtFeld")
- self.teileZuVielLabel = QtWidgets.QLabel(self.centralwidget)
- self.teileZuVielLabel.setGeometry(QtCore.QRect(1000, 560, 350, 17))
- self.teileZuVielLabel.setObjectName("teileZuVielLabel")
- self.teileZuVielTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
- self.teileZuVielTxtFeld.setGeometry(QtCore.QRect(1000, 580, 191, 31))
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
- self.menubar.setObjectName("menubar")
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
- self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
- self.checkBox.setGeometry(QtCore.QRect(1000, 480, 151, 23))
- self.checkBox.setObjectName("checkBox")
- self.checkBoxAutoTare = QtWidgets.QCheckBox(self.centralwidget)
- self.checkBoxAutoTare.setGeometry(QtCore.QRect(1000, 520, 180, 23))
- self.checkBoxAutoTare.setObjectName("checkBoxAutoTare")
-
- #self.myTestLambda = lambda: self.worker.checkWaageStartSignal.emit(einzelteilID, self.teileZuViel, self.auftragsnummer)
-
- '''
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setVerticalHeaderItem(0,item)
- '''
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
- self.btn1.clicked.connect(self.auftragsBtnClicked)
-
- # Tabelle zur Darstellung der Auftragsdetails
- item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Pos.-Nr"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
- item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
- item.setText(_translate("MainWindow", "Soll-Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
- item.setText(_translate("MainWindow", "Ist-Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(5)
- item.setText(_translate("MainWindow", "Lgort"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(6)
- item.setText(_translate("MainWindow", "set Farbe"))
-
- # Tabelle zur Darstellung der Arbeitsschritte
- item = self.ArbeitsschrittTable.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Arbeitsschritt"))
- item = self.ArbeitsschrittTable.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "ToDo:"))
-
- # Befüllen der Arbeisschritttabelle mit Text
- #item = self.ArbeitsschrittTable.
- # Ein neues QTableWidgetItem erstellen und den Text setzen
- item = QtWidgets.QTableWidgetItem("Auftrag laden")
- self.ArbeitsschrittTable.setItem(0, 0, item)
- item = QtWidgets.QTableWidgetItem("--> Auftragsnummer eingeben \n--> \"load Auftrag\" Buttonclick")
- self.ArbeitsschrittTable.setItem(0, 1, item)
- item = QtWidgets.QTableWidgetItem("Bauteiltyp erkennen")
- self.ArbeitsschrittTable.setItem(1, 0, item)
- item = QtWidgets.QTableWidgetItem("visuell: \n--> ein Bauteil in die Kamera halten\n\nWaage: \n--> ein Bauteil auf die Waage legen\n--> \"Bauteiltyp erkennen\" Buttonclick\n\nmanuell:\n--> Bauteiltypen auswählen\n-->\"ckeck Waage\" Button click")
- self.ArbeitsschrittTable.setItem(1, 1, item)
- item = QtWidgets.QTableWidgetItem("Bauteilanzahl erkennen")
- self.ArbeitsschrittTable.setItem(2, 0, item)
- item = QtWidgets.QTableWidgetItem("--> Bauteile auflegen")
- self.ArbeitsschrittTable.setItem(2, 1, item)
- item = QtWidgets.QTableWidgetItem("Prozess beendet")
- self.ArbeitsschrittTable.setItem(3, 0, item)
- self.ArbeitsschrittTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
-
- #self.ArbeitsschrittTable.item(0,0).setText("test")
-
- #einzelteilID = int(self.AuftragsdetailsTable.item(i,0).text())
- #self.PosNrTxtFeld.setText(str(self.AuftragsdetailsTable.item(i,0).text()))
- #self.bauteiltypTextbox.setText(str(self.AuftragsdetailsTable.item(i,2).text()))
-
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltyp erkennen"))
- self.bauteilTypBtn.clicked.connect(self.objectTypeDetection)
- self.AuftragsdetailsTable.cellClicked.connect(self.onTableCellClick)
- #self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
- #item = self.AuftragsdetailsTable.verticalHeaderItem(0)
- #item.setText(_translate("MainWindow", "test"))
- self.BezeichnungLabel.setText(_translate("MainWindow", "Bezeichnung"))
- self.PosNrLabel.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.teileZuVielLabel.setText(_translate("MainWindow", "Zu prüfende Teileanzahl über Auftragsanzahl:"))
- self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
- self.checkWaageBtn.setText(_translate("MainWindow", "check Waage"))
- self.checkWaageBtn.clicked.connect(self.checkWaage)
- self.stopLoopBtn.setText(_translate("MainWindow", "stop loop"))
- self.stopLoopBtn.clicked.connect(self.stopLoopClicked)
- self.waageTareBtn.setText(_translate("MainWindow", "Waage tarieren"))
- self.waageTareBtn.clicked.connect(self.onTareClick)
- self.checkBox.setText(_translate("MainWindow", "static workflow"))
- self.checkBox.clicked.connect(self.onCheckboxCheck)
- self.checkBoxAutoTare.setText(_translate("MainWindow", "automatisches Tarieren"))
- self.checkBoxAutoTare.clicked.connect(self.autoTareCheck)
-
- self.setRowColor(self.ArbeitsschrittTable, 0,255,165,0) # zum setzen der ersten Spalte der Arbeitsschrittetabelle auf orange
- self.checkBoxAutoTare.setCheckState(Qt.Checked)
- self.checkBox.setCheckState(Qt.Unchecked)
-
-
- def mousePressEvent(self, event):
- print("Das MainWindow wurde angeklickt.")
- self.setFocus()
- super().mousePressEvent(event)
-
-
- def onTareClick(self):
- #Tarieren der Waage
- if ser.is_open == False:
- ser.open()
- ser.write(b'tare\n')
- ser.close()
-
-
- def onCheckboxCheck(self):
- if self.checkBox.isChecked() == True:
- print("static workflow activated")
- else:
- print("static workflow deactivated")
-
- def autoTareCheck(self):
- if self.checkBoxAutoTare.isChecked() == True:
- print("automatisches Tarieren ist aktiviert")
- else:
- print("automatisches Tarieren ist deaktiviert")
-
- def getRowNr(self, posNr):
- for i in range(0,self.AuftragsdetailsTable.rowCount()):
- if(self.AuftragsdetailsTable.item(i,0).text() == str(posNr)):
- return i
-# brauche ich hier vermutlich nicht mehr - ist in den Worker Thread kopiert worden
- def waageNichtEingeschwungenOutput(self):
- print("Die Waage ist noch nicht eingeschwungen - Ergebnisse sind dadurch noch fehlerhaft.")
-
- def onTableCellClick(self):
- self.PosNrTxtFeld.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),0).text())
- self.bauteiltypTextbox.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),2).text())
-
- def setAuftragsnummer(self):
- self.auftragsnummer = self.textEdit.toPlainText()
- if(not self.auftragsnummer):
- self.auftragsnummer = ""
- self.textEdit.setText("")
-
- def checkAuftragsnummerEmpty(self):
- if self.auftragsnummer == "":
- print("Das Auftragsnummernfeld ist leer.")
- return True
- else:
- return False
-
- def checkPosNrEmpty(self):
- if self.PosNrTxtFeld.toPlainText() == "":
- return True
- else:
- return False
-
-
-# eventuell benötigt man die Funktion hier nicht mehr, da sie zu den Threads kopiert wurde
- def getDataOfArticleType(self, allArticles, articleType):
- # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
- for i in allArticles:
- if i[1] == articleType:
- return i
- return -1
-
- def updateGUI(self):
- self.PosNrLabel.repaint() #GUI aktualisieren
- QApplication.processEvents() #GUI aktualisieren
-
-
- def setRowColor(self, tableObject, rowID,r,g,b):
- for col in range(tableObject.columnCount()-1):
- tableObject.item(rowID, col).setBackground(QtGui.QColor(r,g,b))
- '''
- die alte Version der Programmierung
- tableObject.item(rowID, 0).setBackground(QtGui.QColor(r,g,b))
- tableObject.item(rowID, 1).setBackground(QtGui.QColor(r,g,b))
- tableObject.item(rowID, 2).setBackground(QtGui.QColor(r,g,b))
- tableObject.item(rowID, 3).setBackground(QtGui.QColor(r,g,b))
- tableObject.item(rowID, 4).setBackground(QtGui.QColor(r,g,b))
- tableObject.item(rowID, 5).setBackground(QtGui.QColor(r,g,b))
- '''
-
-#wird hier vermutlich nicht mehr benötigt - wurde in die Workerklasse kopiert
- def readWaage(self):
- # in folgender Funktion wird die Waage ausgelesen
-
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
- #print("port to which it is connected: ", ser.portstr) #Debuggingausgabe
- self.checkPosNrEmpty()
-
- if ser.is_open == False:
- ser.open()
-
-
- #an die Waage den Befehl senden, dass sie ausgelesen werden soll
- ser.write(b'getWeight\n')
- #ser.write(b'tare\n')
- serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
-
- # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
- lenString = len(serialString)-1
- if serialString[lenString] == "g" and serialString[lenString-1] == "k":
- #print("ist eingeschwungen") #Debuggingausgabe
- waageEingeschwungen = True
- else:
- print("die Waage ist noch nicht eingeschwungen")
- waageEingeschwungen = False
-
- #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
- intString = ""
- for i in serialString:
- if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
- intString = intString + i
- print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
- ## Waage auslesen - ENDE
-
- ser.close()
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
-
- return waageEingeschwungen, intString
-
- def auftragsBtnClicked(self):
- databaseQueryWorking = False #wird für die Überprüfung, ob die Datenbankabfrage fehlerhaft ist, verwendet
- auftragEinzelteilDaten = []
-
- self.setAuftragsnummer()
- if(not self.checkAuftragsnummerEmpty()):
-
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + self.auftragsnummer
- try:
- cursor.execute(sql_query)
- # Fetch results
- auftragEinzelteilDaten = cursor.fetchall()
- databaseQueryWorking = True
- except:
- print("Fehler in der Datenbankabfrage.")
-
-
-
- if databaseQueryWorking==True and len(auftragEinzelteilDaten)>0:
- '''
- # Display data
- print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
- for row in auftragEinzelteilDaten:
- if str(row[2]) == self.auftragsnummer:
- print("passt")
- print(row)
- '''
-
- ### die Auftragsdaten in die Tabelle laden
- self.AuftragsdetailsTable.setRowCount(len(auftragEinzelteilDaten))
- self.item = QtWidgets.QTableWidgetItem()
- counter = 0
- for row in auftragEinzelteilDaten:
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 0, self.item)
- self.item.setText(str(row[1]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 1, self.item)
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 2, self.item)
- self.item.setText(str(row[5]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 3, self.item)
- self.item.setText(str(row[3]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 4, self.item)
- self.item.setText(str("0"))
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 5, self.item)
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
-
- # Dropdown für Farben in die 6. Spalte einfügen
- #self.item = QtWidgets.QTableWidgetItem()
- #self.AuftragsdetailsTable.setItem(counter, 6, self.item)
- combo = QComboBox()
- combo.addItems(["Farbe", "Weiß", "Orange", "Grün"])
- combo.currentIndexChanged.connect(lambda index, rowId =counter: self.change_row_color(rowId, index))
- self.AuftragsdetailsTable.setCellWidget(counter, 6, combo)
- counter = counter +1
-
- self.setRowColor(self.ArbeitsschrittTable, 0,0,255,0) #zum setzen der ersten Zeile der Auftragstabelle auf grün
- self.setRowColor(self.ArbeitsschrittTable, 1,255,165,0) #zum setzen der zweiten Zeile der Auftragstabelle auf orange
- self.setRowColor(self.ArbeitsschrittTable, 2,255,255,255) #zum setzen der dritten Zeile der Auftragstabelle auf weiß
- self.setRowColor(self.ArbeitsschrittTable, 3,255,255,255) #zum setzen der vierten Zeile der Auftragstabelle auf weiß
-
- # setzen der beiden Felder auf einen leeren String, um Fehler zu Vermeiden, wenn ein neuer Auftrag geladen wird
- self.bauteiltypTextbox.setText("")
- self.PosNrTxtFeld.setText("")
-
-
- elif(databaseQueryWorking==True and len(auftragEinzelteilDaten)==0):
- print("Es wurde in der Datenbank kein Auftrag mit dieser Auftragsnummer gefunden.")
-
- def change_row_color(self, row, color_index):
- if(color_index == 1):
- self.setRowColor(self.AuftragsdetailsTable, row,255,255,255)
- if(color_index == 2):
- self.setRowColor(self.AuftragsdetailsTable, row,255,165,0)
- if(color_index == 3):
- self.setRowColor(self.AuftragsdetailsTable, row,0,255,0)
-
- def stopLoopClicked(self):
- # damit wird beim Klick auf den Stopbutton der stopLoop-boolWert in der Workerklasse auf true gesetzt -> der Stop des Threads wird initiiert
- if hasattr(self, 'objectDetectionWorker'):
- self.objectDetectionWorker.stopLoopSignal.emit(True)
-
- if hasattr(self, 'checkWaageWorker'):
- self.checkWaageWorker.stopLoopSignal.emit(True)
-
- def checkFinished(self):
- #die Funktion geht alle Zeilen der Auftragsliste durch und schaut, ob die richtige Anzahl an Teilen vorhanden sind
- for i in range(0,self.AuftragsdetailsTable.rowCount()):
- if self.AuftragsdetailsTable.item(i,3).text() != self.AuftragsdetailsTable.item(i,4).text():
- return False
- return True
-
-
- def checkWaage(self):
- #print("Running in thread:", threading.current_thread().name) # Debuggingausgabe
- QApplication.processEvents()
-
- # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
- #self.checkWaageWorker.stopLoopSignal.emit(False)
-
- # überprüfen, ob der Auftrag geladen wurde
- if(self.AuftragsdetailsTable.item(0,0) == None):
- print("Der Auftrag muss zuerst geladen werden.")
- return
-
- # überprüfen, ob ein Bauteiltyp gesetzt wurde
- if(self.checkPosNrEmpty()==True and self.checkBox.isChecked() == False):
- print("Das Pos.-Nr.-Feld ist leer.")
- return
-
- # den GUI Wert von Textfeld TeileZuViel in die Variable schreiben
- self.teileZuViel = int(float(self.teileZuVielTxtFeld.toPlainText()))
- self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
-
- einzelteilID = -1 # Initialisieren der Variable mit einem Defaultwert, welcher nie eingenommen werden können sollte
- if (self.checkBox.isChecked() == False):
- #übernehmen der BauteilID aus dem Feld Pos.-Nr - wenn der Workflow dynamisch gewählt wurde
- einzelteilID = int(self.PosNrTxtFeld.toPlainText())
- else:
- # wenn der Workflow statisch gesetzt wurde, dann soll das erste Item aus der Auftragsliste geladen werden, von welchem noch nicht genug Bauteile auf der Waage liegen
- for i in range(0,self.AuftragsdetailsTable.rowCount()):
- if self.AuftragsdetailsTable.item(i,3).text() != self.AuftragsdetailsTable.item(i,4).text():
- einzelteilID = int(self.AuftragsdetailsTable.item(i,0).text())
- self.PosNrTxtFeld.setText(str(self.AuftragsdetailsTable.item(i,0).text()))
- self.bauteiltypTextbox.setText(str(self.AuftragsdetailsTable.item(i,2).text()))
- break
-
- if einzelteilID == -1:
- # den Thread beenden
- self.checkWaageThread.quit()
- self.checkWaageThread.wait()
- try:
- self.checkWaageThread.started.disconnect() # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
- print("Der Thread wurde beendet.")
- except:
- print("Disconnecting the thread did not work.")
- return
-
-
- #zum setzen den Farbe der gesamten Reihe auf Orange
- self.setRowColor(self.AuftragsdetailsTable, self.getRowNr(einzelteilID),255,165,0)
- self.setRowColor(self.ArbeitsschrittTable, 1,0,255,0) # zum setzen der zweiten Spalte der Arbeitsschrittetabelle auf grün
- self.setRowColor(self.ArbeitsschrittTable, 2,255,165,0) # zum setzen der dritten Spalte der Arbeitsschrittetabelle auf orange
-
- # den Thread starten, welcher die Bauteilanzahl überprüft
- self.checkWaageWorker = Worker()
- self.checkWaageThread = QThread()
-
- self.checkWaageWorker.moveToThread(self.checkWaageThread)
-
- self.checkWaageWorker.checkWaageStartSignal.connect(self.checkWaageWorker.checkWaageThread)
- self.checkWaageWorker.checkWaageUpdateSignal.connect(self.checkWaageUpdate)
- self.checkWaageWorker.checkWaageFinishedSignal.connect(self.checkWaageFinished)
- self.checkWaageWorker.waageStoppedSignal.connect(self.threadStopped)
- self.checkWaageWorker.stopLoopSignal.connect(lambda status: setattr(self.checkWaageWorker, 'stopLoop', status)) #wird fürs aktive Stoppen des Threads benötigt
-
- self.checkWaageThread.started.connect(lambda: self.checkWaageWorker.checkWaageStartSignal.emit(einzelteilID, self.teileZuViel, self.auftragsnummer))
- self.checkWaageThread.start()
-
- def checkWaageUpdate(self, einzelteilID, anzahl):
- # die Funktion updated die (vom Thread) berechnete Bauteilanzahl in der GUI
- self.AuftragsdetailsTable.item(self.getRowNr(einzelteilID), 4).setText(str(anzahl)) # in die Tabelle die Anzahl an berechneten Bauteilen reinschreiben
-
- def checkWaageFinished(self, einzelteilID):
- self.setRowColor(self.AuftragsdetailsTable, self.getRowNr(einzelteilID),0,255,0) #zum setzen den Farbe der gesamten Reihe auf Grün
-
- if self.checkFinished(): # wenn alle Bauteile auf der Waage liegen, soll folgender Code ausgeführt werden
- self.setRowColor(self.ArbeitsschrittTable, 2,0,255,0) # zum setzen der zweiten Spalte der Arbeitsschrittetabelle auf orange
- self.setRowColor(self.ArbeitsschrittTable, 3,0,255,0) # zum setzen der dritten Spalte der Arbeitsschrittetabelle auf weiß
- else: # wenn noch nicht alle Bauteile des Auftrags auf der Waage liegen, soll folgernder Code ausgeführt werden
- self.setRowColor(self.ArbeitsschrittTable, 1,255,165,0) # zum setzen der zweiten Spalte der Arbeitsschrittetabelle auf orange
- self.setRowColor(self.ArbeitsschrittTable, 2,255,255,255) # zum setzen der dritten Spalte der Arbeitsschrittetabelle auf weiß
- if self.checkBoxAutoTare.isChecked():
- self.onTareClick()
-
- # den Thread beenden
- self.checkWaageThread.quit()
- self.checkWaageThread.wait()
-
- # auch wenn die Länge der Liste überschritten wurde
- # wenn der statische Workflow aktiviert ist, dann soll die checkwaage-funktion erneut aufgerufen werden
- if(self.checkBox.isChecked() == True):
- self.checkWaage()
-
- # GUI updaten
- #self.updateGUI()
-
- def objectTypeDetection(self):
- # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
-
- # wenn der statische Workflow ausgewählt wurde, dann soll die checkWaage Funktion aufgerufen werden, auch wenn die detectBauteiltyp-Funkion aufgerufen wurde
- if self.checkBox.isChecked() == True:
- self.checkWaage()
- return
-
- '''
- if(self.checkPosNrEmpty()==True):
- print("Das Pos.-Nr.-Feld ist leer.")
- return
- '''
-
- # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
- #self.objectDetectionWorker.stopLoopSignal.emit(False)
-
- # überprüfen, ob der Auftrag in die Tabelle geladen wurde
- if(self.AuftragsdetailsTable.item(0,0) == None):
- print("Der Auftrag muss zuerst geladen werden.")
- return
-
- # speichert den Wert, welcher im Textfeld steht in Variablen im Code
- self.setAuftragsnummer()
-
- # starten des Threats, welcher den Bauteiltyp zurück gibt
- self.objectDetectionWorker = Worker()
- self.objectDetectionThread = QThread()
-
- self.objectDetectionWorker.moveToThread(self.objectDetectionThread)
-
- self.objectDetectionWorker.objectDetectionStartSignal.connect(self.objectDetectionWorker.objectTypeDetectionThread)
- self.objectDetectionWorker.objectDetectionFinishedSignal.connect(self.objectTypeDetectionFinished)
- self.objectDetectionWorker.waageStoppedSignal.connect(self.threadStopped)
- self.objectDetectionWorker.stopLoopSignal.connect(lambda status: setattr(self.objectDetectionWorker, 'stopLoop', status)) #wird fürs aktive Stoppen des Threads benötigt
-
- self.objectDetectionThread.started.connect(lambda: self.objectDetectionWorker.objectDetectionStartSignal.emit(self.auftragsnummer))
- self.objectDetectionThread.start()
-
- def objectTypeDetectionFinished(self, einzelteilID, rowData):
- # wenn der Typ des Objektes erkannt wurde, dann soll die Funktion aufgerufen werden
-
- # Schreiben der Bauteiltype und Pos.-Nr in die jeweiligen Felder
- self.PosNrTxtFeld.setText(str(rowData[1]))
- self.bauteiltypTextbox.setText(rowData[2])
-
- # setzt den Boolean, um aus der Schleife raus zu gehen
- self.btTypeIsSet = True
-
- #zum setzen den Farbe der gesamten Reihe auf Orange
- self.setRowColor(self.AuftragsdetailsTable, self.getRowNr(einzelteilID),255,165,0)
-
- # den Thread beenden
- self.objectDetectionThread.quit()
- self.objectDetectionThread.wait()
-
- '''
- try:
- self.objectDetectionThread.started.disconnect() # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
- except:
- print(f"Error while disconnecting: {e}")
- print("Disconnecting the thread did not work.")
- '''
-
- # wenn der Bauteiltyp erkannt wurde, dann soll die GUI aktualisiert werden und anschließend die CheckWaage-Funktion aufgerufen werden
- self.updateGUI()
- self.checkWaage()
-
- def threadStopped(self, einzelteilID):
- # wenn kein Bauteil erkannt wurde, dann ist die EinzenteilID = 0
- if self.checkFinished() == False:
- if(einzelteilID > 0):
- self.setRowColor(self.AuftragsdetailsTable, self.getRowNr(einzelteilID),255,255,255) #zum setzen den Farbe der gesamten Reihe auf Weiß
- self.setRowColor(self.ArbeitsschrittTable, 2,255,255,255)
- self.setRowColor(self.ArbeitsschrittTable, 1,255,165,0)
-
- # den Thread beenden
- if hasattr(self, 'objectDetectionThread'):
- self.objectDetectionThread.quit()
- self.objectDetectionThread.wait()
- print("Der ObjektDetection-Thread wurde beendet.")
-
- if hasattr(self, 'checkWaageThread'):
- self.checkWaageThread.quit()
- self.checkWaageThread.wait()
- print("Der CheckWaage-Thread wurde beendet.")
-
-
-
-
-
-
-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_())
-
-
-
-
-
diff --git a/GUI_19_09_staticWorkflow_Multithreading.py b/GUI_19_09_staticWorkflow_Multithreading.py
deleted file mode 100644
index 01211ce..0000000
--- a/GUI_19_09_staticWorkflow_Multithreading.py
+++ /dev/null
@@ -1,751 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file 'test.ui'
-#
-# Created by: PyQt5 UI code generator 5.15.9
-#
-# WARNING: Any manual changes made to this file will be lost when pyuic5 is
-# run again. Do not edit this file unless you know what you are doing.
-
-
-##########Es muss noch überprüft werden, ob der PC mit der Waage überhaupt verbunden ist
-
-#from PyQt5 import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QProgressBar
-from PyQt5 import QtCore, QtGui, QtWidgets
-from PyQt5.QtWidgets import QApplication
-from PyQt5.QtCore import QTimer, QThread, pyqtSignal, QObject
-import serial
-import binascii
-import math
-import mariadb
-import time
-import threading
-
-
-db_config = {
- 'user': 'dbUser',
- 'password': 'dbPassword',
- 'host': 'localhost',
- 'database': 'projectGeislinger',
- 'port': 3306 # Standard port for MariaDB
-}
-
-# Establishing the connection
-conn = mariadb.connect(**db_config)
-# Create a cursor to execute queries
-cursor = conn.cursor()
-
-# Konfiguration der seriellen Schnittstelle
-ser = serial.Serial('/dev/ttyUSB0', 9600)
-
-waageEingeschwungen = False
-
-
-def wahrscheinlichkeitsDichte(x,mue, var):
- # in der Funktion wird der Wahrscheinlichkeitsdichtenwert der Variable x für eine bestimmte Normalverteilung berechnet
- standardabweichung = var**0.5
-
- result = 1/(standardabweichung * (2*math.pi)**0.5 ) * math.exp(-0.5 * ((x-mue)/standardabweichung)**2)
-
- return result
-
-def calcWahrscheinlichkeitFromDichte(x,mue, var):
- # in der Funktion wird die Wahrscheinlichkeit via der Wahrscheinlichkeitsdichte berechnet, indem das Verhältnis aus der dem Bauteil zugehörigen Wahrscheinlichkeitsdichte zu der maximalen Wahrscheinlichkeitsdichte berechnet wird
- p1 = wahrscheinlichkeitsDichte(x,mue, var)
- p_max = wahrscheinlichkeitsDichte(mue,mue, var)
-
- return p1/p_max
-
-
-
-#class Worker(QThread):
-class Worker(QObject):
- #progress = pyqtSignal(int)
- objectDetectionStartSignal = pyqtSignal(str)
- objectDetectionFinishedSignal = pyqtSignal(int, object)
-
- checkWaageStartSignal = pyqtSignal(int, int, str)
- checkWaageUpdateSignal = pyqtSignal(int, int)
- checkWaageFinishedSignal = pyqtSignal(int)
-
- waageStoppedSignal = pyqtSignal(int)
- stopLoopSignal = pyqtSignal(bool) #das Signal wird verwendet um direkt den stopLoop-Wert zu ändern (also kein Funktionsaufruf)
-
- stopLoop = False
- btTypeIsSet = False
- correctBtNr = False
-
-
- def __init__(self):
- super(Worker, self).__init__()
- stopLoop = False
-
-
- def getDataOfArticleType(self, allArticles, articleType):
- # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
- for i in allArticles:
- if i[1] == articleType:
- return i
-
- return -1
-
- def waageNichtEingeschwungenOutput(self):
- print("Die Waage ist noch nicht eingeschwungen - Ergebnisse sind dadurch noch fehlerhaft.")
-
- def readWaage(self):
- # in folgender Funktion wird die Waage ausgelesen
-
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
- #print("port to which it is connected: ", ser.portstr) #Debuggingausgabe
-
-
- if ser.is_open == False:
- ser.open()
-
-
- #an die Waage den Befehl senden, dass sie ausgelesen werden soll
- ser.write(b'getWeight\n')
- #ser.write(b'tare\n')
- serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
-
- # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
- lenString = len(serialString)-1
- if serialString[lenString] == "g" and serialString[lenString-1] == "k":
- #print("ist eingeschwungen") #Debuggingausgabe
- waageEingeschwungen = True
- else:
- print("die Waage ist noch nicht eingeschwungen")
- waageEingeschwungen = False
-
- #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
- intString = ""
- for i in serialString:
- if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
- intString = intString + i
- print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
- ## Waage auslesen - ENDE
-
- ser.close()
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
-
- return waageEingeschwungen, intString
-
- def objectTypeDetectionThread(self, auftragsnummer):
- # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
-
- #print("objectTypeDetectionThread - Running in thread:", threading.current_thread().name) #Debuggausgabe
-
- # Parameterdefinition
- propDensVect = []
-
- self.btTypeIsSet = False
-
- while(self.btTypeIsSet == False and self.stopLoop == False):
-
- # Auslesen der Waage
- waageEingeschwungen, intString = self.readWaage()
- if waageEingeschwungen == False:
- self.waageNichtEingeschwungenOutput()
- else:
-
- # Datenbankabfrage
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
- cursor.execute(sql_query)
- auftragEinzelteilDaten = cursor.fetchall()
-
- '''
- # Display data #Debugausgabe
- print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
- for row in auftragEinzelteilDaten:
- print(row)
- '''
-
- # in der Folge werden alle Wahrscheinlichkeitsdichten der Auftragsbauteile berechnet und in dem Vektor gesammelt
- for row in auftragEinzelteilDaten:
- propDensVect.append([wahrscheinlichkeitsDichte(float(intString),float(row[6]), float(row[7])), row[1], row[5]])
-
- # Jenen Eintrag des propDensVect raussuchen, welcher die größte Wahrscheinlichkeitsdichte beinhaltet
- maxpropDens = 0
- einzelteilID = 0
- rowData = None
- for row in propDensVect:
- if row[0] > maxpropDens:
- maxpropDens = row[0]
- einzelteilID = row[1]
- rowData = row
-
- # überprüfen, ob das aufliegende Bauteil in der Auftragstabelle vorhanden ist
- if(einzelteilID == 0):
- print("Es wurde kein Bauteil aus der Auftragsliste (Tabelle) erkannt.")
- else:
- print("Bei dem Bauteil" , einzelteilID , "wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
-
- # Wahrscheinlichkeit berechnen, dass das angegebene Bauteil auch wirklich diesem entspricht
- prop = 0
- for row in auftragEinzelteilDaten:
- if row[1] == einzelteilID:
- prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6]), float(row[7]))
- break
- print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
-
- # den Bool auf true setzen, damit die Schleife beendet wird - dieser wird auf True gesetzt, wenn ein Bauteiltyp erkannt wird
- self.btTypeIsSet = True
-
- if(self.stopLoop == False):
- # ein Signal zurück an den MainThreat senden, mit den Infos/Ergebnissen, der Typenbestimmung
- self.objectDetectionFinishedSignal.emit(einzelteilID, rowData)
- else:
- self.waageStoppedSignal.emit(einzelteilID)
-
-
-
- def checkWaageThread(self, einzelteilID, teileZuViel, auftragsnummer):
-
-
- self.correctBtNr = False
- prevAnzahl = 0
- anzahl = 0
- einzelteilID = einzelteilID
-
- while (self.correctBtNr == False and self.stopLoop == False):
-
- #überprüfen, ob die Waage eingeschwungen ist (und damit korrekte Ergebnisse liefert)
- waageEingeschwungen, intString = self.readWaage()
- if waageEingeschwungen == False:
- self.waageNichtEingeschwungenOutput()
- else:
-
- # Datenbankabfrage - holen der Auftrags- und Bauteilinfos
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
- cursor.execute(sql_query)
- auftragDaten = cursor.fetchall()
-
- '''
- # Display data - zum Debuggen
- print("Ausgabe der Auftragsdetails:")
- print("id|EinzelteilID|Auftragsnummer|Anzahl")
- for row in auftragDaten:
- print(row)
- '''
-
- #auslesen, wie viele Bauteile des Types laut Auftrag vorhanden sein sollen
- anzBauteile_soll = 0
- idVorhanden = False
- for row in auftragDaten:
- if row[1] == einzelteilID:
- anzBauteile_soll = row[3]
- idVorhanden = True
-
- if(idVorhanden == False):
- print("Die gewählte Pos.Nr ist nicht in der Auftragsliste (Tabelle) vorhanden.")
- return
-
- # Berechnen der Wahrscheinlichkeitsdichten - der Betrag aller Wahrscheinlichkeitsdichten werden im propDensVect gespeichert
- propDensVect = []
- articleData = self.getDataOfArticleType(auftragDaten, einzelteilID)
- for i in range(1,anzBauteile_soll+teileZuViel+1):
- # Mathematische Sätze, auf welchen die Berechnung basiert:
- # seien X1,..., Xn unabhängige Zufallsvariablen die N(mue_i, sigma_i^2) verteilt sind, dann ist X = X1+...+Xn - N(mue, sigma^2) verteilt mit mue=mue1+...+mue_n, sigma^2 = sigma_1^2+...+sigma_n^2
- mueGes = float(articleData[6])*i # Berechnen des äquivalenten Mittelwert
- varGes = float(articleData[7])*i # Berechnen der äquivalenten Varianz
- propDensVect.append([wahrscheinlichkeitsDichte(float(intString),mueGes, varGes), i])
-
- # durch den propDensVect iterieren und jenen Eintrag mit der höchsten Wahrscheinlichkeitsdichte raussuchen
- maxpropDens = 0
- for row in propDensVect:
- if row[0] > maxpropDens:
- maxpropDens = row[0]
- anzahl = row[1]
-
- # damit nur etwas gemacht wird (zb ein Updatesignal an den Hauptthread zurücksenden), wenn sich die berechnete Anzahl ändert
- if prevAnzahl != anzahl:
- prevAnzahl = anzahl
-
- # Die Wahrscheinlichkeit berechnen, dass das obige Ergebnis auch dem Bauteil entspricht
- if anzahl > 0:
- for row in auftragDaten:
- if row[1] == einzelteilID:
- prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6])*anzahl, float(row[7])*anzahl)
- break
- print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
-
- # wenn genug Bauteile vorhanden sind, dann soll die Schleife beendet werden
- if (anzahl == anzBauteile_soll):
- self.correctBtNr = True
-
- # Konsolenausgabe
- if maxpropDens > 0:
- print("Bei der Anzahl" , anzahl , "des Bauteiltypes", einzelteilID, ",wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
- self.checkWaageUpdateSignal.emit(einzelteilID, anzahl)
-
- else:
- print("Von der ausgewählten Bauteiltype liegt die berechnete Wahrscheinlichkeit bei 0, dass zwischen 0 und", anzBauteile_soll+teileZuViel, "Bauteilen auf der Waage liegen.")
- print("Falls die korrekte Anzhl an Bauteilen auf der Waage liegt, könnte der Fehler in einer falschen Kalibrierung der Waage liegen (TARE).")
-
- if(self.stopLoop == False):
- self.checkWaageFinishedSignal.emit(einzelteilID)
- else:
- self.waageStoppedSignal.emit(einzelteilID)
-
-
-
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- self.auftragsnummer = ""
- self.teileZuViel = 0 # Anzahl an Bauteilen, welche zu viel drinnen sein können - der Parameter kann selbst gesetzt werden #####
- self.correctBtNr = False
- self.btTypeIsSet = False
-
-
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1090, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.btn1 = QtWidgets.QPushButton(self.centralwidget)
- self.btn1.setGeometry(QtCore.QRect(700, 45, 111, 25))
- self.btn1.setObjectName("btn1")
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 300, 661, 192))
- self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
- self.AuftragsdetailsTable.setColumnCount(6)
- self.AuftragsdetailsTable.setRowCount(0)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(5, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
- self.label = QtWidgets.QLabel(self.centralwidget)
- self.label.setGeometry(QtCore.QRect(500, 20, 121, 17))
- self.label.setObjectName("label")
- self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit.setGeometry(QtCore.QRect(450, 40, 221, 31))
- self.textEdit.setObjectName("textEdit")
- self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
- self.bauteilTypBtn.setGeometry(QtCore.QRect(700, 150, 161, 25))
- self.bauteilTypBtn.setObjectName("bauteilTypBtn")
- self.checkWaageBtn = QtWidgets.QPushButton(self.centralwidget)
- self.checkWaageBtn.setGeometry(QtCore.QRect(700, 460, 161, 25))
- self.checkWaageBtn.setObjectName("checkWaageBtn")
- self.stopLoopBtn = QtWidgets.QPushButton(self.centralwidget)
- self.stopLoopBtn.setGeometry(QtCore.QRect(700, 500, 161, 25))
- self.stopLoopBtn.setObjectName("stopLoopBtn")
- self.waageTareBtn = QtWidgets.QPushButton(self.centralwidget)
- self.waageTareBtn.setGeometry(QtCore.QRect(700, 100, 161, 25))
- self.waageTareBtn.setObjectName("waageTareBtn")
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
- self.bauteiltypTextbox.setGeometry(QtCore.QRect(700, 290, 221, 31))
- self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
- self.BezeichnungLabel = QtWidgets.QLabel(self.centralwidget)
- self.BezeichnungLabel.setGeometry(QtCore.QRect(700, 270, 181, 20))
- self.BezeichnungLabel.setObjectName("BezeichnungLabel")
- self.PosNrLabel = QtWidgets.QLabel(self.centralwidget)
- self.PosNrLabel.setGeometry(QtCore.QRect(700, 200, 67, 17))
- self.PosNrLabel.setObjectName("PosNrLabel")
- self.PosNrTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
- self.PosNrTxtFeld.setGeometry(QtCore.QRect(700, 220, 191, 31))
- self.BezeichnungLabel.setObjectName("BezeichnungLabel")
- self.teileZuVielLabel = QtWidgets.QLabel(self.centralwidget)
- self.teileZuVielLabel.setGeometry(QtCore.QRect(700, 350, 350, 17))
- self.teileZuVielLabel.setObjectName("teileZuVielLabel")
- self.teileZuVielTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
- self.teileZuVielTxtFeld.setGeometry(QtCore.QRect(700, 370, 191, 31))
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
- self.menubar.setObjectName("menubar")
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
- '''
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setVerticalHeaderItem(0,item)
- '''
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
- self.btn1.clicked.connect(self.auftragsBtnClicked)
- item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Pos.-Nr"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
- item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
- item.setText(_translate("MainWindow", "Soll-Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
- item.setText(_translate("MainWindow", "Ist-Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(5)
- item.setText(_translate("MainWindow", "Lgort"))
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltyp erkennen"))
- self.bauteilTypBtn.clicked.connect(self.objectTypeDetection)
- self.AuftragsdetailsTable.cellClicked.connect(self.onTableCellClick)
- #self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
- #item = self.AuftragsdetailsTable.verticalHeaderItem(0)
- #item.setText(_translate("MainWindow", "test"))
- self.BezeichnungLabel.setText(_translate("MainWindow", "Bezeichnung"))
- self.PosNrLabel.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.teileZuVielLabel.setText(_translate("MainWindow", "Zu prüfende Teileanzahl über Auftragsanzahl:"))
- self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
- self.checkWaageBtn.setText(_translate("MainWindow", "check Waage"))
- self.checkWaageBtn.clicked.connect(self.checkWaage)
- self.stopLoopBtn.setText(_translate("MainWindow", "stop loop"))
- self.stopLoopBtn.clicked.connect(self.stopLoopClicked)
- self.waageTareBtn.setText(_translate("MainWindow", "Waage tarieren"))
- self.waageTareBtn.clicked.connect(self.onTareClick)
-
- self.thread = QThread()
- self.worker = Worker()
- self.worker.moveToThread(self.thread)
- self.worker.objectDetectionFinishedSignal.connect(self.objectTypeDetectionFinished)
- self.worker.waageStoppedSignal.connect(self.threadStopped)
- self.worker.stopLoopSignal.connect(lambda status: setattr(self.worker, 'stopLoop', status))
-
-
-
-
- def onTareClick(self):
- #Tarieren der Waage
- if ser.is_open == False:
- ser.open()
- ser.write(b'tare\n')
- ser.close()
-
-
- def onCheckboxCheck(self):
- if self.checkBox.isChecked() == True:
- print("clickedCheckboxTrue")
- else:
- print("clickedCheckboxFalse")
-
- def getRowNr(self, posNr):
- for i in range(0,self.AuftragsdetailsTable.rowCount()):
- if(self.AuftragsdetailsTable.item(i,0).text() == str(posNr)):
- return i
-# brauche ich hier vermutlich nicht mehr - ist in den Worker Thread kopiert worden
- def waageNichtEingeschwungenOutput(self):
- print("Die Waage ist noch nicht eingeschwungen - Ergebnisse sind dadurch noch fehlerhaft.")
-
-
- def onTableCellClick(self):
- self.PosNrTxtFeld.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),0).text())
- self.bauteiltypTextbox.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),2).text())
-
-
- def setAuftragsnummer(self):
- self.auftragsnummer = self.textEdit.toPlainText()
- if(not self.auftragsnummer):
- self.auftragsnummer = ""
- self.textEdit.setText("")
-
- def checkAuftragsnummerEmpty(self):
- if self.auftragsnummer == "":
- print("Das Auftragsnummernfeld ist leer.")
- return True
- else:
- return False
-
- def checkPosNrEmpty(self):
- if self.PosNrTxtFeld.toPlainText() == "":
- return True
- else:
- return False
-
-# eventuell benötigt man die Funktion hier nicht mehr, da sie zu den Threads kopiert wurde
- def getDataOfArticleType(self, allArticles, articleType):
- # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
- for i in allArticles:
- if i[1] == articleType:
- return i
-
- return -1
-
- def updateGUI(self):
- self.PosNrLabel.repaint() #GUI aktualisieren
- QApplication.processEvents() #GUI aktualisieren
-
- def setRowColor(self, rowID,r,g,b):
- self.AuftragsdetailsTable.item(rowID, 0).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 1).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 2).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 3).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 4).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 5).setBackground(QtGui.QColor(r,g,b))
-
-#wird hier vermutlich nicht mehr benötigt - wurde in die Workerklasse kopiert
- def readWaage(self):
- # in folgender Funktion wird die Waage ausgelesen
-
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
- #print("port to which it is connected: ", ser.portstr) #Debuggingausgabe
- self.checkPosNrEmpty()
-
- if ser.is_open == False:
- ser.open()
-
-
- #an die Waage den Befehl senden, dass sie ausgelesen werden soll
- ser.write(b'getWeight\n')
- #ser.write(b'tare\n')
- serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
-
- # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
- lenString = len(serialString)-1
- if serialString[lenString] == "g" and serialString[lenString-1] == "k":
- #print("ist eingeschwungen") #Debuggingausgabe
- waageEingeschwungen = True
- else:
- print("die Waage ist noch nicht eingeschwungen")
- waageEingeschwungen = False
-
- #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
- intString = ""
- for i in serialString:
- if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
- intString = intString + i
- print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
- ## Waage auslesen - ENDE
-
- ser.close()
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
-
- return waageEingeschwungen, intString
-
- def auftragsBtnClicked(self):
- databaseQueryWorking = False #wird für die Überprüfung, ob die Datenbankabfrage fehlerhaft ist, verwendet
- auftragEinzelteilDaten = []
-
- self.setAuftragsnummer()
- if(not self.checkAuftragsnummerEmpty()):
-
-
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + self.auftragsnummer
- try:
- cursor.execute(sql_query)
- # Fetch results
- auftragEinzelteilDaten = cursor.fetchall()
- databaseQueryWorking = True
- except:
- print("Fehler in der Datenbankabfrage.")
-
-
-
- if databaseQueryWorking==True and len(auftragEinzelteilDaten)>0:
- '''
- # Display data
- print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
- for row in auftragEinzelteilDaten:
- if str(row[2]) == self.auftragsnummer:
- print("passt")
- print(row)
- '''
-
- ### die Auftragsdaten in die Tabelle laden
- self.AuftragsdetailsTable.setRowCount(len(auftragEinzelteilDaten))
- self.item = QtWidgets.QTableWidgetItem()
- counter = 0
- for row in auftragEinzelteilDaten:
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 0, self.item)
- self.item.setText(str(row[1]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 1, self.item)
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 2, self.item)
- self.item.setText(str(row[5]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 3, self.item)
- self.item.setText(str(row[3]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 4, self.item)
- self.item.setText(str("0"))
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 5, self.item)
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- counter = counter +1
-
- elif(databaseQueryWorking==True and len(auftragEinzelteilDaten)==0):
- print("Es wurde in der Datenbank kein Auftrag mit dieser Auftragsnummer gefunden.")
-
- def stopLoopClicked(self):
- # damit wird beim Klick auf den Stopbutton der stopLoop-boolWert in der Workerklasse auf true gesetzt -> der Stop des Threads wird initiiert
- self.worker.stopLoopSignal.emit(True)
-
-
- def checkWaage(self):
- #print("Running in thread:", threading.current_thread().name) # Debuggingausgabe
-
- QApplication.processEvents()
-
- # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
- self.worker.stopLoopSignal.emit(False)
-
- # überprüfen, ob ein Bauteiltyp gesetzt wurde
- if(self.checkPosNrEmpty()==True):
- print("Das Pos.-Nr.-Feld ist leer.")
- return
-
- if(self.AuftragsdetailsTable.item(0,0) == None):
- print("Der Auftrag muss zuerst geladen werden.")
- return
-
- # den GUI Wert von Textfeld TeileZuViel in die Variable schreiben
- self.teileZuViel = int(float(self.teileZuVielTxtFeld.toPlainText()))
- self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
-
- #übernehmen der BauteilID aus dem Feld Pos.-Nr
- einzelteilID = int(self.PosNrTxtFeld.toPlainText())
-
- #zum setzen den Farbe der gesamten Reihe auf Orange
- self.setRowColor(self.getRowNr(einzelteilID),255,165,0)
-
- # den Thread starten, welcher die Bauteilanzahl überprüft
- self.worker.checkWaageStartSignal.connect(self.worker.checkWaageThread)
- self.worker.checkWaageUpdateSignal.connect(self.checkWaageUpdate)
- self.worker.checkWaageFinishedSignal.connect(self.checkWaageFinished)
- self.thread.started.connect(lambda: self.worker.checkWaageStartSignal.emit(einzelteilID, self.teileZuViel, self.auftragsnummer))
- self.thread.start()
-
- def checkWaageUpdate(self, einzelteilID, anzahl):
- # die Funktion updated die (vom Thread) berechnete Bauteilanzahl in der GUI
- self.AuftragsdetailsTable.item(self.getRowNr(einzelteilID), 4).setText(str(anzahl)) # in die Tabelle die Anzahl an berechneten Bauteilen reinschreiben
-
-
- def checkWaageFinished(self, einzelteilID):
- self.setRowColor(self.getRowNr(einzelteilID),0,255,0) #zum setzen den Farbe der gesamten Reihe auf Grün
-
- # den Thread beenden
- self.thread.quit()
- self.thread.wait()
- try:
- self.thread.started.disconnect(lambda: self.worker.checkWaageStartSignal.emit(einzelteilID, self.teileZuViel, self.auftragsnummer)) # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
- print("Der Thread wurde beendet.")
- except:
- print("Disconnecting the thread did not work.") # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
-
- # GUI updaten
- #self.updateGUI()
-
- def objectTypeDetection(self):
- # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
-
- '''
- if(self.checkPosNrEmpty()==True):
- print("Das Pos.-Nr.-Feld ist leer.")
- return
- '''
-
- # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
- self.worker.stopLoopSignal.emit(False)
-
- # überprüfen, ob der Auftrag in die Tabelle geladen wurde
- if(self.AuftragsdetailsTable.item(0,0) == None):
- print("Der Auftrag muss zuerst geladen werden.")
- return
-
- # speichert den Wert, welcher im Textfeld steht in Variablen im Code
- self.setAuftragsnummer()
-
- # starten des Threats, welcher den Bauteiltyp zurück gibt
- self.worker.objectDetectionStartSignal.connect(self.worker.objectTypeDetectionThread)
- self.thread.started.connect(lambda: self.worker.objectDetectionStartSignal.emit(self.auftragsnummer))
- self.thread.start()
-
- def objectTypeDetectionFinished(self, einzelteilID, rowData):
- # wenn der Typ des Objektes erkannt wurde, dann soll die Funktion aufgerufen werden
-
- # Schreiben der Bauteiltype und Pos.-Nr in die jeweiligen Felder
- self.PosNrTxtFeld.setText(str(rowData[1]))
- self.bauteiltypTextbox.setText(rowData[2])
-
- # setzt den Boolean, um aus der Schleife raus zu gehen
- self.btTypeIsSet = True
-
- #zum setzen den Farbe der gesamten Reihe auf Orange
- self.setRowColor(self.getRowNr(einzelteilID),255,165,0)
-
- # den Thread beenden
- self.thread.quit()
- self.thread.wait()
- try:
- self.thread.started.disconnect() # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
- except:
- print("Disconnecting the thread did not work.")
-
- # wenn der Bauteiltyp erkannt wurde, dann soll die GUI aktualisiert werden und anschließend die CheckWaage-Funktion aufgerufen werden
- self.updateGUI()
- self.checkWaage()
-
- def threadStopped(self, einzelteilID):
- # wenn kein Bauteil erkannt wurde, dann ist die EinzenteilID = 0
- if(einzelteilID > 0):
- self.setRowColor(self.getRowNr(einzelteilID),255,255,255) #zum setzen den Farbe der gesamten Reihe auf Weiß
-
- # den Thread beenden
- self.thread.quit()
- self.thread.wait()
- try:
- self.thread.started.disconnect() # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
- print("Der Thread wurde beendet.")
- except:
- print("Disconnecting the thread did not work.")
-
-
-
-
-
-
-
-
-
-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_())
-
-
-
-
-
diff --git a/GUI_22_10_staticWorkflow_Multithreading.py b/GUI_22_10_staticWorkflow_Multithreading.py
deleted file mode 100644
index 0fa13d5..0000000
--- a/GUI_22_10_staticWorkflow_Multithreading.py
+++ /dev/null
@@ -1,849 +0,0 @@
-
-#from PyQt5 import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QProgressBar
-from PyQt5 import QtCore, QtGui, QtWidgets
-from PyQt5.QtWidgets import QApplication, QComboBox
-from PyQt5.QtCore import QTimer, QThread, pyqtSignal, QObject, Qt
-from PyQt5.QtGui import QColor
-
-import serial
-import binascii
-import math
-import mariadb
-import time
-import threading
-
-
-db_config = {
- 'user': 'dbUser',
- 'password': 'dbPassword',
- 'host': 'localhost',
- 'database': 'projectGeislinger',
- 'port': 3306 # Standard port for MariaDB
-}
-
-# Establishing the connection
-conn = mariadb.connect(**db_config)
-# Create a cursor to execute queries
-cursor = conn.cursor()
-
-# Konfiguration der seriellen Schnittstelle
-ser = serial.Serial('/dev/ttyUSB0', 9600)
-#ser = serial.Serial('/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0', 9600) #dadurch garantiert immer die gleiche Schnittstelle verwendet
-# und nicht die Schnittstelle, welche die Bezeichnung ttyUSB0 verwendet (welche sich ändern könnte)
-# um die ID der USB-Schnittstelle heraus zu finden im Terminal folgendes eingeben: ls -l /dev/serial/by-id/
-
-
-
-#class Worker(QThread):
-class Worker(QObject):
- #progress = pyqtSignal(int)
- objectDetectionStartSignal = pyqtSignal(str)
- objectDetectionFinishedSignal = pyqtSignal(int, object)
-
- checkWaageStartSignal = pyqtSignal(int, int, str)
- checkWaageUpdateSignal = pyqtSignal(int, int)
- checkWaageFinishedSignal = pyqtSignal(int)
-
- waageStoppedSignal = pyqtSignal(int)
- stopLoopSignal = pyqtSignal(bool) #das Signal wird verwendet um direkt den stopLoop-Wert zu ändern (also kein Funktionsaufruf)
-
- stopLoop = False
- btTypeIsSet = False
- correctBtNr = False
- waageEingeschwungen = False
-
-
- def __init__(self):
- super(Worker, self).__init__()
- stopLoop = False
-
- def wahrscheinlichkeitsDichte(self, x, mue, var):
- # in der Funktion wird der Wahrscheinlichkeitsdichtenwert der Variable x für eine bestimmte Normalverteilung berechnet
- standardabweichung = var**0.5
-
- result = 1/(standardabweichung * (2*math.pi)**0.5 ) * math.exp(-0.5 * ((x-mue)/standardabweichung)**2)
-
- return result
-
- def getDataOfArticleType(self, allArticles, articleType):
- # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
- for i in allArticles:
- if i[1] == articleType:
- return i
-
- return -1
-
- def waageNichtEingeschwungenOutput(self):
- print("Die Waage ist noch nicht eingeschwungen - Ergebnisse sind dadurch noch fehlerhaft.")
-
- def readWaage(self):
- # in folgender Funktion wird die Waage ausgelesen
-
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
- #print("port to which it is connected: ", ser.portstr) #Debuggingausgabe
-
-
- if ser.is_open == False:
- ser.open()
-
-
- #an die Waage den Befehl senden, dass sie ausgelesen werden soll
- ser.write(b'getWeight\n')
- #ser.write(b'tare\n')
- serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
-
- # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
- lenString = len(serialString)-1
- if serialString[lenString] == "g" and serialString[lenString-1] == "k":
- #print("ist eingeschwungen") #Debuggingausgabe
- self.waageEingeschwungen = True
- else:
- print("die Waage ist noch nicht eingeschwungen")
- self.waageEingeschwungen = False
-
- #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
- intString = ""
- for i in serialString:
- if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
- intString = intString + i
- print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
- ## Waage auslesen - ENDE
-
- ser.close()
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
-
- return self.waageEingeschwungen, intString
-
- def objectTypeDetectionThread(self, auftragsnummer):
- # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
-
- #print("objectTypeDetectionThread - Running in thread:", threading.current_thread().name) #Debuggausgabe
-
- # Parameterdefinition
- propDensVect = []
-
- self.btTypeIsSet = False
-
- while(self.btTypeIsSet == False and self.stopLoop == False):
-
- # Auslesen der Waage
- self.waageEingeschwungen, intString = self.readWaage()
- if self.waageEingeschwungen == False:
- self.waageNichtEingeschwungenOutput()
- else:
-
- # Datenbankabfrage
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
- cursor.execute(sql_query)
- auftragEinzelteilDaten = cursor.fetchall()
-
- '''
- # Display data #Debugausgabe
- print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
- for row in auftragEinzelteilDaten:
- print(row)
- '''
-
- # in der Folge werden alle Wahrscheinlichkeitsdichten der Auftragsbauteile berechnet und in dem Vektor gesammelt
- for row in auftragEinzelteilDaten:
- propDensVect.append([self.wahrscheinlichkeitsDichte(float(intString),float(row[6]), float(row[7])), row[1], row[5]])
-
- # Jenen Eintrag des propDensVect raussuchen, welcher die größte Wahrscheinlichkeitsdichte beinhaltet
- maxpropDens = 0
- einzelteilID = 0
- rowData = None
- for row in propDensVect:
- if row[0] > maxpropDens:
- maxpropDens = row[0]
- einzelteilID = row[1]
- rowData = row
-
- # überprüfen, ob das aufliegende Bauteil in der Auftragstabelle vorhanden ist
- if(einzelteilID == 0):
- print("Es wurde kein Bauteil aus der Auftragsliste (Tabelle) erkannt.")
- else:
- print("Bei dem Bauteil" , einzelteilID , "wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
-
- '''
- # Wahrscheinlichkeit berechnen, dass das angegebene Bauteil auch wirklich diesem entspricht
- prop = 0
- for row in auftragEinzelteilDaten:
- if row[1] == einzelteilID:
- prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6]), float(row[7]))
- break
- print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
- '''
-
- # den Bool auf true setzen, damit die Schleife beendet wird - dieser wird auf True gesetzt, wenn ein Bauteiltyp erkannt wird
- self.btTypeIsSet = True
-
- if(self.stopLoop == False):
- # ein Signal zurück an den MainThreat senden, mit den Infos/Ergebnissen, der Typenbestimmung
- self.objectDetectionFinishedSignal.emit(einzelteilID, rowData)
- else:
- self.waageStoppedSignal.emit(einzelteilID)
-
- def checkWaageThread(self, einzelteilID, teileZuViel, auftragsnummer):
-
- self.correctBtNr = False
- prevAnzahl = -1
- anzahl = 0
- einzelteilID = einzelteilID
-
- while (self.correctBtNr == False and self.stopLoop == False):
-
- #überprüfen, ob die Waage eingeschwungen ist (und damit korrekte Ergebnisse liefert)
- self.waageEingeschwungen, intString = self.readWaage()
- if self.waageEingeschwungen == False:
- self.waageNichtEingeschwungenOutput()
- else:
-
- # Datenbankabfrage - holen der Auftrags- und Bauteilinfos
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
- cursor.execute(sql_query)
- auftragDaten = cursor.fetchall()
-
- '''
- # Display data - zum Debuggen
- print("Ausgabe der Auftragsdetails:")
- print("id|EinzelteilID|Auftragsnummer|Anzahl")
- for row in auftragDaten:
- print(row)
- '''
-
- #auslesen, wie viele Bauteile des Types laut Auftrag vorhanden sein sollen
- anzBauteile_soll = 0
- idVorhanden = False
-
- for row in auftragDaten:
- if row[1] == einzelteilID:
- anzBauteile_soll = row[3]
- idVorhanden = True
-
- if(idVorhanden == False):
- print("Die gewählte Pos.Nr ist nicht in der Auftragsliste (Tabelle) vorhanden.")
- return
-
- # Berechnen der Wahrscheinlichkeitsdichten - der Betrag aller Wahrscheinlichkeitsdichten werden im propDensVect gespeichert
- propDensVect = []
- articleData = self.getDataOfArticleType(auftragDaten, einzelteilID)
- #for i in range(1,anzBauteile_soll+teileZuViel+1):
- for i in range(0,anzBauteile_soll+teileZuViel+1):
- # Mathematische Sätze, auf welchen die Berechnung basiert:
- # seien X1,..., Xn unabhängige Zufallsvariablen die N(mue_i, sigma_i^2) verteilt sind, dann ist X = X1+...+Xn - N(mue, sigma^2) verteilt mit mue=mue1+...+mue_n, sigma^2 = sigma_1^2+...+sigma_n^2
- mueGes = float(articleData[6])*i # Berechnen des äquivalenten Mittelwert
- # das if wird eingeführt, um auch die Bauteilanzahl 0 korrekt berücksichtigen zu können
- if i == 0:
- varGes = float(articleData[7])
- else:
- varGes = float(articleData[7])*i # Berechnen der äquivalenten Varianz
- propDensVect.append([self.wahrscheinlichkeitsDichte(float(intString),mueGes, varGes), i])
-
- # durch den propDensVect iterieren und jenen Eintrag mit der höchsten Wahrscheinlichkeitsdichte raussuchen
- maxpropDens = 0
- for row in propDensVect:
- if row[0] > maxpropDens:
- maxpropDens = row[0]
- anzahl = row[1]
-
- # damit nur etwas gemacht wird (zb ein Updatesignal an den Hauptthread zurücksenden), wenn sich die berechnete Anzahl ändert
- if prevAnzahl != anzahl:
- prevAnzahl = anzahl
-
- '''
- # Die Wahrscheinlichkeit berechnen, dass das obige Ergebnis auch dem Bauteil entspricht
- if anzahl > 0:
- for row in auftragDaten:
- if row[1] == einzelteilID:
- prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6])*anzahl, float(row[7])*anzahl)
- break
- print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
- '''
-
- # wenn genug Bauteile vorhanden sind, dann soll die Schleife beendet werden
- if (anzahl == anzBauteile_soll):
- self.correctBtNr = True
-
- # Konsolenausgabe
- if maxpropDens > 0:
- print("Bei der Anzahl" , anzahl , "des Bauteiltypes", einzelteilID, ",wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
- self.checkWaageUpdateSignal.emit(einzelteilID, anzahl)
-
- else:
- print("Von der ausgewählten Bauteiltype liegt die berechnete Wahrscheinlichkeit bei 0, dass zwischen 0 und", anzBauteile_soll+teileZuViel, "Bauteilen auf der Waage liegen.")
- print("Falls die korrekte Anzhl an Bauteilen auf der Waage liegt, könnte der Fehler in einer falschen Kalibrierung der Waage liegen (TARE).")
-
- if(self.stopLoop == False):
- self.checkWaageFinishedSignal.emit(einzelteilID)
- else:
- self.waageStoppedSignal.emit(einzelteilID)
-
-
-
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- self.auftragsnummer = ""
- self.teileZuViel = 100 # Anzahl an Bauteilen, welche zu viel drinnen sein können - der Parameter kann selbst gesetzt werden #####
- self.correctBtNr = False
- self.btTypeIsSet = False
-
-
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1400, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.btn1 = QtWidgets.QPushButton(self.centralwidget)
- self.btn1.setGeometry(QtCore.QRect(700, 45, 111, 25))
- self.btn1.setObjectName("btn1")
- # Tabelle zur Darstellung der Auftragsdetails
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 100, 661, 400))
- self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
- self.AuftragsdetailsTable.setColumnCount(6)
- self.AuftragsdetailsTable.setRowCount(0)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(5, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(6, item)
-
- # Tabelle zur Darstellung der Arbeitsschritte
- self.ArbeitsschrittTable = QtWidgets.QTableWidget(self.centralwidget)
- self.ArbeitsschrittTable.setGeometry(QtCore.QRect(1000, 50, 395, 400))
- self.ArbeitsschrittTable.setObjectName("AuftragsdetailsTable")
- self.ArbeitsschrittTable.setColumnCount(2)
- self.ArbeitsschrittTable.setRowCount(4)
- self.ArbeitsschrittTable.setColumnWidth(0, 100)
- self.ArbeitsschrittTable.setColumnWidth(1, 280)
- self.ArbeitsschrittTable.setRowHeight(0, 80)
- self.ArbeitsschrittTable.setRowHeight(1, 180)
- self.ArbeitsschrittTable.setRowHeight(2, 50)
- self.ArbeitsschrittTable.setRowHeight(3, 50)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.ArbeitsschrittTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.ArbeitsschrittTable.setHorizontalHeaderItem(1, item)
-
- self.label = QtWidgets.QLabel(self.centralwidget)
- self.label.setGeometry(QtCore.QRect(500, 20, 121, 17))
- self.label.setObjectName("label")
- self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit.setGeometry(QtCore.QRect(450, 40, 221, 31))
- self.textEdit.setObjectName("textEdit")
- self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
- self.bauteilTypBtn.setGeometry(QtCore.QRect(700, 100, 161, 25))
- self.bauteilTypBtn.setObjectName("bauteilTypBtn")
- self.checkWaageBtn = QtWidgets.QPushButton(self.centralwidget)
- self.checkWaageBtn.setGeometry(QtCore.QRect(700, 150, 161, 25))
- self.checkWaageBtn.setObjectName("checkWaageBtn")
- self.stopLoopBtn = QtWidgets.QPushButton(self.centralwidget)
- self.stopLoopBtn.setGeometry(QtCore.QRect(700, 350, 161, 25))
- self.stopLoopBtn.setObjectName("stopLoopBtn")
- self.waageTareBtn = QtWidgets.QPushButton(self.centralwidget)
- self.waageTareBtn.setGeometry(QtCore.QRect(700, 400, 161, 25))
- self.waageTareBtn.setObjectName("waageTareBtn")
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
- self.bauteiltypTextbox.setGeometry(QtCore.QRect(700, 290, 221, 31))
- self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
- self.BezeichnungLabel = QtWidgets.QLabel(self.centralwidget)
- self.BezeichnungLabel.setGeometry(QtCore.QRect(700, 270, 181, 20))
- self.BezeichnungLabel.setObjectName("BezeichnungLabel")
- self.PosNrLabel = QtWidgets.QLabel(self.centralwidget)
- self.PosNrLabel.setGeometry(QtCore.QRect(700, 200, 67, 17))
- self.PosNrLabel.setObjectName("PosNrLabel")
- self.PosNrTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
- self.PosNrTxtFeld.setGeometry(QtCore.QRect(700, 220, 191, 31))
- self.PosNrTxtFeld.setObjectName("PosNrTxtFeld")
- self.teileZuVielLabel = QtWidgets.QLabel(self.centralwidget)
- self.teileZuVielLabel.setGeometry(QtCore.QRect(1000, 560, 350, 17))
- self.teileZuVielLabel.setObjectName("teileZuVielLabel")
- self.teileZuVielTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
- self.teileZuVielTxtFeld.setGeometry(QtCore.QRect(1000, 580, 191, 31))
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
- self.menubar.setObjectName("menubar")
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
- self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
- self.checkBox.setGeometry(QtCore.QRect(1000, 480, 151, 23))
- self.checkBox.setObjectName("checkBox")
- self.checkBoxAutoTare = QtWidgets.QCheckBox(self.centralwidget)
- self.checkBoxAutoTare.setGeometry(QtCore.QRect(1000, 520, 180, 23))
- self.checkBoxAutoTare.setObjectName("checkBoxAutoTare")
-
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
- self.btn1.clicked.connect(self.auftragsBtnClicked)
-
- # Tabelle zur Darstellung der Auftragsdetails
- item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Pos.-Nr"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
- item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
- item.setText(_translate("MainWindow", "Soll-Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
- item.setText(_translate("MainWindow", "Ist-Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(5)
- item.setText(_translate("MainWindow", "Lgort"))
-
- # Tabelle zur Darstellung der Arbeitsschritte
- item = self.ArbeitsschrittTable.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Arbeitsschritt"))
- item = self.ArbeitsschrittTable.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "ToDo:"))
-
- # Befüllen der Arbeisschritttabelle mit Text
- #item = self.ArbeitsschrittTable.
- # Ein neues QTableWidgetItem erstellen und den Text setzen
- item = QtWidgets.QTableWidgetItem("Auftrag laden")
- self.ArbeitsschrittTable.setItem(0, 0, item)
- item = QtWidgets.QTableWidgetItem("--> Auftragsnummer eingeben \n--> \"load Auftrag\" Buttonclick")
- self.ArbeitsschrittTable.setItem(0, 1, item)
- item = QtWidgets.QTableWidgetItem("Bauteiltyp erkennen")
- self.ArbeitsschrittTable.setItem(1, 0, item)
- item = QtWidgets.QTableWidgetItem("visuell: \n--> ein Bauteil in die Kamera halten\n\nWaage: \n--> ein Bauteil auf die Waage legen\n--> \"Bauteiltyp erkennen\" Buttonclick\n\nmanuell:\n--> Bauteiltypen auswählen\n-->\"ckeck Waage\" Button click")
- self.ArbeitsschrittTable.setItem(1, 1, item)
- item = QtWidgets.QTableWidgetItem("Bauteilanzahl erkennen")
- self.ArbeitsschrittTable.setItem(2, 0, item)
- item = QtWidgets.QTableWidgetItem("--> Bauteile auflegen")
- self.ArbeitsschrittTable.setItem(2, 1, item)
- item = QtWidgets.QTableWidgetItem("Prozess beendet")
- self.ArbeitsschrittTable.setItem(3, 0, item)
- self.ArbeitsschrittTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
-
- #self.ArbeitsschrittTable.item(0,0).setText("test")
-
- #einzelteilID = int(self.AuftragsdetailsTable.item(i,0).text())
- #self.PosNrTxtFeld.setText(str(self.AuftragsdetailsTable.item(i,0).text()))
- #self.bauteiltypTextbox.setText(str(self.AuftragsdetailsTable.item(i,2).text()))
-
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltyp erkennen"))
- self.bauteilTypBtn.clicked.connect(self.objectTypeDetection)
- self.AuftragsdetailsTable.cellClicked.connect(self.onTableCellClick)
- #self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
- #item = self.AuftragsdetailsTable.verticalHeaderItem(0)
- #item.setText(_translate("MainWindow", "test"))
- self.BezeichnungLabel.setText(_translate("MainWindow", "Bezeichnung"))
- self.PosNrLabel.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.teileZuVielLabel.setText(_translate("MainWindow", "Zu prüfende Teileanzahl über Auftragsanzahl:"))
- self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
- self.checkWaageBtn.setText(_translate("MainWindow", "check Waage"))
- self.checkWaageBtn.clicked.connect(self.checkWaage)
- self.stopLoopBtn.setText(_translate("MainWindow", "stop loop"))
- self.stopLoopBtn.clicked.connect(self.stopLoopClicked)
- self.waageTareBtn.setText(_translate("MainWindow", "Waage tarieren"))
- self.waageTareBtn.clicked.connect(self.onTareClick)
- self.checkBox.setText(_translate("MainWindow", "static workflow"))
- self.checkBox.clicked.connect(self.onCheckboxCheck)
- self.checkBoxAutoTare.setText(_translate("MainWindow", "automatisches Tarieren"))
- self.checkBoxAutoTare.clicked.connect(self.autoTareCheck)
-
- self.setRowColor(self.ArbeitsschrittTable, 0,255,165,0) # zum setzen der ersten Spalte der Arbeitsschrittetabelle auf orange
- self.checkBoxAutoTare.setCheckState(Qt.Checked)
- self.checkBox.setCheckState(Qt.Unchecked)
-
- def mousePressEvent(self, event):
- print("Das MainWindow wurde angeklickt.")
- self.setFocus()
- super().mousePressEvent(event)
-
- def onTareClick(self):
- #Tarieren der Waage
- if ser.is_open == False:
- ser.open()
- ser.write(b'tare\n')
- ser.close()
-
- def onCheckboxCheck(self):
- if self.checkBox.isChecked() == True:
- print("static workflow activated")
- else:
- print("static workflow deactivated")
-
- def autoTareCheck(self):
- if self.checkBoxAutoTare.isChecked() == True:
- print("automatisches Tarieren ist aktiviert")
- else:
- print("automatisches Tarieren ist deaktiviert")
-
- def getRowNr(self, posNr):
- for i in range(0,self.AuftragsdetailsTable.rowCount()):
- if(self.AuftragsdetailsTable.item(i,0).text() == str(posNr)):
- return i
-
- def onTableCellClick(self):
- self.PosNrTxtFeld.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),0).text())
- self.bauteiltypTextbox.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),2).text())
-
- def setAuftragsnummer(self):
- self.auftragsnummer = self.textEdit.toPlainText()
- if(not self.auftragsnummer):
- self.auftragsnummer = ""
- self.textEdit.setText("")
-
- def checkAuftragsnummerEmpty(self):
- if self.auftragsnummer == "":
- print("Das Auftragsnummernfeld ist leer.")
- return True
- else:
- return False
-
- def checkPosNrEmpty(self):
- if self.PosNrTxtFeld.toPlainText() == "":
- return True
- else:
- return False
-
- def updateGUI(self):
- self.PosNrLabel.repaint() #GUI aktualisieren
- QApplication.processEvents() #GUI aktualisieren
-
- def setRowColor(self, tableObject, rowID,r,g,b):
- # tableObject = das Tabellenobjekt, von welchem die Zeile gefärbt werden soll
- # rowID = die Nr der Zeile, welche eingefärbt werden soll
- # r,g,b = Farbe, welche die Zeile annehmen soll
-
- # folgendes If-Statement hat ausschließlich einen Ästethischen Zweck -> und zwar, dass bei der Arbeitsschritttabelle lediglich die erste
- # Spelte eingefärbt wird, anstatt beide Spalten
- if tableObject == self.ArbeitsschrittTable:
- nrColNoColor = 1
- else:
- nrColNoColor = 0
-
- # Einfärben der Zellen einer Spalte
- for col in range(tableObject.columnCount()-nrColNoColor):
- tableObject.item(rowID, col).setBackground(QtGui.QColor(r,g,b))
-
- def auftragsBtnClicked(self):
- databaseQueryWorking = False #wird für die Überprüfung, ob die Datenbankabfrage fehlerhaft ist, verwendet
- auftragEinzelteilDaten = []
-
- self.setAuftragsnummer()
- if(not self.checkAuftragsnummerEmpty()):
-
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + self.auftragsnummer
- try:
- cursor.execute(sql_query)
- # Fetch results
- auftragEinzelteilDaten = cursor.fetchall()
- databaseQueryWorking = True
- except:
- print("Fehler in der Datenbankabfrage.")
-
-
-
- if databaseQueryWorking==True and len(auftragEinzelteilDaten)>0:
- '''
- # Display data
- print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
- for row in auftragEinzelteilDaten:
- if str(row[2]) == self.auftragsnummer:
- print("passt")
- print(row)
- '''
-
- ### die Auftragsdaten in die Tabelle laden
- self.AuftragsdetailsTable.setRowCount(len(auftragEinzelteilDaten))
- self.item = QtWidgets.QTableWidgetItem()
- counter = 0
- for row in auftragEinzelteilDaten:
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 0, self.item)
- self.item.setText(str(row[1]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 1, self.item)
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 2, self.item)
- self.item.setText(str(row[5]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 3, self.item)
- self.item.setText(str(row[3]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 4, self.item)
- self.item.setText(str("0"))
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 5, self.item)
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
-
- counter = counter +1
-
- self.setRowColor(self.ArbeitsschrittTable, 0,0,255,0) #zum setzen der ersten Zeile der Auftragstabelle auf grün
- self.setRowColor(self.ArbeitsschrittTable, 1,255,165,0) #zum setzen der zweiten Zeile der Auftragstabelle auf orange
- self.setRowColor(self.ArbeitsschrittTable, 2,255,255,255) #zum setzen der dritten Zeile der Auftragstabelle auf weiß
- self.setRowColor(self.ArbeitsschrittTable, 3,255,255,255) #zum setzen der vierten Zeile der Auftragstabelle auf weiß
-
- # setzen der beiden Felder auf einen leeren String, um Fehler zu Vermeiden, wenn ein neuer Auftrag geladen wird
- self.bauteiltypTextbox.setText("")
- self.PosNrTxtFeld.setText("")
-
-
- elif(databaseQueryWorking==True and len(auftragEinzelteilDaten)==0):
- print("Es wurde in der Datenbank kein Auftrag mit dieser Auftragsnummer gefunden.")
-
- def change_row_color(self, row, color_index):
- if(color_index == 1):
- self.setRowColor(self.AuftragsdetailsTable, row,255,255,255)
- if(color_index == 2):
- self.setRowColor(self.AuftragsdetailsTable, row,255,165,0)
- if(color_index == 3):
- self.setRowColor(self.AuftragsdetailsTable, row,0,255,0)
-
- def stopLoopClicked(self):
- # damit wird beim Klick auf den Stopbutton der stopLoop-boolWert in der Workerklasse auf true gesetzt -> der Stop des Threads wird initiiert
- if hasattr(self, 'objectDetectionWorker'):
- self.objectDetectionWorker.stopLoopSignal.emit(True)
-
- if hasattr(self, 'checkWaageWorker'):
- self.checkWaageWorker.stopLoopSignal.emit(True)
-
- def checkFinished(self):
- #die Funktion geht alle Zeilen der Auftragsliste durch und schaut, ob die richtige Anzahl an Teilen vorhanden sind
- for i in range(0,self.AuftragsdetailsTable.rowCount()):
- if self.AuftragsdetailsTable.item(i,3).text() != self.AuftragsdetailsTable.item(i,4).text():
- return False
- return True
-
- def checkWaage(self):
- #print("Running in thread:", threading.current_thread().name) # Debuggingausgabe
- QApplication.processEvents()
-
- # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
- #self.checkWaageWorker.stopLoopSignal.emit(False)
-
- # überprüfen, ob der Auftrag geladen wurde
- if(self.AuftragsdetailsTable.item(0,0) == None):
- print("Der Auftrag muss zuerst geladen werden.")
- return
-
- # überprüfen, ob ein Bauteiltyp gesetzt wurde
- if(self.checkPosNrEmpty()==True and self.checkBox.isChecked() == False):
- print("Das Pos.-Nr.-Feld ist leer.")
- return
-
- # den GUI Wert von Textfeld TeileZuViel in die Variable schreiben
- self.teileZuViel = int(float(self.teileZuVielTxtFeld.toPlainText()))
- self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
-
- einzelteilID = -1 # Initialisieren der Variable mit einem Defaultwert, welcher nie eingenommen werden können sollte
- if (self.checkBox.isChecked() == False):
- #übernehmen der BauteilID aus dem Feld Pos.-Nr - wenn der Workflow dynamisch gewählt wurde
- einzelteilID = int(self.PosNrTxtFeld.toPlainText())
- else:
- # wenn der Workflow statisch gesetzt wurde, dann soll das erste Item aus der Auftragsliste geladen werden, von welchem noch nicht genug Bauteile auf der Waage liegen
- for i in range(0,self.AuftragsdetailsTable.rowCount()):
- if self.AuftragsdetailsTable.item(i,3).text() != self.AuftragsdetailsTable.item(i,4).text():
- einzelteilID = int(self.AuftragsdetailsTable.item(i,0).text())
- self.PosNrTxtFeld.setText(str(self.AuftragsdetailsTable.item(i,0).text()))
- self.bauteiltypTextbox.setText(str(self.AuftragsdetailsTable.item(i,2).text()))
- break
-
- if einzelteilID == -1:
- # den Thread beenden
- self.checkWaageThread.quit()
- self.checkWaageThread.wait()
- try:
- self.checkWaageThread.started.disconnect() # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
- print("Der Thread wurde beendet.")
- except:
- print("Disconnecting the thread did not work.")
- return
-
-
- #zum setzen den Farbe der gesamten Reihe auf Orange
- self.setRowColor(self.AuftragsdetailsTable, self.getRowNr(einzelteilID),255,165,0)
- self.setRowColor(self.ArbeitsschrittTable, 1,0,255,0) # zum setzen der zweiten Spalte der Arbeitsschrittetabelle auf grün
- self.setRowColor(self.ArbeitsschrittTable, 2,255,165,0) # zum setzen der dritten Spalte der Arbeitsschrittetabelle auf orange
-
- # den Thread starten, welcher die Bauteilanzahl überprüft
- self.checkWaageWorker = Worker()
- self.checkWaageThread = QThread()
-
- self.checkWaageWorker.moveToThread(self.checkWaageThread)
-
- self.checkWaageWorker.checkWaageStartSignal.connect(self.checkWaageWorker.checkWaageThread)
- self.checkWaageWorker.checkWaageUpdateSignal.connect(self.checkWaageUpdate)
- self.checkWaageWorker.checkWaageFinishedSignal.connect(self.checkWaageFinished)
- self.checkWaageWorker.waageStoppedSignal.connect(self.threadStopped)
- self.checkWaageWorker.stopLoopSignal.connect(lambda status: setattr(self.checkWaageWorker, 'stopLoop', status)) #wird fürs aktive Stoppen des Threads benötigt
-
- self.checkWaageThread.started.connect(lambda: self.checkWaageWorker.checkWaageStartSignal.emit(einzelteilID, self.teileZuViel, self.auftragsnummer))
- self.checkWaageThread.start()
-
- def checkWaageUpdate(self, einzelteilID, anzahl):
- # die Funktion updated die (vom Thread) berechnete Bauteilanzahl in der GUI
- self.AuftragsdetailsTable.item(self.getRowNr(einzelteilID), 4).setText(str(anzahl)) # in die Tabelle die Anzahl an berechneten Bauteilen reinschreiben
-
- def checkWaageFinished(self, einzelteilID):
- self.setRowColor(self.AuftragsdetailsTable, self.getRowNr(einzelteilID),0,255,0) #zum setzen den Farbe der gesamten Reihe auf Grün
-
- if self.checkFinished(): # wenn alle Bauteile auf der Waage liegen, soll folgender Code ausgeführt werden
- self.setRowColor(self.ArbeitsschrittTable, 2,0,255,0) # zum setzen der dritten Spalte der Arbeitsschrittetabelle auf grün
- self.setRowColor(self.ArbeitsschrittTable, 3,0,255,0) # zum setzen der vierte Spalte der Arbeitsschrittetabelle auf grün
- else: # wenn noch nicht alle Bauteile des Auftrags auf der Waage liegen, soll folgernder Code ausgeführt werden
- self.setRowColor(self.ArbeitsschrittTable, 1,255,165,0) # zum setzen der zweiten Spalte der Arbeitsschrittetabelle auf orange
- self.setRowColor(self.ArbeitsschrittTable, 2,255,255,255) # zum setzen der dritten Spalte der Arbeitsschrittetabelle auf weiß
- if self.checkBoxAutoTare.isChecked():
- self.onTareClick()
-
- # den Thread beenden
- self.checkWaageThread.quit()
- self.checkWaageThread.wait()
-
- # auch wenn die Länge der Liste überschritten wurde
- # wenn der statische Workflow aktiviert ist, dann soll die checkwaage-funktion erneut aufgerufen werden
- if(self.checkBox.isChecked() == True):
- self.checkWaage()
-
- # GUI updaten
- #self.updateGUI()
-
- def objectTypeDetection(self):
- # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
-
- # wenn der statische Workflow ausgewählt wurde, dann soll die checkWaage Funktion aufgerufen werden, auch wenn die detectBauteiltyp-Funkion aufgerufen wurde
- if self.checkBox.isChecked() == True:
- self.checkWaage()
- return
-
- '''
- if(self.checkPosNrEmpty()==True):
- print("Das Pos.-Nr.-Feld ist leer.")
- return
- '''
-
- # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
- #self.objectDetectionWorker.stopLoopSignal.emit(False)
-
- # überprüfen, ob der Auftrag in die Tabelle geladen wurde
- if(self.AuftragsdetailsTable.item(0,0) == None):
- print("Der Auftrag muss zuerst geladen werden.")
- return
-
- # speichert den Wert, welcher im Textfeld steht in Variablen im Code
- self.setAuftragsnummer()
-
- # starten des Threats, welcher den Bauteiltyp zurück gibt
- self.objectDetectionWorker = Worker()
- self.objectDetectionThread = QThread()
-
- self.objectDetectionWorker.moveToThread(self.objectDetectionThread)
-
- self.objectDetectionWorker.objectDetectionStartSignal.connect(self.objectDetectionWorker.objectTypeDetectionThread)
- self.objectDetectionWorker.objectDetectionFinishedSignal.connect(self.objectTypeDetectionFinished)
- self.objectDetectionWorker.waageStoppedSignal.connect(self.threadStopped)
- self.objectDetectionWorker.stopLoopSignal.connect(lambda status: setattr(self.objectDetectionWorker, 'stopLoop', status)) #wird fürs aktive Stoppen des Threads benötigt
-
- self.objectDetectionThread.started.connect(lambda: self.objectDetectionWorker.objectDetectionStartSignal.emit(self.auftragsnummer))
- self.objectDetectionThread.start()
-
- def objectTypeDetectionFinished(self, einzelteilID, rowData):
- # wenn der Typ des Objektes erkannt wurde, dann soll die Funktion aufgerufen werden
-
- # Schreiben der Bauteiltype und Pos.-Nr in die jeweiligen Felder
- self.PosNrTxtFeld.setText(str(rowData[1]))
- self.bauteiltypTextbox.setText(rowData[2])
-
- # setzt den Boolean, um aus der Schleife raus zu gehen
- self.btTypeIsSet = True
-
- #zum setzen den Farbe der gesamten Reihe auf Orange
- self.setRowColor(self.AuftragsdetailsTable, self.getRowNr(einzelteilID),255,165,0)
-
- # den Thread beenden
- self.objectDetectionThread.quit()
- self.objectDetectionThread.wait()
-
- # wenn der Bauteiltyp erkannt wurde, dann soll die GUI aktualisiert werden und anschließend die CheckWaage-Funktion aufgerufen werden
- self.updateGUI()
- self.checkWaage()
-
- def threadStopped(self, einzelteilID):
- # wenn kein Bauteil erkannt wurde, dann ist die EinzenteilID = 0
- if self.checkFinished() == False:
- if(einzelteilID > 0):
- self.setRowColor(self.AuftragsdetailsTable, self.getRowNr(einzelteilID),255,255,255) #zum setzen den Farbe der gesamten Reihe auf Weiß
- self.setRowColor(self.ArbeitsschrittTable, 2,255,255,255)
- self.setRowColor(self.ArbeitsschrittTable, 1,255,165,0)
-
- # den Thread beenden
- if hasattr(self, 'objectDetectionThread'):
- self.objectDetectionThread.quit()
- self.objectDetectionThread.wait()
- print("Der ObjektDetection-Thread wurde beendet.")
-
- if hasattr(self, 'checkWaageThread'):
- self.checkWaageThread.quit()
- self.checkWaageThread.wait()
- print("Der CheckWaage-Thread wurde beendet.")
-
-
-
-
-
-
-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_())
-
-
-
-
-
diff --git a/GUI_26_09_staticWorkflow_Multithreading.py b/GUI_26_09_staticWorkflow_Multithreading.py
deleted file mode 100644
index 462b7f3..0000000
--- a/GUI_26_09_staticWorkflow_Multithreading.py
+++ /dev/null
@@ -1,823 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file 'test.ui'
-#
-# Created by: PyQt5 UI code generator 5.15.9
-#
-# WARNING: Any manual changes made to this file will be lost when pyuic5 is
-# run again. Do not edit this file unless you know what you are doing.
-
-
-########## beim Static workflow funktionieren die Threads ab dem zweiten nicht mehr
-
-#from PyQt5 import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QProgressBar
-from PyQt5 import QtCore, QtGui, QtWidgets
-from PyQt5.QtWidgets import QApplication, QComboBox
-from PyQt5.QtCore import QTimer, QThread, pyqtSignal, QObject
-from PyQt5.QtGui import QColor
-
-import serial
-import binascii
-import math
-import mariadb
-import time
-import threading
-
-
-db_config = {
- 'user': 'dbUser',
- 'password': 'dbPassword',
- 'host': '127.0.0.1', # 'host': 'localhost',
- 'database': 'projectGeislinger',
- 'port': 3306 # Standard port for MariaDB
-}
-
-# Establishing the connection
-conn = mariadb.connect(**db_config)
-# Create a cursor to execute queries
-cursor = conn.cursor()
-
-# Konfiguration der seriellen Schnittstelle
-ser = serial.Serial('/dev/ttyUSB0', 9600)
-
-waageEingeschwungen = False
-
-
-def wahrscheinlichkeitsDichte(x,mue, var):
- # in der Funktion wird der Wahrscheinlichkeitsdichtenwert der Variable x für eine bestimmte Normalverteilung berechnet
- standardabweichung = var**0.5
-
- result = 1/(standardabweichung * (2*math.pi)**0.5 ) * math.exp(-0.5 * ((x-mue)/standardabweichung)**2)
-
- return result
-
-def calcWahrscheinlichkeitFromDichte(x,mue, var):
- # in der Funktion wird die Wahrscheinlichkeit via der Wahrscheinlichkeitsdichte berechnet, indem das Verhältnis aus der dem Bauteil zugehörigen Wahrscheinlichkeitsdichte zu der maximalen Wahrscheinlichkeitsdichte berechnet wird
- p1 = wahrscheinlichkeitsDichte(x,mue, var)
- p_max = wahrscheinlichkeitsDichte(mue,mue, var)
-
- return p1/p_max
-
-
-
-#class Worker(QThread):
-class Worker(QObject):
- #progress = pyqtSignal(int)
- objectDetectionStartSignal = pyqtSignal(str)
- objectDetectionFinishedSignal = pyqtSignal(int, object)
-
- checkWaageStartSignal = pyqtSignal(int, int, str)
- checkWaageUpdateSignal = pyqtSignal(int, int)
- checkWaageFinishedSignal = pyqtSignal(int)
-
- waageStoppedSignal = pyqtSignal(int)
- stopLoopSignal = pyqtSignal(bool) #das Signal wird verwendet um direkt den stopLoop-Wert zu ändern (also kein Funktionsaufruf)
-
- stopLoop = False
- btTypeIsSet = False
- correctBtNr = False
-
-
- def __init__(self):
- super(Worker, self).__init__()
- stopLoop = False
-
-
- def getDataOfArticleType(self, allArticles, articleType):
- # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
- for i in allArticles:
- if i[1] == articleType:
- return i
-
- return -1
-
- def waageNichtEingeschwungenOutput(self):
- print("Die Waage ist noch nicht eingeschwungen - Ergebnisse sind dadurch noch fehlerhaft.")
-
- def readWaage(self):
- # in folgender Funktion wird die Waage ausgelesen
-
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
- #print("port to which it is connected: ", ser.portstr) #Debuggingausgabe
-
-
- if ser.is_open == False:
- ser.open()
-
-
- #an die Waage den Befehl senden, dass sie ausgelesen werden soll
- ser.write(b'getWeight\n')
- #ser.write(b'tare\n')
- serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
-
- # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
- lenString = len(serialString)-1
- if serialString[lenString] == "g" and serialString[lenString-1] == "k":
- #print("ist eingeschwungen") #Debuggingausgabe
- waageEingeschwungen = True
- else:
- print("die Waage ist noch nicht eingeschwungen")
- waageEingeschwungen = False
-
- #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
- intString = ""
- for i in serialString:
- if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
- intString = intString + i
- print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
- ## Waage auslesen - ENDE
-
- ser.close()
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
-
- return waageEingeschwungen, intString
-
- def objectTypeDetectionThread(self, auftragsnummer):
- # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
-
- #print("objectTypeDetectionThread - Running in thread:", threading.current_thread().name) #Debuggausgabe
-
- # Parameterdefinition
- propDensVect = []
-
- self.btTypeIsSet = False
-
- while(self.btTypeIsSet == False and self.stopLoop == False):
-
- # Auslesen der Waage
- waageEingeschwungen, intString = self.readWaage()
- if waageEingeschwungen == False:
- self.waageNichtEingeschwungenOutput()
- else:
-
- # Datenbankabfrage
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
- cursor.execute(sql_query)
- auftragEinzelteilDaten = cursor.fetchall()
-
- '''
- # Display data #Debugausgabe
- print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
- for row in auftragEinzelteilDaten:
- print(row)
- '''
-
- # in der Folge werden alle Wahrscheinlichkeitsdichten der Auftragsbauteile berechnet und in dem Vektor gesammelt
- for row in auftragEinzelteilDaten:
- propDensVect.append([wahrscheinlichkeitsDichte(float(intString),float(row[6]), float(row[7])), row[1], row[5]])
-
- # Jenen Eintrag des propDensVect raussuchen, welcher die größte Wahrscheinlichkeitsdichte beinhaltet
- maxpropDens = 0
- einzelteilID = 0
- rowData = None
- for row in propDensVect:
- if row[0] > maxpropDens:
- maxpropDens = row[0]
- einzelteilID = row[1]
- rowData = row
-
- # überprüfen, ob das aufliegende Bauteil in der Auftragstabelle vorhanden ist
- if(einzelteilID == 0):
- print("Es wurde kein Bauteil aus der Auftragsliste (Tabelle) erkannt.")
- else:
- print("Bei dem Bauteil" , einzelteilID , "wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
-
- # Wahrscheinlichkeit berechnen, dass das angegebene Bauteil auch wirklich diesem entspricht
- prop = 0
- for row in auftragEinzelteilDaten:
- if row[1] == einzelteilID:
- prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6]), float(row[7]))
- break
- print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
-
- # den Bool auf true setzen, damit die Schleife beendet wird - dieser wird auf True gesetzt, wenn ein Bauteiltyp erkannt wird
- self.btTypeIsSet = True
-
- if(self.stopLoop == False):
- # ein Signal zurück an den MainThreat senden, mit den Infos/Ergebnissen, der Typenbestimmung
- self.objectDetectionFinishedSignal.emit(einzelteilID, rowData)
- else:
- self.waageStoppedSignal.emit(einzelteilID)
-
- def checkWaageThread(self, einzelteilID, teileZuViel, auftragsnummer):
-
- self.correctBtNr = False
- prevAnzahl = 0
- anzahl = 0
- einzelteilID = einzelteilID
-
- while (self.correctBtNr == False and self.stopLoop == False):
-
- #überprüfen, ob die Waage eingeschwungen ist (und damit korrekte Ergebnisse liefert)
- waageEingeschwungen, intString = self.readWaage()
- if waageEingeschwungen == False:
- self.waageNichtEingeschwungenOutput()
- else:
-
- # Datenbankabfrage - holen der Auftrags- und Bauteilinfos
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
- cursor.execute(sql_query)
- auftragDaten = cursor.fetchall()
-
- '''
- # Display data - zum Debuggen
- print("Ausgabe der Auftragsdetails:")
- print("id|EinzelteilID|Auftragsnummer|Anzahl")
- for row in auftragDaten:
- print(row)
- '''
-
- #auslesen, wie viele Bauteile des Types laut Auftrag vorhanden sein sollen
- anzBauteile_soll = 0
- idVorhanden = False
-
- for row in auftragDaten:
- if row[1] == einzelteilID:
- anzBauteile_soll = row[3]
- idVorhanden = True
-
- if(idVorhanden == False):
- print("Die gewählte Pos.Nr ist nicht in der Auftragsliste (Tabelle) vorhanden.")
- return
-
- # Berechnen der Wahrscheinlichkeitsdichten - der Betrag aller Wahrscheinlichkeitsdichten werden im propDensVect gespeichert
- propDensVect = []
- articleData = self.getDataOfArticleType(auftragDaten, einzelteilID)
- for i in range(1,anzBauteile_soll+teileZuViel+1):
- # Mathematische Sätze, auf welchen die Berechnung basiert:
- # seien X1,..., Xn unabhängige Zufallsvariablen die N(mue_i, sigma_i^2) verteilt sind, dann ist X = X1+...+Xn - N(mue, sigma^2) verteilt mit mue=mue1+...+mue_n, sigma^2 = sigma_1^2+...+sigma_n^2
- mueGes = float(articleData[6])*i # Berechnen des äquivalenten Mittelwert
- varGes = float(articleData[7])*i # Berechnen der äquivalenten Varianz
- propDensVect.append([wahrscheinlichkeitsDichte(float(intString),mueGes, varGes), i])
-
- # durch den propDensVect iterieren und jenen Eintrag mit der höchsten Wahrscheinlichkeitsdichte raussuchen
- maxpropDens = 0
- for row in propDensVect:
- if row[0] > maxpropDens:
- maxpropDens = row[0]
- anzahl = row[1]
-
- # damit nur etwas gemacht wird (zb ein Updatesignal an den Hauptthread zurücksenden), wenn sich die berechnete Anzahl ändert
- if prevAnzahl != anzahl:
- prevAnzahl = anzahl
-
- # Die Wahrscheinlichkeit berechnen, dass das obige Ergebnis auch dem Bauteil entspricht
- if anzahl > 0:
- for row in auftragDaten:
- if row[1] == einzelteilID:
- prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6])*anzahl, float(row[7])*anzahl)
- break
- print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
-
- # wenn genug Bauteile vorhanden sind, dann soll die Schleife beendet werden
- if (anzahl == anzBauteile_soll):
- self.correctBtNr = True
-
- # Konsolenausgabe
- if maxpropDens > 0:
- print("Bei der Anzahl" , anzahl , "des Bauteiltypes", einzelteilID, ",wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
- self.checkWaageUpdateSignal.emit(einzelteilID, anzahl)
-
- else:
- print("Von der ausgewählten Bauteiltype liegt die berechnete Wahrscheinlichkeit bei 0, dass zwischen 0 und", anzBauteile_soll+teileZuViel, "Bauteilen auf der Waage liegen.")
- print("Falls die korrekte Anzhl an Bauteilen auf der Waage liegt, könnte der Fehler in einer falschen Kalibrierung der Waage liegen (TARE).")
-
- if(self.stopLoop == False):
- self.checkWaageFinishedSignal.emit(einzelteilID)
- else:
- self.waageStoppedSignal.emit(einzelteilID)
-
-
-
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- self.auftragsnummer = ""
- self.teileZuViel = 0 # Anzahl an Bauteilen, welche zu viel drinnen sein können - der Parameter kann selbst gesetzt werden #####
- self.correctBtNr = False
- self.btTypeIsSet = False
-
-
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1090, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.btn1 = QtWidgets.QPushButton(self.centralwidget)
- self.btn1.setGeometry(QtCore.QRect(700, 45, 111, 25))
- self.btn1.setObjectName("btn1")
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 300, 661, 192))
- self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
- self.AuftragsdetailsTable.setColumnCount(7)
- self.AuftragsdetailsTable.setRowCount(0)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(5, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(6, item)
-
- self.label = QtWidgets.QLabel(self.centralwidget)
- self.label.setGeometry(QtCore.QRect(500, 20, 121, 17))
- self.label.setObjectName("label")
- self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit.setGeometry(QtCore.QRect(450, 40, 221, 31))
- self.textEdit.setObjectName("textEdit")
- self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
- self.bauteilTypBtn.setGeometry(QtCore.QRect(700, 150, 161, 25))
- self.bauteilTypBtn.setObjectName("bauteilTypBtn")
- self.checkWaageBtn = QtWidgets.QPushButton(self.centralwidget)
- self.checkWaageBtn.setGeometry(QtCore.QRect(700, 460, 161, 25))
- self.checkWaageBtn.setObjectName("checkWaageBtn")
- self.stopLoopBtn = QtWidgets.QPushButton(self.centralwidget)
- self.stopLoopBtn.setGeometry(QtCore.QRect(700, 500, 161, 25))
- self.stopLoopBtn.setObjectName("stopLoopBtn")
- self.waageTareBtn = QtWidgets.QPushButton(self.centralwidget)
- self.waageTareBtn.setGeometry(QtCore.QRect(700, 100, 161, 25))
- self.waageTareBtn.setObjectName("waageTareBtn")
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
- self.bauteiltypTextbox.setGeometry(QtCore.QRect(700, 290, 221, 31))
- self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
- self.BezeichnungLabel = QtWidgets.QLabel(self.centralwidget)
- self.BezeichnungLabel.setGeometry(QtCore.QRect(700, 270, 181, 20))
- self.BezeichnungLabel.setObjectName("BezeichnungLabel")
- self.PosNrLabel = QtWidgets.QLabel(self.centralwidget)
- self.PosNrLabel.setGeometry(QtCore.QRect(700, 200, 67, 17))
- self.PosNrLabel.setObjectName("PosNrLabel")
- self.PosNrTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
- self.PosNrTxtFeld.setGeometry(QtCore.QRect(700, 220, 191, 31))
- self.BezeichnungLabel.setObjectName("BezeichnungLabel")
- self.teileZuVielLabel = QtWidgets.QLabel(self.centralwidget)
- self.teileZuVielLabel.setGeometry(QtCore.QRect(700, 350, 350, 17))
- self.teileZuVielLabel.setObjectName("teileZuVielLabel")
- self.teileZuVielTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
- self.teileZuVielTxtFeld.setGeometry(QtCore.QRect(700, 370, 191, 31))
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
- self.menubar.setObjectName("menubar")
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
- self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
- self.checkBox.setGeometry(QtCore.QRect(700, 10, 151, 23))
- self.checkBox.setObjectName("checkBox")
-
- #self.myTestLambda = lambda: self.worker.checkWaageStartSignal.emit(einzelteilID, self.teileZuViel, self.auftragsnummer)
-
- '''
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setVerticalHeaderItem(0,item)
- '''
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
- self.btn1.clicked.connect(self.auftragsBtnClicked)
- item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Pos.-Nr"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
- item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
- item.setText(_translate("MainWindow", "Soll-Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
- item.setText(_translate("MainWindow", "Ist-Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(5)
- item.setText(_translate("MainWindow", "Lgort"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(6)
- item.setText(_translate("MainWindow", "set Farbe"))
-
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltyp erkennen"))
- self.bauteilTypBtn.clicked.connect(self.objectTypeDetection)
- self.AuftragsdetailsTable.cellClicked.connect(self.onTableCellClick)
- #self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
- #item = self.AuftragsdetailsTable.verticalHeaderItem(0)
- #item.setText(_translate("MainWindow", "test"))
- self.BezeichnungLabel.setText(_translate("MainWindow", "Bezeichnung"))
- self.PosNrLabel.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.teileZuVielLabel.setText(_translate("MainWindow", "Zu prüfende Teileanzahl über Auftragsanzahl:"))
- self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
- self.checkWaageBtn.setText(_translate("MainWindow", "check Waage"))
- self.checkWaageBtn.clicked.connect(self.checkWaage)
- self.stopLoopBtn.setText(_translate("MainWindow", "stop loop"))
- self.stopLoopBtn.clicked.connect(self.stopLoopClicked)
- self.waageTareBtn.setText(_translate("MainWindow", "Waage tarieren"))
- self.waageTareBtn.clicked.connect(self.onTareClick)
- self.checkBox.setText(_translate("MainWindow", "static workflow"))
- self.checkBox.clicked.connect(self.onCheckboxCheck)
-
- def onTareClick(self):
- #Tarieren der Waage
- if ser.is_open == False:
- ser.open()
- ser.write(b'tare\n')
- ser.close()
-
-
- def onCheckboxCheck(self):
- if self.checkBox.isChecked() == True:
- print("static workflow activated")
- else:
- print("static workflow deactivated")
-
- def getRowNr(self, posNr):
- for i in range(0,self.AuftragsdetailsTable.rowCount()):
- if(self.AuftragsdetailsTable.item(i,0).text() == str(posNr)):
- return i
-# brauche ich hier vermutlich nicht mehr - ist in den Worker Thread kopiert worden
- def waageNichtEingeschwungenOutput(self):
- print("Die Waage ist noch nicht eingeschwungen - Ergebnisse sind dadurch noch fehlerhaft.")
-
- def onTableCellClick(self):
- self.PosNrTxtFeld.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),0).text())
- self.bauteiltypTextbox.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),2).text())
-
- def setAuftragsnummer(self):
- self.auftragsnummer = self.textEdit.toPlainText()
- if(not self.auftragsnummer):
- self.auftragsnummer = ""
- self.textEdit.setText("")
-
- def checkAuftragsnummerEmpty(self):
- if self.auftragsnummer == "":
- print("Das Auftragsnummernfeld ist leer.")
- return True
- else:
- return False
-
- def checkPosNrEmpty(self):
- if self.PosNrTxtFeld.toPlainText() == "":
- return True
- else:
- return False
-
-
-# eventuell benötigt man die Funktion hier nicht mehr, da sie zu den Threads kopiert wurde
- def getDataOfArticleType(self, allArticles, articleType):
- # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
- for i in allArticles:
- if i[1] == articleType:
- return i
- return -1
-
- def updateGUI(self):
- self.PosNrLabel.repaint() #GUI aktualisieren
- QApplication.processEvents() #GUI aktualisieren
-
- def setRowColor(self, rowID,r,g,b):
- self.AuftragsdetailsTable.item(rowID, 0).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 1).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 2).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 3).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 4).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 5).setBackground(QtGui.QColor(r,g,b))
-
-#wird hier vermutlich nicht mehr benötigt - wurde in die Workerklasse kopiert
- def readWaage(self):
- # in folgender Funktion wird die Waage ausgelesen
-
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
- #print("port to which it is connected: ", ser.portstr) #Debuggingausgabe
- self.checkPosNrEmpty()
-
- if ser.is_open == False:
- ser.open()
-
-
- #an die Waage den Befehl senden, dass sie ausgelesen werden soll
- ser.write(b'getWeight\n')
- #ser.write(b'tare\n')
- serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
-
- # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
- lenString = len(serialString)-1
- if serialString[lenString] == "g" and serialString[lenString-1] == "k":
- #print("ist eingeschwungen") #Debuggingausgabe
- waageEingeschwungen = True
- else:
- print("die Waage ist noch nicht eingeschwungen")
- waageEingeschwungen = False
-
- #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
- intString = ""
- for i in serialString:
- if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
- intString = intString + i
- print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
- ## Waage auslesen - ENDE
-
- ser.close()
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
-
- return waageEingeschwungen, intString
-
- def auftragsBtnClicked(self):
- databaseQueryWorking = False #wird für die Überprüfung, ob die Datenbankabfrage fehlerhaft ist, verwendet
- auftragEinzelteilDaten = []
-
- self.setAuftragsnummer()
- if(not self.checkAuftragsnummerEmpty()):
-
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + self.auftragsnummer
- try:
- cursor.execute(sql_query)
- # Fetch results
- auftragEinzelteilDaten = cursor.fetchall()
- databaseQueryWorking = True
- except:
- print("Fehler in der Datenbankabfrage.")
-
-
-
- if databaseQueryWorking==True and len(auftragEinzelteilDaten)>0:
- '''
- # Display data
- print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
- for row in auftragEinzelteilDaten:
- if str(row[2]) == self.auftragsnummer:
- print("passt")
- print(row)
- '''
-
- ### die Auftragsdaten in die Tabelle laden
- self.AuftragsdetailsTable.setRowCount(len(auftragEinzelteilDaten))
- self.item = QtWidgets.QTableWidgetItem()
- counter = 0
- for row in auftragEinzelteilDaten:
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 0, self.item)
- self.item.setText(str(row[1]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 1, self.item)
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 2, self.item)
- self.item.setText(str(row[5]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 3, self.item)
- self.item.setText(str(row[3]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 4, self.item)
- self.item.setText(str("0"))
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 5, self.item)
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
-
- # Dropdown für Farben in die 6. Spalte einfügen
- #self.item = QtWidgets.QTableWidgetItem()
- #self.AuftragsdetailsTable.setItem(counter, 6, self.item)
- combo = QComboBox()
- combo.addItems(["Farbe", "Weiß", "Orange", "Grün"])
- combo.currentIndexChanged.connect(lambda index, rowId =counter: self.change_row_color(rowId, index))
- self.AuftragsdetailsTable.setCellWidget(counter, 6, combo)
- counter = counter +1
-
- elif(databaseQueryWorking==True and len(auftragEinzelteilDaten)==0):
- print("Es wurde in der Datenbank kein Auftrag mit dieser Auftragsnummer gefunden.")
-
- def change_row_color(self, row, color_index):
- if(color_index == 1):
- self.setRowColor(row,255,255,255)
- if(color_index == 2):
- self.setRowColor(row,255,165,0)
- if(color_index == 3):
- self.setRowColor(row,0,255,0)
-
-
-
-
- def stopLoopClicked(self):
- # damit wird beim Klick auf den Stopbutton der stopLoop-boolWert in der Workerklasse auf true gesetzt -> der Stop des Threads wird initiiert
- if hasattr(self, 'objectDetectionWorker'):
- self.objectDetectionWorker.stopLoopSignal.emit(True)
-
- if hasattr(self, 'checkWaageWorker'):
- self.checkWaageWorker.stopLoopSignal.emit(True)
-
- def checkWaage(self):
- #print("Running in thread:", threading.current_thread().name) # Debuggingausgabe
- QApplication.processEvents()
-
- # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
- #self.checkWaageWorker.stopLoopSignal.emit(False)
-
- # überprüfen, ob der Auftrag geladen wurde
- if(self.AuftragsdetailsTable.item(0,0) == None):
- print("Der Auftrag muss zuerst geladen werden.")
- return
-
- # überprüfen, ob ein Bauteiltyp gesetzt wurde
- if(self.checkPosNrEmpty()==True and self.checkBox.isChecked() == False):
- print("Das Pos.-Nr.-Feld ist leer.")
- return
-
- # den GUI Wert von Textfeld TeileZuViel in die Variable schreiben
- self.teileZuViel = int(float(self.teileZuVielTxtFeld.toPlainText()))
- self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
-
- einzelteilID = -1 # Initialisieren der Variable mit einem Defaultwert, welcher nie eingenommen werden können sollte
- if (self.checkBox.isChecked() == False):
- #übernehmen der BauteilID aus dem Feld Pos.-Nr - wenn der Workflow dynamisch gewählt wurde
- einzelteilID = int(self.PosNrTxtFeld.toPlainText())
- else:
- # wenn der Workflow statisch gesetzt wurde, dann soll das erste Item aus der Auftragsliste geladen werden, von welchem noch nicht genug Bauteile auf der Waage liegen
- for i in range(0,self.AuftragsdetailsTable.rowCount()):
- if self.AuftragsdetailsTable.item(i,3).text() != self.AuftragsdetailsTable.item(i,4).text():
- einzelteilID = int(self.AuftragsdetailsTable.item(i,0).text())
- self.PosNrTxtFeld.setText(str(self.AuftragsdetailsTable.item(i,0).text()))
- self.bauteiltypTextbox.setText(str(self.AuftragsdetailsTable.item(i,2).text()))
- break
-
- if einzelteilID == -1:
- # den Thread beenden
- self.checkWaageThread.quit()
- self.checkWaageThread.wait()
- try:
- self.checkWaageThread.started.disconnect() # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
- print("Der Thread wurde beendet.")
- except:
- print("Disconnecting the thread did not work.")
- return
-
-
- #zum setzen den Farbe der gesamten Reihe auf Orange
- self.setRowColor(self.getRowNr(einzelteilID),255,165,0)
-
- # den Thread starten, welcher die Bauteilanzahl überprüft
- self.checkWaageWorker = Worker()
- self.checkWaageThread = QThread()
-
- self.checkWaageWorker.moveToThread(self.checkWaageThread)
-
- self.checkWaageWorker.checkWaageStartSignal.connect(self.checkWaageWorker.checkWaageThread)
- self.checkWaageWorker.checkWaageUpdateSignal.connect(self.checkWaageUpdate)
- self.checkWaageWorker.checkWaageFinishedSignal.connect(self.checkWaageFinished)
- self.checkWaageWorker.waageStoppedSignal.connect(self.threadStopped)
- self.checkWaageWorker.stopLoopSignal.connect(lambda status: setattr(self.checkWaageWorker, 'stopLoop', status)) #wird fürs aktive Stoppen des Threads benötigt
-
- self.checkWaageThread.started.connect(lambda: self.checkWaageWorker.checkWaageStartSignal.emit(einzelteilID, self.teileZuViel, self.auftragsnummer))
- self.checkWaageThread.start()
-
- def checkWaageUpdate(self, einzelteilID, anzahl):
- # die Funktion updated die (vom Thread) berechnete Bauteilanzahl in der GUI
- self.AuftragsdetailsTable.item(self.getRowNr(einzelteilID), 4).setText(str(anzahl)) # in die Tabelle die Anzahl an berechneten Bauteilen reinschreiben
-
- def checkWaageFinished(self, einzelteilID):
- self.setRowColor(self.getRowNr(einzelteilID),0,255,0) #zum setzen den Farbe der gesamten Reihe auf Grün
-
- # den Thread beenden
- self.checkWaageThread.quit()
- self.checkWaageThread.wait()
-
- # auch wenn die Länge der Liste überschritten wurde
- # wenn der statische Workflow aktiviert ist, dann soll die checkwaage-funktion erneut aufgerufen werden
- if(self.checkBox.isChecked() == True):
- self.checkWaage()
-
- # GUI updaten
- #self.updateGUI()
-
- def objectTypeDetection(self):
- # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
-
- # wenn der statische Workflow ausgewählt wurde, dann soll die checkWaage Funktion aufgerufen werden, auch wenn die detectBauteiltyp-Funkion aufgerufen wurde
- if self.checkBox.isChecked() == True:
- self.checkWaage()
- return
-
- '''
- if(self.checkPosNrEmpty()==True):
- print("Das Pos.-Nr.-Feld ist leer.")
- return
- '''
-
- # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
- #self.objectDetectionWorker.stopLoopSignal.emit(False)
-
- # überprüfen, ob der Auftrag in die Tabelle geladen wurde
- if(self.AuftragsdetailsTable.item(0,0) == None):
- print("Der Auftrag muss zuerst geladen werden.")
- return
-
- # speichert den Wert, welcher im Textfeld steht in Variablen im Code
- self.setAuftragsnummer()
-
- # starten des Threats, welcher den Bauteiltyp zurück gibt
- self.objectDetectionWorker = Worker()
- self.objectDetectionThread = QThread()
-
- self.objectDetectionWorker.moveToThread(self.objectDetectionThread)
-
- self.objectDetectionWorker.objectDetectionStartSignal.connect(self.objectDetectionWorker.objectTypeDetectionThread)
- self.objectDetectionWorker.objectDetectionFinishedSignal.connect(self.objectTypeDetectionFinished)
- self.objectDetectionWorker.waageStoppedSignal.connect(self.threadStopped)
- self.objectDetectionWorker.stopLoopSignal.connect(lambda status: setattr(self.objectDetectionWorker, 'stopLoop', status)) #wird fürs aktive Stoppen des Threads benötigt
-
- self.objectDetectionThread.started.connect(lambda: self.objectDetectionWorker.objectDetectionStartSignal.emit(self.auftragsnummer))
- self.objectDetectionThread.start()
-
- def objectTypeDetectionFinished(self, einzelteilID, rowData):
- # wenn der Typ des Objektes erkannt wurde, dann soll die Funktion aufgerufen werden
-
- # Schreiben der Bauteiltype und Pos.-Nr in die jeweiligen Felder
- self.PosNrTxtFeld.setText(str(rowData[1]))
- self.bauteiltypTextbox.setText(rowData[2])
-
- # setzt den Boolean, um aus der Schleife raus zu gehen
- self.btTypeIsSet = True
-
- #zum setzen den Farbe der gesamten Reihe auf Orange
- self.setRowColor(self.getRowNr(einzelteilID),255,165,0)
-
- # den Thread beenden
- self.objectDetectionThread.quit()
- self.objectDetectionThread.wait()
-
- '''
- try:
- self.objectDetectionThread.started.disconnect() # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
- except:
- print(f"Error while disconnecting: {e}")
- print("Disconnecting the thread did not work.")
- '''
-
- # wenn der Bauteiltyp erkannt wurde, dann soll die GUI aktualisiert werden und anschließend die CheckWaage-Funktion aufgerufen werden
- self.updateGUI()
- self.checkWaage()
-
- def threadStopped(self, einzelteilID):
- # wenn kein Bauteil erkannt wurde, dann ist die EinzenteilID = 0
- if(einzelteilID > 0):
- self.setRowColor(self.getRowNr(einzelteilID),255,255,255) #zum setzen den Farbe der gesamten Reihe auf Weiß
-
- # den Thread beenden
- if hasattr(self, 'objectDetectionThread'):
- self.objectDetectionThread.quit()
- self.objectDetectionThread.wait()
- print("Der ObjektDetection-Thread wurde beendet.")
-
- if hasattr(self, 'checkWaageThread'):
- self.checkWaageThread.quit()
- self.checkWaageThread.wait()
- print("Der CheckWaage-Thread wurde beendet.")
-
-
-
-
-
-
-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_())
-
-
-
-
-
diff --git a/bjoerntest2.py b/bjoerntest2.py
deleted file mode 100644
index e7c38dc..0000000
--- a/bjoerntest2.py
+++ /dev/null
@@ -1,222 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file 'testbjoern2.ui'
-#
-# Created by: PyQt5 UI code generator 5.15.11
-#
-# WARNING: Any manual changes made to this file will be lost when pyuic5 is
-# run again. Do not edit this file unless you know what you are doing.
-
-
-from PyQt5 import QtCore, QtGui, QtWidgets
-
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1090, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.btn1 = QtWidgets.QPushButton(self.centralwidget)
- self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
- self.btn1.setObjectName("btn1")
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
- self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
- self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
- self.AuftragsdetailsTable.setColumnCount(5)
- self.AuftragsdetailsTable.setRowCount(1)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(0, 0, item)
- self.label = QtWidgets.QLabel(self.centralwidget)
- self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
- self.label.setObjectName("label")
- self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
- self.textEdit.setObjectName("textEdit")
- self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
- self.bauteilTypBtn.setGeometry(QtCore.QRect(60, 340, 161, 25))
- self.bauteilTypBtn.setObjectName("bauteilTypBtn")
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
- self.bauteiltypTextbox.setGeometry(QtCore.QRect(230, 340, 221, 31))
- self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
- self.label_3 = QtWidgets.QLabel(self.centralwidget)
- self.label_3.setGeometry(QtCore.QRect(250, 320, 181, 20))
- self.label_3.setObjectName("label_3")
- self.label_4 = QtWidgets.QLabel(self.centralwidget)
- self.label_4.setGeometry(QtCore.QRect(520, 320, 67, 17))
- self.label_4.setObjectName("label_4")
- self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit_3.setGeometry(QtCore.QRect(460, 340, 191, 31))
- self.textEdit_3.setObjectName("textEdit_3")
- self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
- self.checkBox.setGeometry(QtCore.QRect(70, 410, 151, 23))
- self.checkBox.setChecked(False)
- self.checkBox.setObjectName("checkBox")
- self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
- self.graphicsView.setGeometry(QtCore.QRect(800, 280, 256, 192))
- self.graphicsView.setObjectName("graphicsView")
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
- self.menubar.setObjectName("menubar")
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
-
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
- item = self.AuftragsdetailsTable.verticalHeaderItem(0)
- item.setText(_translate("MainWindow", "T1"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Pos.-Nr"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
- item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
- item.setText(_translate("MainWindow", "Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
- item.setText(_translate("MainWindow", "Lgort"))
- __sortingEnabled = self.AuftragsdetailsTable.isSortingEnabled()
- self.AuftragsdetailsTable.setSortingEnabled(False)
- item = self.AuftragsdetailsTable.item(0, 0)
- item.setText(_translate("MainWindow", "I1"))
- self.AuftragsdetailsTable.setSortingEnabled(__sortingEnabled)
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.textEdit.setHtml(_translate("MainWindow", "\n"
-"
\n"
-"
"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
- self.bauteiltypTextbox.setHtml(_translate("MainWindow", "\n"
-"\n"
-"
"))
- self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
- self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
-
-
-
-import sys
-import cv2
-#from PyQt5 import QtCore, QtWidgets, QtGui
-
-class CameraStreamApp(QtWidgets.QMainWindow):
- def __init__(self):
- super().__init__()
- self.initUI()
-
- # OpenCV video capture (0 for the default camera)
- self.cap = None # Initialize capture as None (stream starts on button click)
-
- # Timer for updating the frame
- self.timer = QtCore.QTimer(self)
- self.timer.timeout.connect(self.update_frame)
-
- def initUI(self):
- self.setWindowTitle("Camera Stream")
-
- # Create a QGraphicsView widget
- self.graphicsView = QtWidgets.QGraphicsView(self)
- self.graphicsView.setGeometry(QtCore.QRect(50, 50, 640, 480))
- self.graphicsView.setObjectName("graphicsView")
-
- # Create a QGraphicsScene to hold the frame
- self.scene = QtWidgets.QGraphicsScene()
- self.graphicsView.setScene(self.scene)
-
- # Create a button to start the camera stream
- self.startButton = QtWidgets.QPushButton('Start Camera', self)
- self.startButton.setGeometry(QtCore.QRect(50, 550, 120, 40)) # Position the button below the view
- self.startButton.clicked.connect(self.start_camera)
-
- # Show the main window
- self.setGeometry(100, 100, 800, 600)
- self.show()
-
- def start_camera(self):
- # Start OpenCV video capture (only if not already started)
- if self.cap is None:
- self.cap = cv2.VideoCapture(0)
- if not self.cap.isOpened():
- print("Error: Unable to open the camera.")
- return
- self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
-
- def update_frame(self):
- if self.cap:
- ret, frame = self.cap.read() # Capture frame from the camera
- if ret:
- # Convert the frame from BGR (OpenCV format) to RGB
- frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
-
- # Convert the frame to QImage
- h, w, ch = frame.shape
- bytes_per_line = ch * w
- qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
-
- # Add the QImage to a QPixmap
- pixmap = QtGui.QPixmap.fromImage(qt_image)
-
- # Update the scene with the new pixmap
- self.scene.clear()
- self.scene.addPixmap(pixmap)
-
- def closeEvent(self, event):
- # Release the camera when the application is closed
- if self.cap is not None:
- self.cap.release()
- event.accept()
-
-
-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_())
diff --git a/bjoerntest3.py b/bjoerntest3.py
deleted file mode 100644
index 14b0b6f..0000000
--- a/bjoerntest3.py
+++ /dev/null
@@ -1,181 +0,0 @@
-from PyQt5 import QtCore, QtGui, QtWidgets
-import cv2
-import sys
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1090, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.btn1 = QtWidgets.QPushButton(self.centralwidget)
- self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
- self.btn1.setObjectName("btn1")
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
- self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
- self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
- self.AuftragsdetailsTable.setColumnCount(5)
- self.AuftragsdetailsTable.setRowCount(1)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(0, 0, item)
- self.label = QtWidgets.QLabel(self.centralwidget)
- self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
- self.label.setObjectName("label")
- self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
- self.textEdit.setObjectName("textEdit")
- self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
- self.bauteilTypBtn.setGeometry(QtCore.QRect(60, 340, 161, 25))
- self.bauteilTypBtn.setObjectName("bauteilTypBtn")
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
- self.bauteiltypTextbox.setGeometry(QtCore.QRect(230, 340, 221, 31))
- self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
- self.label_3 = QtWidgets.QLabel(self.centralwidget)
- self.label_3.setGeometry(QtCore.QRect(250, 320, 181, 20))
- self.label_3.setObjectName("label_3")
- self.label_4 = QtWidgets.QLabel(self.centralwidget)
- self.label_4.setGeometry(QtCore.QRect(520, 320, 67, 17))
- self.label_4.setObjectName("label_4")
- self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit_3.setGeometry(QtCore.QRect(460, 340, 191, 31))
- self.textEdit_3.setObjectName("textEdit_3")
- self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
- self.checkBox.setGeometry(QtCore.QRect(70, 410, 151, 23))
- self.checkBox.setChecked(False)
- self.checkBox.setObjectName("checkBox")
- self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
- self.graphicsView.setGeometry(QtCore.QRect(800, 280, 256, 192))
- self.graphicsView.setObjectName("graphicsView")
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
- self.menubar.setObjectName("menubar")
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
-
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
- self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
- self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
-
-
-class CameraStreamApp(QtWidgets.QMainWindow):
- def __init__(self, ui):
- super().__init__()
- self.ui = ui
- self.cap = None # Initialize capture as None (stream starts on button click)
-
- # Timer for updating the frame
- self.timer = QtCore.QTimer(self)
- self.timer.timeout.connect(self.update_frame)
-
- # Set up the camera stream button
- self.ui.btn1.clicked.connect(self.start_camera)
-
- # Set up the graphics view and scene
- self.scene = QtWidgets.QGraphicsScene(self)
- self.ui.graphicsView.setScene(self.scene)
-
- def start_camera(self):
- # Start OpenCV video capture (only if not already started)
- if self.cap is None:
- self.cap = cv2.VideoCapture(0)
- if not self.cap.isOpened():
- print("Error: Unable to open the camera.")
- return
- self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
-
- # def update_frame(self):
- # if self.cap:
- # ret, frame = self.cap.read() # Capture frame from the camera
- # if ret:
- # # Convert the frame from BGR (OpenCV format) to RGB
- # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
-
- # # Convert the frame to QImage
- # h, w, ch = frame.shape
- # bytes_per_line = ch * w
- # qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
-
- # # Add the QImage to a QPixmap
- # pixmap = QtGui.QPixmap.fromImage(qt_image)
-
- # # Update the scene with the new pixmap
- # self.scene.clear()
- # self.scene.addPixmap(pixmap)
-
- def update_frame(self):
- if self.cap:
- ret, frame = self.cap.read() # Capture frame from the camera
- if ret:
- # Convert the frame from BGR (OpenCV format) to RGB
- frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
-
- # Convert the frame to QImage
- h, w, ch = frame.shape
- bytes_per_line = ch * w
- qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
-
- # Add the QImage to a QPixmap
- pixmap = QtGui.QPixmap.fromImage(qt_image)
-
- # Get the size of the graphicsView and scale the pixmap to fit
- view_size = self.ui.graphicsView.size()
- scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
-
- # Update the scene with the scaled pixmap
- self.scene.clear()
- self.scene.addPixmap(scaled_pixmap)
-
- def closeEvent(self, event):
- # Release the camera when the application is closed
- if self.cap is not None:
- self.cap.release()
- event.accept()
-
-
-if __name__ == "__main__":
- app = QtWidgets.QApplication(sys.argv)
- MainWindow = QtWidgets.QMainWindow()
- ui = Ui_MainWindow()
- ui.setupUi(MainWindow)
-
- # Initialize the CameraStreamApp with the UI
- camera_app = CameraStreamApp(ui)
-
- MainWindow.show()
- sys.exit(app.exec_())
diff --git a/bjoerntest4.py b/bjoerntest4.py
deleted file mode 100644
index b4fa25c..0000000
--- a/bjoerntest4.py
+++ /dev/null
@@ -1,154 +0,0 @@
-from PyQt5 import QtCore, QtGui, QtWidgets
-import cv2
-import sys
-from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1090, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.btn1 = QtWidgets.QPushButton(self.centralwidget)
- self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
- self.btn1.setObjectName("btn1")
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
- self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
- self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
- self.AuftragsdetailsTable.setColumnCount(5)
- self.AuftragsdetailsTable.setRowCount(1)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(0, 0, item)
- self.label = QtWidgets.QLabel(self.centralwidget)
- self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
- self.label.setObjectName("label")
- self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
- self.textEdit.setObjectName("textEdit")
- self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
- self.bauteilTypBtn.setGeometry(QtCore.QRect(60, 340, 161, 25))
- self.bauteilTypBtn.setObjectName("bauteilTypBtn")
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
- self.bauteiltypTextbox.setGeometry(QtCore.QRect(230, 340, 221, 31))
- self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
- self.label_3 = QtWidgets.QLabel(self.centralwidget)
- self.label_3.setGeometry(QtCore.QRect(250, 320, 181, 20))
- self.label_3.setObjectName("label_3")
- self.label_4 = QtWidgets.QLabel(self.centralwidget)
- self.label_4.setGeometry(QtCore.QRect(520, 320, 67, 17))
- self.label_4.setObjectName("label_4")
- self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit_3.setGeometry(QtCore.QRect(460, 340, 191, 31))
- self.textEdit_3.setObjectName("textEdit_3")
- self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
- self.checkBox.setGeometry(QtCore.QRect(70, 410, 151, 23))
- self.checkBox.setChecked(False)
- self.checkBox.setObjectName("checkBox")
- self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
- self.graphicsView.setGeometry(QtCore.QRect(800, 280, 256, 192))
- self.graphicsView.setObjectName("graphicsView")
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
- self.menubar.setObjectName("menubar")
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
-
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
- self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
- self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
-
-class CameraStreamApp(QtWidgets.QMainWindow):
- def __init__(self, ui):
- super().__init__()
- self.ui = ui
- self.yolo_stream = None # Initialize YOLOv8CameraStream as None
- self.timer = QtCore.QTimer(self)
- self.timer.timeout.connect(self.update_frame)
- self.ui.btn1.clicked.connect(self.start_camera) # start camera if button LoadAuftrag is clicked
- self.scene = QtWidgets.QGraphicsScene(self)
- self.ui.graphicsView.setScene(self.scene)
-
- def start_camera(self):
- # Start the YOLOv8 camera stream (only if not already started)
- if self.yolo_stream is None:
- self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
- # self.yolo_stream.start() # Start the YOLOv8 stream
- self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
-
- def update_frame(self):
- # Update the frame from YOLOv8 stream
- if self.yolo_stream:
- ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
- if ret:
- # Convert the frame from BGR (OpenCV format) to RGB
- frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
-
- # Convert the frame to QImage
- h, w, ch = frame.shape
- bytes_per_line = ch * w
- qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
-
- # Add the QImage to a QPixmap
- pixmap = QtGui.QPixmap.fromImage(qt_image)
-
- # Get the size of the graphicsView and scale the pixmap to fit
- view_size = self.ui.graphicsView.size()
- scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
-
- # Update the scene with the scaled pixmap
- self.scene.clear()
- self.scene.addPixmap(scaled_pixmap)
-
- def closeEvent(self, event):
- # Release the camera when the application is closed
- if self.yolo_stream is not None:
- self.yolo_stream.cap.release()
- event.accept()
-
-if __name__ == "__main__":
- app = QtWidgets.QApplication(sys.argv)
- MainWindow = QtWidgets.QMainWindow()
- ui = Ui_MainWindow()
- ui.setupUi(MainWindow)
-
- # Initialize the CameraStreamApp with the UI
- camera_app = CameraStreamApp(ui)
-
- MainWindow.show()
- sys.exit(app.exec_())
diff --git a/bjoerntest5.py b/bjoerntest5.py
deleted file mode 100644
index 9603fe8..0000000
--- a/bjoerntest5.py
+++ /dev/null
@@ -1,159 +0,0 @@
-from PyQt5 import QtCore, QtGui, QtWidgets
-import cv2
-import sys
-from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1090, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.btn1 = QtWidgets.QPushButton(self.centralwidget)
- self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
- self.btn1.setObjectName("btn1")
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
- self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
- self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
- self.AuftragsdetailsTable.setColumnCount(5)
- self.AuftragsdetailsTable.setRowCount(1)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(0, 0, item)
- self.label = QtWidgets.QLabel(self.centralwidget)
- self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
- self.label.setObjectName("label")
- self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
- self.textEdit.setObjectName("textEdit")
- self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
- self.bauteilTypBtn.setGeometry(QtCore.QRect(60, 340, 161, 25))
- self.bauteilTypBtn.setObjectName("bauteilTypBtn")
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
- self.bauteiltypTextbox.setGeometry(QtCore.QRect(230, 340, 221, 31))
- self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
- self.label_3 = QtWidgets.QLabel(self.centralwidget)
- self.label_3.setGeometry(QtCore.QRect(250, 320, 181, 20))
- self.label_3.setObjectName("label_3")
- self.label_4 = QtWidgets.QLabel(self.centralwidget)
- self.label_4.setGeometry(QtCore.QRect(520, 320, 67, 17))
- self.label_4.setObjectName("label_4")
- self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit_3.setGeometry(QtCore.QRect(460, 340, 191, 31))
- self.textEdit_3.setObjectName("textEdit_3")
- self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
- self.checkBox.setGeometry(QtCore.QRect(70, 410, 151, 23))
- self.checkBox.setChecked(False)
- self.checkBox.setObjectName("checkBox")
- self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
- self.graphicsView.setGeometry(QtCore.QRect(800, 280, 256, 192))
- self.graphicsView.setObjectName("graphicsView")
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
- self.menubar.setObjectName("menubar")
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
-
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
- self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
- self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
-
-class CameraStreamApp(QtWidgets.QMainWindow):
- def __init__(self, ui):
- super().__init__()
- self.ui = ui
- self.yolo_stream = None # Initialize YOLOv8CameraStream as None
- self.timer = QtCore.QTimer(self)
- self.timer.timeout.connect(self.update_frame)
- self.ui.btn1.clicked.connect(self.start_camera) # start camera if button LoadAuftrag is clicked
- self.scene = QtWidgets.QGraphicsScene(self)
- self.ui.graphicsView.setScene(self.scene)
-
- def start_camera(self):
- # Start the YOLOv8 camera stream (only if not already started)
- if self.yolo_stream is None:
- self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
- # self.yolo_stream.start() # Start the YOLOv8 stream
- self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
-
- def update_frame(self):
- # Update the frame from YOLOv8 stream
- if self.yolo_stream:
- ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
-
- if ret:
- # new part including processing via yolo model
- processed_frame = self.yolo_stream.process_frame(frame)
-
- # Convert the frame from BGR (OpenCV format) to RGB
- # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
- frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB) # might change nomenclature later?
-
- # Convert the frame to QImage
- h, w, ch = frame.shape
- bytes_per_line = ch * w
- qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
-
- # Add the QImage to a QPixmap
- pixmap = QtGui.QPixmap.fromImage(qt_image)
-
- # Get the size of the graphicsView and scale the pixmap to fit
- view_size = self.ui.graphicsView.size()
- scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
-
- # Update the scene with the scaled pixmap
- self.scene.clear()
- self.scene.addPixmap(scaled_pixmap)
-
- def closeEvent(self, event):
- # Release the camera when the application is closed
- if self.yolo_stream is not None:
- self.yolo_stream.cap.release()
- event.accept()
-
-if __name__ == "__main__":
- app = QtWidgets.QApplication(sys.argv)
- MainWindow = QtWidgets.QMainWindow()
- ui = Ui_MainWindow()
- ui.setupUi(MainWindow)
-
- # Initialize the CameraStreamApp with the UI
- camera_app = CameraStreamApp(ui)
-
- MainWindow.show()
- sys.exit(app.exec_())
diff --git a/bjoerntest6.py b/bjoerntest6.py
deleted file mode 100644
index 645fde0..0000000
--- a/bjoerntest6.py
+++ /dev/null
@@ -1,138 +0,0 @@
-from PyQt5 import QtCore, QtGui, QtWidgets
-import cv2
-import sys
-from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1090, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
-
- # Create a vertical layout
- self.layout = QtWidgets.QVBoxLayout(self.centralwidget)
-
- # Add your widgets to the layout
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
- self.AuftragsdetailsTable.setColumnCount(5)
- self.AuftragsdetailsTable.setRowCount(1)
- self.layout.addWidget(self.AuftragsdetailsTable)
-
- self.label = QtWidgets.QLabel(self.centralwidget)
- self.layout.addWidget(self.label)
-
- self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
- self.layout.addWidget(self.textEdit)
-
- self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
- self.layout.addWidget(self.bauteilTypBtn)
-
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
- self.layout.addWidget(self.bauteiltypTextbox)
-
- self.label_3 = QtWidgets.QLabel(self.centralwidget)
- self.layout.addWidget(self.label_3)
-
- self.label_4 = QtWidgets.QLabel(self.centralwidget)
- self.layout.addWidget(self.label_4)
-
- self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
- self.layout.addWidget(self.textEdit_3)
-
- self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
- self.layout.addWidget(self.checkBox)
-
- # Create the QGraphicsView
- self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
- self.layout.addWidget(self.graphicsView)
-
- # Add a button to the layout
- self.btn1 = QtWidgets.QPushButton(self.centralwidget)
- self.layout.addWidget(self.btn1)
-
- # Set the layout for the central widget
- self.centralwidget.setLayout(self.layout)
-
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- MainWindow.setStatusBar(self.statusbar)
-
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
- self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
- self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
-
-class CameraStreamApp(QtWidgets.QMainWindow):
- def __init__(self, ui):
- super().__init__()
- self.ui = ui
- self.yolo_stream = None # Initialize YOLOv8CameraStream as None
- self.timer = QtCore.QTimer(self)
- self.timer.timeout.connect(self.update_frame)
- self.ui.btn1.clicked.connect(self.start_camera) # start camera if button LoadAuftrag is clicked
- self.scene = QtWidgets.QGraphicsScene(self)
- self.ui.graphicsView.setScene(self.scene)
-
- def start_camera(self):
- # Start the YOLOv8 camera stream (only if not already started)
- if self.yolo_stream is None:
- self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
- self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
-
- def update_frame(self):
- # Update the frame from YOLOv8 stream
- if self.yolo_stream:
- ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
-
- if ret:
- # Process frame via YOLO model
- processed_frame = self.yolo_stream.process_frame(frame)
-
- # Convert the frame from BGR (OpenCV format) to RGB
- frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB)
-
- # Convert the frame to QImage
- h, w, ch = frame.shape
- bytes_per_line = ch * w
- qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
-
- # Add the QImage to a QPixmap
- pixmap = QtGui.QPixmap.fromImage(qt_image)
-
- # Get the size of the graphicsView and scale the pixmap to fit
- view_size = self.ui.graphicsView.size()
- scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
-
- # Update the scene with the scaled pixmap
- self.scene.clear()
- self.scene.addPixmap(scaled_pixmap)
-
- def closeEvent(self, event):
- # Release the camera when the application is closed
- if self.yolo_stream is not None:
- self.yolo_stream.cap.release()
- event.accept()
-
-if __name__ == "__main__":
- app = QtWidgets.QApplication(sys.argv)
- MainWindow = QtWidgets.QMainWindow()
- ui = Ui_MainWindow()
- ui.setupUi(MainWindow)
-
- # Initialize the CameraStreamApp with the UI
- camera_app = CameraStreamApp(ui)
-
- MainWindow.show()
- sys.exit(app.exec_())
diff --git a/bjoerntest7.py b/bjoerntest7.py
deleted file mode 100644
index e4e27fa..0000000
--- a/bjoerntest7.py
+++ /dev/null
@@ -1,142 +0,0 @@
-from PyQt5 import QtCore, QtGui, QtWidgets
-import cv2
-import sys
-from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1090, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
-
- # Create a horizontal layout for the main window
- self.layout = QtWidgets.QHBoxLayout(self.centralwidget)
-
- # Left Column (Can be empty or have some widgets)
- self.left_column = QtWidgets.QWidget(self.centralwidget)
- self.left_layout = QtWidgets.QVBoxLayout(self.left_column)
-
- # You can add more widgets to the left column here if needed
- self.label = QtWidgets.QLabel("Left Column (Empty)", self.left_column)
- self.left_layout.addWidget(self.label)
-
- # Add left column widget to the main layout
- self.layout.addWidget(self.left_column)
-
- # Right Column
- self.right_column = QtWidgets.QWidget(self.centralwidget)
- self.right_layout = QtWidgets.QVBoxLayout(self.right_column)
-
- # Add your widgets to the right layout
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.right_column)
- self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
- self.AuftragsdetailsTable.setColumnCount(5)
- self.AuftragsdetailsTable.setRowCount(1)
- self.right_layout.addWidget(self.AuftragsdetailsTable)
-
- self.textEdit = QtWidgets.QTextEdit(self.right_column)
- self.right_layout.addWidget(self.textEdit)
-
- self.bauteilTypBtn = QtWidgets.QPushButton("Bauteiltype erkennen", self.right_column)
- self.right_layout.addWidget(self.bauteilTypBtn)
-
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.right_column)
- self.right_layout.addWidget(self.bauteiltypTextbox)
-
- self.label_3 = QtWidgets.QLabel("Bezeichnung", self.right_column)
- self.right_layout.addWidget(self.label_3)
-
- self.label_4 = QtWidgets.QLabel("Pos.-Nr:", self.right_column)
- self.right_layout.addWidget(self.label_4)
-
- self.textEdit_3 = QtWidgets.QTextEdit(self.right_column)
- self.right_layout.addWidget(self.textEdit_3)
-
- self.checkBox = QtWidgets.QCheckBox("Bauteiltype locked", self.right_column)
- self.right_layout.addWidget(self.checkBox)
-
- # Create the QGraphicsView
- self.graphicsView = QtWidgets.QGraphicsView(self.right_column)
- self.right_layout.addWidget(self.graphicsView)
-
- # Add right column widget to the main layout
- self.layout.addWidget(self.right_column)
-
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- MainWindow.setStatusBar(self.statusbar)
-
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
- # Add more translations as needed
-
-class CameraStreamApp(QtWidgets.QMainWindow):
- def __init__(self, ui):
- super().__init__()
- self.ui = ui
- self.yolo_stream = None # Initialize YOLOv8CameraStream as None
- self.timer = QtCore.QTimer(self)
- self.timer.timeout.connect(self.update_frame)
- self.ui.bauteilTypBtn.clicked.connect(self.start_camera) # Connect the button to start the camera
- self.scene = QtWidgets.QGraphicsScene(self)
- self.ui.graphicsView.setScene(self.scene)
-
- def start_camera(self):
- # Start the YOLOv8 camera stream (only if not already started)
- if self.yolo_stream is None:
- self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
- self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
-
- def update_frame(self):
- # Update the frame from YOLOv8 stream
- if self.yolo_stream:
- ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
-
- if ret:
- # Process frame via YOLO model
- processed_frame = self.yolo_stream.process_frame(frame)
-
- # Convert the frame from BGR (OpenCV format) to RGB
- frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB)
-
- # Convert the frame to QImage
- h, w, ch = frame.shape
- bytes_per_line = ch * w
- qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
-
- # Add the QImage to a QPixmap
- pixmap = QtGui.QPixmap.fromImage(qt_image)
-
- # Get the size of the graphicsView and scale the pixmap to fit
- view_size = self.ui.graphicsView.size()
- scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
-
- # Update the scene with the scaled pixmap
- self.scene.clear()
- self.scene.addPixmap(scaled_pixmap)
-
- def closeEvent(self, event):
- # Release the camera when the application is closed
- if self.yolo_stream is not None:
- self.yolo_stream.cap.release()
- event.accept()
-
-if __name__ == "__main__":
- app = QtWidgets.QApplication(sys.argv)
- MainWindow = QtWidgets.QMainWindow()
- ui = Ui_MainWindow()
- ui.setupUi(MainWindow)
-
- # Initialize the CameraStreamApp with the UI
- camera_app = CameraStreamApp(ui)
-
- MainWindow.show()
- sys.exit(app.exec_())
diff --git a/bjoerntest8.py b/bjoerntest8.py
deleted file mode 100644
index 249c756..0000000
--- a/bjoerntest8.py
+++ /dev/null
@@ -1,159 +0,0 @@
-from PyQt5 import QtCore, QtGui, QtWidgets
-import cv2
-import sys
-from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1090, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.btn1 = QtWidgets.QPushButton(self.centralwidget)
- self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
- self.btn1.setObjectName("btn1")
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
- self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
- self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
- self.AuftragsdetailsTable.setColumnCount(5)
- self.AuftragsdetailsTable.setRowCount(1)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(0, 0, item)
- self.label = QtWidgets.QLabel(self.centralwidget)
- self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
- self.label.setObjectName("label")
- self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
- self.textEdit.setObjectName("textEdit")
- self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
- self.bauteilTypBtn.setGeometry(QtCore.QRect(60, 340, 161, 25))
- self.bauteilTypBtn.setObjectName("bauteilTypBtn")
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
- self.bauteiltypTextbox.setGeometry(QtCore.QRect(230, 340, 221, 31))
- self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
- self.label_3 = QtWidgets.QLabel(self.centralwidget)
- self.label_3.setGeometry(QtCore.QRect(250, 320, 181, 20))
- self.label_3.setObjectName("label_3")
- self.label_4 = QtWidgets.QLabel(self.centralwidget)
- self.label_4.setGeometry(QtCore.QRect(520, 320, 67, 17))
- self.label_4.setObjectName("label_4")
- self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit_3.setGeometry(QtCore.QRect(460, 340, 191, 31))
- self.textEdit_3.setObjectName("textEdit_3")
- self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
- self.checkBox.setGeometry(QtCore.QRect(70, 410, 151, 23))
- self.checkBox.setChecked(False)
- self.checkBox.setObjectName("checkBox")
- self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
- self.graphicsView.setGeometry(QtCore.QRect(1100, 20, int(640*1.2), int(480*1.2))) # position and size of camera frame
- self.graphicsView.setObjectName("graphicsView")
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
- self.menubar.setObjectName("menubar")
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
-
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
- self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
- self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
-
-class CameraStreamApp(QtWidgets.QMainWindow):
- def __init__(self, ui):
- super().__init__()
- self.ui = ui
- self.yolo_stream = None # Initialize YOLOv8CameraStream as None
- self.timer = QtCore.QTimer(self)
- self.timer.timeout.connect(self.update_frame)
- self.ui.btn1.clicked.connect(self.start_camera) # start camera if button LoadAuftrag is clicked
- self.scene = QtWidgets.QGraphicsScene(self)
- self.ui.graphicsView.setScene(self.scene)
-
- def start_camera(self):
- # Start the YOLOv8 camera stream (only if not already started)
- if self.yolo_stream is None:
- self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
- # self.yolo_stream.start() # Start the YOLOv8 stream
- self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
-
- def update_frame(self):
- # Update the frame from YOLOv8 stream
- if self.yolo_stream:
- ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
-
- if ret:
- # new part including processing via yolo model
- processed_frame = self.yolo_stream.process_frame(frame)
-
- # Convert the frame from BGR (OpenCV format) to RGB
- # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
- frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB) # might change nomenclature later?
-
- # Convert the frame to QImage
- h, w, ch = frame.shape
- bytes_per_line = ch * w
- qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
-
- # Add the QImage to a QPixmap
- pixmap = QtGui.QPixmap.fromImage(qt_image)
-
- # Get the size of the graphicsView and scale the pixmap to fit
- view_size = self.ui.graphicsView.size()
- scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
-
- # Update the scene with the scaled pixmap
- self.scene.clear()
- self.scene.addPixmap(scaled_pixmap)
-
- def closeEvent(self, event):
- # Release the camera when the application is closed
- if self.yolo_stream is not None:
- self.yolo_stream.cap.release()
- event.accept()
-
-if __name__ == "__main__":
- app = QtWidgets.QApplication(sys.argv)
- MainWindow = QtWidgets.QMainWindow()
- ui = Ui_MainWindow()
- ui.setupUi(MainWindow)
-
- # Initialize the CameraStreamApp with the UI
- camera_app = CameraStreamApp(ui)
-
- MainWindow.show()
- sys.exit(app.exec_())
diff --git a/bjoerntest9.py b/bjoerntest9.py
deleted file mode 100644
index 3fb7269..0000000
--- a/bjoerntest9.py
+++ /dev/null
@@ -1,910 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file 'test.ui'
-#
-# Created by: PyQt5 UI code generator 5.15.9
-#
-# WARNING: Any manual changes made to this file will be lost when pyuic5 is
-# run again. Do not edit this file unless you know what you are doing.
-
-
-########## beim Static workflow funktionieren die Threads ab dem zweiten nicht mehr
-
-#from PyQt5 import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QProgressBar
-from PyQt5 import QtCore, QtGui, QtWidgets
-from PyQt5.QtWidgets import QApplication, QComboBox
-from PyQt5.QtCore import QTimer, QThread, pyqtSignal, QObject
-from PyQt5.QtGui import QColor
-
-import serial
-import binascii
-import math
-import mariadb
-import time
-import threading
-
-from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
-import cv2
-
-
-db_config = {
- 'user': 'dbUser',
- 'password': 'dbPassword',
- 'host': '127.0.0.1', # 'host': 'localhost',
- 'database': 'projectGeislinger',
- 'port': 3306 # Standard port for MariaDB
-}
-
-# Establishing the connection
-conn = mariadb.connect(**db_config)
-# Create a cursor to execute queries
-cursor = conn.cursor()
-
-# # Konfiguration der seriellen Schnittstelle
-# ser = serial.Serial('/dev/ttyUSB0', 9600)
-
-# Configuration of the serial port
-try:
- ser = serial.Serial('/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0', 9600)
- print("Serial port connected successfully.")
-except serial.SerialException:
- ser = None
- print("Warning: Serial port not found. Continuing without serial connection. Only working for demo-purposes.")
-
-waageEingeschwungen = False
-
-
-def wahrscheinlichkeitsDichte(x,mue, var):
- # in der Funktion wird der Wahrscheinlichkeitsdichtenwert der Variable x für eine bestimmte Normalverteilung berechnet
- standardabweichung = var**0.5
-
- result = 1/(standardabweichung * (2*math.pi)**0.5 ) * math.exp(-0.5 * ((x-mue)/standardabweichung)**2)
-
- return result
-
-def calcWahrscheinlichkeitFromDichte(x,mue, var):
- # in der Funktion wird die Wahrscheinlichkeit via der Wahrscheinlichkeitsdichte berechnet, indem das Verhältnis aus der dem Bauteil zugehörigen Wahrscheinlichkeitsdichte zu der maximalen Wahrscheinlichkeitsdichte berechnet wird
- p1 = wahrscheinlichkeitsDichte(x,mue, var)
- p_max = wahrscheinlichkeitsDichte(mue,mue, var)
-
- return p1/p_max
-
-
-
-#class Worker(QThread):
-class Worker(QObject):
- #progress = pyqtSignal(int)
- objectDetectionStartSignal = pyqtSignal(str)
- objectDetectionFinishedSignal = pyqtSignal(int, object)
-
- checkWaageStartSignal = pyqtSignal(int, int, str)
- checkWaageUpdateSignal = pyqtSignal(int, int)
- checkWaageFinishedSignal = pyqtSignal(int)
-
- waageStoppedSignal = pyqtSignal(int)
- stopLoopSignal = pyqtSignal(bool) #das Signal wird verwendet um direkt den stopLoop-Wert zu ändern (also kein Funktionsaufruf)
-
- stopLoop = False
- btTypeIsSet = False
- correctBtNr = False
-
-
- def __init__(self):
- super(Worker, self).__init__()
- stopLoop = False
-
-
- def getDataOfArticleType(self, allArticles, articleType):
- # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
- for i in allArticles:
- if i[1] == articleType:
- return i
-
- return -1
-
- def waageNichtEingeschwungenOutput(self):
- print("Die Waage ist noch nicht eingeschwungen - Ergebnisse sind dadurch noch fehlerhaft.")
-
- def readWaage(self):
- # in folgender Funktion wird die Waage ausgelesen
-
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
- #print("port to which it is connected: ", ser.portstr) #Debuggingausgabe
-
-
- if ser.is_open == False:
- ser.open()
-
-
- #an die Waage den Befehl senden, dass sie ausgelesen werden soll
- ser.write(b'getWeight\n')
- #ser.write(b'tare\n')
- serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
-
- # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
- lenString = len(serialString)-1
- if serialString[lenString] == "g" and serialString[lenString-1] == "k":
- #print("ist eingeschwungen") #Debuggingausgabe
- waageEingeschwungen = True
- else:
- print("die Waage ist noch nicht eingeschwungen")
- waageEingeschwungen = False
-
- #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
- intString = ""
- for i in serialString:
- if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
- intString = intString + i
- print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
- ## Waage auslesen - ENDE
-
- ser.close()
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
-
- return waageEingeschwungen, intString
-
- def objectTypeDetectionThread(self, auftragsnummer):
- # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
-
- #print("objectTypeDetectionThread - Running in thread:", threading.current_thread().name) #Debuggausgabe
-
- # Parameterdefinition
- propDensVect = []
-
- self.btTypeIsSet = False
-
- while(self.btTypeIsSet == False and self.stopLoop == False):
-
- # Auslesen der Waage
- waageEingeschwungen, intString = self.readWaage()
- if waageEingeschwungen == False:
- self.waageNichtEingeschwungenOutput()
- else:
-
- # Datenbankabfrage
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
- cursor.execute(sql_query)
- auftragEinzelteilDaten = cursor.fetchall()
-
- '''
- # Display data #Debugausgabe
- print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
- for row in auftragEinzelteilDaten:
- print(row)
- '''
-
- # in der Folge werden alle Wahrscheinlichkeitsdichten der Auftragsbauteile berechnet und in dem Vektor gesammelt
- for row in auftragEinzelteilDaten:
- propDensVect.append([wahrscheinlichkeitsDichte(float(intString),float(row[6]), float(row[7])), row[1], row[5]])
-
- # Jenen Eintrag des propDensVect raussuchen, welcher die größte Wahrscheinlichkeitsdichte beinhaltet
- maxpropDens = 0
- einzelteilID = 0
- rowData = None
- for row in propDensVect:
- if row[0] > maxpropDens:
- maxpropDens = row[0]
- einzelteilID = row[1]
- rowData = row
-
- # überprüfen, ob das aufliegende Bauteil in der Auftragstabelle vorhanden ist
- if(einzelteilID == 0):
- print("Es wurde kein Bauteil aus der Auftragsliste (Tabelle) erkannt.")
- else:
- print("Bei dem Bauteil" , einzelteilID , "wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
-
- # Wahrscheinlichkeit berechnen, dass das angegebene Bauteil auch wirklich diesem entspricht
- prop = 0
- for row in auftragEinzelteilDaten:
- if row[1] == einzelteilID:
- prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6]), float(row[7]))
- break
- print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
-
- # den Bool auf true setzen, damit die Schleife beendet wird - dieser wird auf True gesetzt, wenn ein Bauteiltyp erkannt wird
- self.btTypeIsSet = True
-
- if(self.stopLoop == False):
- # ein Signal zurück an den MainThreat senden, mit den Infos/Ergebnissen, der Typenbestimmung
- self.objectDetectionFinishedSignal.emit(einzelteilID, rowData)
- else:
- self.waageStoppedSignal.emit(einzelteilID)
-
- def checkWaageThread(self, einzelteilID, teileZuViel, auftragsnummer):
-
- self.correctBtNr = False
- prevAnzahl = 0
- anzahl = 0
- einzelteilID = einzelteilID
-
- while (self.correctBtNr == False and self.stopLoop == False):
-
- #überprüfen, ob die Waage eingeschwungen ist (und damit korrekte Ergebnisse liefert)
- waageEingeschwungen, intString = self.readWaage()
- if waageEingeschwungen == False:
- self.waageNichtEingeschwungenOutput()
- else:
-
- # Datenbankabfrage - holen der Auftrags- und Bauteilinfos
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
- cursor.execute(sql_query)
- auftragDaten = cursor.fetchall()
-
- '''
- # Display data - zum Debuggen
- print("Ausgabe der Auftragsdetails:")
- print("id|EinzelteilID|Auftragsnummer|Anzahl")
- for row in auftragDaten:
- print(row)
- '''
-
- #auslesen, wie viele Bauteile des Types laut Auftrag vorhanden sein sollen
- anzBauteile_soll = 0
- idVorhanden = False
-
- for row in auftragDaten:
- if row[1] == einzelteilID:
- anzBauteile_soll = row[3]
- idVorhanden = True
-
- if(idVorhanden == False):
- print("Die gewählte Pos.Nr ist nicht in der Auftragsliste (Tabelle) vorhanden.")
- return
-
- # Berechnen der Wahrscheinlichkeitsdichten - der Betrag aller Wahrscheinlichkeitsdichten werden im propDensVect gespeichert
- propDensVect = []
- articleData = self.getDataOfArticleType(auftragDaten, einzelteilID)
- for i in range(1,anzBauteile_soll+teileZuViel+1):
- # Mathematische Sätze, auf welchen die Berechnung basiert:
- # seien X1,..., Xn unabhängige Zufallsvariablen die N(mue_i, sigma_i^2) verteilt sind, dann ist X = X1+...+Xn - N(mue, sigma^2) verteilt mit mue=mue1+...+mue_n, sigma^2 = sigma_1^2+...+sigma_n^2
- mueGes = float(articleData[6])*i # Berechnen des äquivalenten Mittelwert
- varGes = float(articleData[7])*i # Berechnen der äquivalenten Varianz
- propDensVect.append([wahrscheinlichkeitsDichte(float(intString),mueGes, varGes), i])
-
- # durch den propDensVect iterieren und jenen Eintrag mit der höchsten Wahrscheinlichkeitsdichte raussuchen
- maxpropDens = 0
- for row in propDensVect:
- if row[0] > maxpropDens:
- maxpropDens = row[0]
- anzahl = row[1]
-
- # damit nur etwas gemacht wird (zb ein Updatesignal an den Hauptthread zurücksenden), wenn sich die berechnete Anzahl ändert
- if prevAnzahl != anzahl:
- prevAnzahl = anzahl
-
- # Die Wahrscheinlichkeit berechnen, dass das obige Ergebnis auch dem Bauteil entspricht
- if anzahl > 0:
- for row in auftragDaten:
- if row[1] == einzelteilID:
- prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6])*anzahl, float(row[7])*anzahl)
- break
- print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
-
- # wenn genug Bauteile vorhanden sind, dann soll die Schleife beendet werden
- if (anzahl == anzBauteile_soll):
- self.correctBtNr = True
-
- # Konsolenausgabe
- if maxpropDens > 0:
- print("Bei der Anzahl" , anzahl , "des Bauteiltypes", einzelteilID, ",wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
- self.checkWaageUpdateSignal.emit(einzelteilID, anzahl)
-
- else:
- print("Von der ausgewählten Bauteiltype liegt die berechnete Wahrscheinlichkeit bei 0, dass zwischen 0 und", anzBauteile_soll+teileZuViel, "Bauteilen auf der Waage liegen.")
- print("Falls die korrekte Anzhl an Bauteilen auf der Waage liegt, könnte der Fehler in einer falschen Kalibrierung der Waage liegen (TARE).")
-
- if(self.stopLoop == False):
- self.checkWaageFinishedSignal.emit(einzelteilID)
- else:
- self.waageStoppedSignal.emit(einzelteilID)
-
-
-
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- self.auftragsnummer = ""
- self.teileZuViel = 0 # Anzahl an Bauteilen, welche zu viel drinnen sein können - der Parameter kann selbst gesetzt werden #####
- self.correctBtNr = False
- self.btTypeIsSet = False
-
-
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1090, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.btn1 = QtWidgets.QPushButton(self.centralwidget)
- self.btn1.setGeometry(QtCore.QRect(700, 45, 111, 25))
- self.btn1.setObjectName("btn1")
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 300, 661, 192))
- self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
- self.AuftragsdetailsTable.setColumnCount(7)
- self.AuftragsdetailsTable.setRowCount(0)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(5, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(6, item)
-
- self.label = QtWidgets.QLabel(self.centralwidget)
- self.label.setGeometry(QtCore.QRect(500, 20, 121, 17))
- self.label.setObjectName("label")
- self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit.setGeometry(QtCore.QRect(450, 40, 221, 31))
- self.textEdit.setObjectName("textEdit")
- self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
- self.bauteilTypBtn.setGeometry(QtCore.QRect(700, 150, 161, 25))
- self.bauteilTypBtn.setObjectName("bauteilTypBtn")
- self.checkWaageBtn = QtWidgets.QPushButton(self.centralwidget)
- self.checkWaageBtn.setGeometry(QtCore.QRect(700, 460, 161, 25))
- self.checkWaageBtn.setObjectName("checkWaageBtn")
- self.stopLoopBtn = QtWidgets.QPushButton(self.centralwidget)
- self.stopLoopBtn.setGeometry(QtCore.QRect(700, 500, 161, 25))
- self.stopLoopBtn.setObjectName("stopLoopBtn")
- self.waageTareBtn = QtWidgets.QPushButton(self.centralwidget)
- self.waageTareBtn.setGeometry(QtCore.QRect(700, 100, 161, 25))
- self.waageTareBtn.setObjectName("waageTareBtn")
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
- self.bauteiltypTextbox.setGeometry(QtCore.QRect(700, 290, 221, 31))
- self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
- self.BezeichnungLabel = QtWidgets.QLabel(self.centralwidget)
- self.BezeichnungLabel.setGeometry(QtCore.QRect(700, 270, 181, 20))
- self.BezeichnungLabel.setObjectName("BezeichnungLabel")
- self.PosNrLabel = QtWidgets.QLabel(self.centralwidget)
- self.PosNrLabel.setGeometry(QtCore.QRect(700, 200, 67, 17))
- self.PosNrLabel.setObjectName("PosNrLabel")
- self.PosNrTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
- self.PosNrTxtFeld.setGeometry(QtCore.QRect(700, 220, 191, 31))
- self.BezeichnungLabel.setObjectName("BezeichnungLabel")
- self.teileZuVielLabel = QtWidgets.QLabel(self.centralwidget)
- self.teileZuVielLabel.setGeometry(QtCore.QRect(700, 350, 350, 17))
- self.teileZuVielLabel.setObjectName("teileZuVielLabel")
- self.teileZuVielTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
- self.teileZuVielTxtFeld.setGeometry(QtCore.QRect(700, 370, 191, 31))
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
- self.menubar.setObjectName("menubar")
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
- self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
- self.checkBox.setGeometry(QtCore.QRect(700, 10, 151, 23))
- self.checkBox.setObjectName("checkBox")
-
- # button and checkbox for camera workflow + graphicsview widget
- self.startCamBtn = QtWidgets.QPushButton(self.centralwidget)
- self.startCamBtn.setGeometry(QtCore.QRect(900, 45, 161, 25))
- self.startCamBtn.setObjectName("startCamBtn")
- self.stopCamBtn = QtWidgets.QPushButton(self.centralwidget)
- self.stopCamBtn.setGeometry(QtCore.QRect(900, 45+25, 161, 25))
- self.stopCamBtn.setObjectName("stopCamBtn")
- self.camWorkFlowcheckBox = QtWidgets.QCheckBox(self.centralwidget)
- self.camWorkFlowcheckBox.setGeometry(QtCore.QRect(900, 10, 151, 23))
- self.camWorkFlowcheckBox.setObjectName("camWorkFlowcheckBox")
- self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
- self.graphicsView.setGeometry(QtCore.QRect(1100, 20, int(640*1.2), int(480*1.2))) # position and size of camera frame
- self.graphicsView.setObjectName("graphicsView")
-
- #self.myTestLambda = lambda: self.worker.checkWaageStartSignal.emit(einzelteilID, self.teileZuViel, self.auftragsnummer)
-
- '''
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setVerticalHeaderItem(0,item)
- '''
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
- self.btn1.clicked.connect(self.auftragsBtnClicked)
- item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Pos.-Nr"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
- item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
- item.setText(_translate("MainWindow", "Soll-Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
- item.setText(_translate("MainWindow", "Ist-Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(5)
- item.setText(_translate("MainWindow", "Lgort"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(6)
- item.setText(_translate("MainWindow", "set Farbe"))
-
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltyp erkennen"))
- self.bauteilTypBtn.clicked.connect(self.objectTypeDetection)
- self.AuftragsdetailsTable.cellClicked.connect(self.onTableCellClick)
- #self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
- #item = self.AuftragsdetailsTable.verticalHeaderItem(0)
- #item.setText(_translate("MainWindow", "test"))
- self.BezeichnungLabel.setText(_translate("MainWindow", "Bezeichnung"))
- self.PosNrLabel.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.teileZuVielLabel.setText(_translate("MainWindow", "Zu prüfende Teileanzahl über Auftragsanzahl:"))
- self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
- self.checkWaageBtn.setText(_translate("MainWindow", "check Waage"))
- self.checkWaageBtn.clicked.connect(self.checkWaage)
- self.stopLoopBtn.setText(_translate("MainWindow", "stop loop"))
- self.stopLoopBtn.clicked.connect(self.stopLoopClicked)
- self.waageTareBtn.setText(_translate("MainWindow", "Waage tarieren"))
- self.waageTareBtn.clicked.connect(self.onTareClick)
- self.checkBox.setText(_translate("MainWindow", "static workflow"))
- self.checkBox.clicked.connect(self.onCheckboxCheck)
-
- # new camera workflow
- self.startCamBtn.setText(_translate("MainWindow", "Start Camera"))
- # self.startCamBtn.clicked.connect(self.startCamBtnClicked)
- self.stopCamBtn.setText(_translate("MainWindow", "Stop Camera"))
- self.camWorkFlowcheckBox.setText(_translate("MainWindow", "Camera Workflow"))
- # self.camWorkFlowcheckBox.clicked.connect(self.onCheckboxCheck)
-
- def onTareClick(self):
- #Tarieren der Waage
- if ser.is_open == False:
- ser.open()
- ser.write(b'tare\n')
- ser.close()
-
-
- def onCheckboxCheck(self):
- if self.checkBox.isChecked() == True:
- print("static workflow activated")
- else:
- print("static workflow deactivated")
-
- def getRowNr(self, posNr):
- for i in range(0,self.AuftragsdetailsTable.rowCount()):
- if(self.AuftragsdetailsTable.item(i,0).text() == str(posNr)):
- return i
-# brauche ich hier vermutlich nicht mehr - ist in den Worker Thread kopiert worden
- def waageNichtEingeschwungenOutput(self):
- print("Die Waage ist noch nicht eingeschwungen - Ergebnisse sind dadurch noch fehlerhaft.")
-
- def onTableCellClick(self):
- self.PosNrTxtFeld.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),0).text())
- self.bauteiltypTextbox.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),2).text())
-
- def setAuftragsnummer(self):
- self.auftragsnummer = self.textEdit.toPlainText()
- if(not self.auftragsnummer):
- self.auftragsnummer = ""
- self.textEdit.setText("")
-
- def checkAuftragsnummerEmpty(self):
- if self.auftragsnummer == "":
- print("Das Auftragsnummernfeld ist leer.")
- return True
- else:
- return False
-
- def checkPosNrEmpty(self):
- if self.PosNrTxtFeld.toPlainText() == "":
- return True
- else:
- return False
-
-
-# eventuell benötigt man die Funktion hier nicht mehr, da sie zu den Threads kopiert wurde
- def getDataOfArticleType(self, allArticles, articleType):
- # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
- for i in allArticles:
- if i[1] == articleType:
- return i
- return -1
-
- def updateGUI(self):
- self.PosNrLabel.repaint() #GUI aktualisieren
- QApplication.processEvents() #GUI aktualisieren
-
- def setRowColor(self, rowID,r,g,b):
- self.AuftragsdetailsTable.item(rowID, 0).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 1).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 2).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 3).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 4).setBackground(QtGui.QColor(r,g,b))
- self.AuftragsdetailsTable.item(rowID, 5).setBackground(QtGui.QColor(r,g,b))
-
-#wird hier vermutlich nicht mehr benötigt - wurde in die Workerklasse kopiert
- def readWaage(self):
- # in folgender Funktion wird die Waage ausgelesen
-
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
- #print("port to which it is connected: ", ser.portstr) #Debuggingausgabe
- self.checkPosNrEmpty()
-
- if ser.is_open == False:
- ser.open()
-
-
- #an die Waage den Befehl senden, dass sie ausgelesen werden soll
- ser.write(b'getWeight\n')
- #ser.write(b'tare\n')
- serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
-
- # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
- lenString = len(serialString)-1
- if serialString[lenString] == "g" and serialString[lenString-1] == "k":
- #print("ist eingeschwungen") #Debuggingausgabe
- waageEingeschwungen = True
- else:
- print("die Waage ist noch nicht eingeschwungen")
- waageEingeschwungen = False
-
- #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
- intString = ""
- for i in serialString:
- if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
- intString = intString + i
- print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
- ## Waage auslesen - ENDE
-
- ser.close()
- #print("connection is open: ", ser.is_open) #Debuggingausgabe
-
- return waageEingeschwungen, intString
-
- def auftragsBtnClicked(self):
- databaseQueryWorking = False #wird für die Überprüfung, ob die Datenbankabfrage fehlerhaft ist, verwendet
- auftragEinzelteilDaten = []
-
- self.setAuftragsnummer()
- if(not self.checkAuftragsnummerEmpty()):
-
- sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + self.auftragsnummer
- try:
- cursor.execute(sql_query)
- # Fetch results
- auftragEinzelteilDaten = cursor.fetchall()
- databaseQueryWorking = True
- except:
- print("Fehler in der Datenbankabfrage.")
-
-
-
- if databaseQueryWorking==True and len(auftragEinzelteilDaten)>0:
- '''
- # Display data
- print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
- for row in auftragEinzelteilDaten:
- if str(row[2]) == self.auftragsnummer:
- print("passt")
- print(row)
- '''
-
- ### die Auftragsdaten in die Tabelle laden
- self.AuftragsdetailsTable.setRowCount(len(auftragEinzelteilDaten))
- self.item = QtWidgets.QTableWidgetItem()
- counter = 0
- for row in auftragEinzelteilDaten:
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 0, self.item)
- self.item.setText(str(row[1]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 1, self.item)
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 2, self.item)
- self.item.setText(str(row[5]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 3, self.item)
- self.item.setText(str(row[3]))
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 4, self.item)
- self.item.setText(str("0"))
- self.item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(counter, 5, self.item)
- self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
-
- # Dropdown für Farben in die 6. Spalte einfügen
- #self.item = QtWidgets.QTableWidgetItem()
- #self.AuftragsdetailsTable.setItem(counter, 6, self.item)
- combo = QComboBox()
- combo.addItems(["Farbe", "Weiß", "Orange", "Grün"])
- combo.currentIndexChanged.connect(lambda index, rowId =counter: self.change_row_color(rowId, index))
- self.AuftragsdetailsTable.setCellWidget(counter, 6, combo)
- counter = counter +1
-
- elif(databaseQueryWorking==True and len(auftragEinzelteilDaten)==0):
- print("Es wurde in der Datenbank kein Auftrag mit dieser Auftragsnummer gefunden.")
-
- def change_row_color(self, row, color_index):
- if(color_index == 1):
- self.setRowColor(row,255,255,255)
- if(color_index == 2):
- self.setRowColor(row,255,165,0)
- if(color_index == 3):
- self.setRowColor(row,0,255,0)
-
-
-
-
- def stopLoopClicked(self):
- # damit wird beim Klick auf den Stopbutton der stopLoop-boolWert in der Workerklasse auf true gesetzt -> der Stop des Threads wird initiiert
- if hasattr(self, 'objectDetectionWorker'):
- self.objectDetectionWorker.stopLoopSignal.emit(True)
-
- if hasattr(self, 'checkWaageWorker'):
- self.checkWaageWorker.stopLoopSignal.emit(True)
-
- def checkWaage(self):
- #print("Running in thread:", threading.current_thread().name) # Debuggingausgabe
- QApplication.processEvents()
-
- # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
- #self.checkWaageWorker.stopLoopSignal.emit(False)
-
- # überprüfen, ob der Auftrag geladen wurde
- if(self.AuftragsdetailsTable.item(0,0) == None):
- print("Der Auftrag muss zuerst geladen werden.")
- return
-
- # überprüfen, ob ein Bauteiltyp gesetzt wurde
- if(self.checkPosNrEmpty()==True and self.checkBox.isChecked() == False):
- print("Das Pos.-Nr.-Feld ist leer.")
- return
-
- # den GUI Wert von Textfeld TeileZuViel in die Variable schreiben
- self.teileZuViel = int(float(self.teileZuVielTxtFeld.toPlainText()))
- self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
-
- einzelteilID = -1 # Initialisieren der Variable mit einem Defaultwert, welcher nie eingenommen werden können sollte
- if (self.checkBox.isChecked() == False):
- #übernehmen der BauteilID aus dem Feld Pos.-Nr - wenn der Workflow dynamisch gewählt wurde
- einzelteilID = int(self.PosNrTxtFeld.toPlainText())
- else:
- # wenn der Workflow statisch gesetzt wurde, dann soll das erste Item aus der Auftragsliste geladen werden, von welchem noch nicht genug Bauteile auf der Waage liegen
- for i in range(0,self.AuftragsdetailsTable.rowCount()):
- if self.AuftragsdetailsTable.item(i,3).text() != self.AuftragsdetailsTable.item(i,4).text():
- einzelteilID = int(self.AuftragsdetailsTable.item(i,0).text())
- self.PosNrTxtFeld.setText(str(self.AuftragsdetailsTable.item(i,0).text()))
- self.bauteiltypTextbox.setText(str(self.AuftragsdetailsTable.item(i,2).text()))
- break
-
- if einzelteilID == -1:
- # den Thread beenden
- self.checkWaageThread.quit()
- self.checkWaageThread.wait()
- try:
- self.checkWaageThread.started.disconnect() # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
- print("Der Thread wurde beendet.")
- except:
- print("Disconnecting the thread did not work.")
- return
-
-
- #zum setzen den Farbe der gesamten Reihe auf Orange
- self.setRowColor(self.getRowNr(einzelteilID),255,165,0)
-
- # den Thread starten, welcher die Bauteilanzahl überprüft
- self.checkWaageWorker = Worker()
- self.checkWaageThread = QThread()
-
- self.checkWaageWorker.moveToThread(self.checkWaageThread)
-
- self.checkWaageWorker.checkWaageStartSignal.connect(self.checkWaageWorker.checkWaageThread)
- self.checkWaageWorker.checkWaageUpdateSignal.connect(self.checkWaageUpdate)
- self.checkWaageWorker.checkWaageFinishedSignal.connect(self.checkWaageFinished)
- self.checkWaageWorker.waageStoppedSignal.connect(self.threadStopped)
- self.checkWaageWorker.stopLoopSignal.connect(lambda status: setattr(self.checkWaageWorker, 'stopLoop', status)) #wird fürs aktive Stoppen des Threads benötigt
-
- self.checkWaageThread.started.connect(lambda: self.checkWaageWorker.checkWaageStartSignal.emit(einzelteilID, self.teileZuViel, self.auftragsnummer))
- self.checkWaageThread.start()
-
- def checkWaageUpdate(self, einzelteilID, anzahl):
- # die Funktion updated die (vom Thread) berechnete Bauteilanzahl in der GUI
- self.AuftragsdetailsTable.item(self.getRowNr(einzelteilID), 4).setText(str(anzahl)) # in die Tabelle die Anzahl an berechneten Bauteilen reinschreiben
-
- def checkWaageFinished(self, einzelteilID):
- self.setRowColor(self.getRowNr(einzelteilID),0,255,0) #zum setzen den Farbe der gesamten Reihe auf Grün
-
- # den Thread beenden
- self.checkWaageThread.quit()
- self.checkWaageThread.wait()
-
- # auch wenn die Länge der Liste überschritten wurde
- # wenn der statische Workflow aktiviert ist, dann soll die checkwaage-funktion erneut aufgerufen werden
- if(self.checkBox.isChecked() == True):
- self.checkWaage()
-
- # GUI updaten
- #self.updateGUI()
-
- def objectTypeDetection(self):
- # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
-
- # wenn der statische Workflow ausgewählt wurde, dann soll die checkWaage Funktion aufgerufen werden, auch wenn die detectBauteiltyp-Funkion aufgerufen wurde
- if self.checkBox.isChecked() == True:
- self.checkWaage()
- return
-
- '''
- if(self.checkPosNrEmpty()==True):
- print("Das Pos.-Nr.-Feld ist leer.")
- return
- '''
-
- # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
- #self.objectDetectionWorker.stopLoopSignal.emit(False)
-
- # überprüfen, ob der Auftrag in die Tabelle geladen wurde
- if(self.AuftragsdetailsTable.item(0,0) == None):
- print("Der Auftrag muss zuerst geladen werden.")
- return
-
- # speichert den Wert, welcher im Textfeld steht in Variablen im Code
- self.setAuftragsnummer()
-
- # starten des Threats, welcher den Bauteiltyp zurück gibt
- self.objectDetectionWorker = Worker()
- self.objectDetectionThread = QThread()
-
- self.objectDetectionWorker.moveToThread(self.objectDetectionThread)
-
- self.objectDetectionWorker.objectDetectionStartSignal.connect(self.objectDetectionWorker.objectTypeDetectionThread)
- self.objectDetectionWorker.objectDetectionFinishedSignal.connect(self.objectTypeDetectionFinished)
- self.objectDetectionWorker.waageStoppedSignal.connect(self.threadStopped)
- self.objectDetectionWorker.stopLoopSignal.connect(lambda status: setattr(self.objectDetectionWorker, 'stopLoop', status)) #wird fürs aktive Stoppen des Threads benötigt
-
- self.objectDetectionThread.started.connect(lambda: self.objectDetectionWorker.objectDetectionStartSignal.emit(self.auftragsnummer))
- self.objectDetectionThread.start()
-
- def objectTypeDetectionFinished(self, einzelteilID, rowData):
- # wenn der Typ des Objektes erkannt wurde, dann soll die Funktion aufgerufen werden
-
- # Schreiben der Bauteiltype und Pos.-Nr in die jeweiligen Felder
- self.PosNrTxtFeld.setText(str(rowData[1]))
- self.bauteiltypTextbox.setText(rowData[2])
-
- # setzt den Boolean, um aus der Schleife raus zu gehen
- self.btTypeIsSet = True
-
- #zum setzen den Farbe der gesamten Reihe auf Orange
- self.setRowColor(self.getRowNr(einzelteilID),255,165,0)
-
- # den Thread beenden
- self.objectDetectionThread.quit()
- self.objectDetectionThread.wait()
-
- '''
- try:
- self.objectDetectionThread.started.disconnect() # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
- except:
- print(f"Error while disconnecting: {e}")
- print("Disconnecting the thread did not work.")
- '''
-
- # wenn der Bauteiltyp erkannt wurde, dann soll die GUI aktualisiert werden und anschließend die CheckWaage-Funktion aufgerufen werden
- self.updateGUI()
- self.checkWaage()
-
- def threadStopped(self, einzelteilID):
- # wenn kein Bauteil erkannt wurde, dann ist die EinzenteilID = 0
- if(einzelteilID > 0):
- self.setRowColor(self.getRowNr(einzelteilID),255,255,255) #zum setzen den Farbe der gesamten Reihe auf Weiß
-
- # den Thread beenden
- if hasattr(self, 'objectDetectionThread'):
- self.objectDetectionThread.quit()
- self.objectDetectionThread.wait()
- print("Der ObjektDetection-Thread wurde beendet.")
-
- if hasattr(self, 'checkWaageThread'):
- self.checkWaageThread.quit()
- self.checkWaageThread.wait()
- print("Der CheckWaage-Thread wurde beendet.")
-
-# new class for Camera Object detection with YOLOv8
-class CameraStreamApp(QtWidgets.QMainWindow):
- def __init__(self, ui):
- super().__init__()
- self.ui = ui
- self.yolo_stream = None # Initialize YOLOv8CameraStream as None
- self.timer = QtCore.QTimer(self)
- self.timer.timeout.connect(self.update_frame)
- self.ui.startCamBtn.clicked.connect(self.start_camera) # start camera if button LoadAuftrag is clicked
- self.scene = QtWidgets.QGraphicsScene(self)
- self.ui.graphicsView.setScene(self.scene)
-
- def start_camera(self):
- # Start the YOLOv8 camera stream (only if not already started)
- if self.yolo_stream is None:
- self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
- # self.yolo_stream.start() # Start the YOLOv8 stream
- self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
-
- def update_frame(self):
- # Update the frame from YOLOv8 stream
- if self.yolo_stream:
- ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
-
- if ret:
- # new part including processing via yolo model
- processed_frame = self.yolo_stream.process_frame(frame)
-
- # Convert the frame from BGR (OpenCV format) to RGB
- # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
- frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB) # might change nomenclature later?
-
- # Convert the frame to QImage
- h, w, ch = frame.shape
- bytes_per_line = ch * w
- qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
-
- # Add the QImage to a QPixmap
- pixmap = QtGui.QPixmap.fromImage(qt_image)
-
- # Get the size of the graphicsView and scale the pixmap to fit
- view_size = self.ui.graphicsView.size()
- scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
-
- # Update the scene with the scaled pixmap
- self.scene.clear()
- self.scene.addPixmap(scaled_pixmap)
-
- def closeEvent(self, event):
- # Release the camera when the application is closed
- if self.yolo_stream is not None:
- self.yolo_stream.cap.release()
- event.accept()
-
-
-
-if __name__ == "__main__":
- import sys
- app = QtWidgets.QApplication(sys.argv)
- MainWindow = QtWidgets.QMainWindow()
- ui = Ui_MainWindow()
- ui.setupUi(MainWindow)
-
- # Initialize the CameraStreamApp with the UI
- camera_app = CameraStreamApp(ui)
-
- MainWindow.show()
- sys.exit(app.exec_())
-
-
-
-
-
diff --git a/untitled/.gitignore b/pyqt_project/.gitignore
similarity index 100%
rename from untitled/.gitignore
rename to pyqt_project/.gitignore
diff --git a/untitled/build/Desktop-Debug/.qmake.stash b/pyqt_project/build/Desktop-Debug/.qmake.stash
similarity index 100%
rename from untitled/build/Desktop-Debug/.qmake.stash
rename to pyqt_project/build/Desktop-Debug/.qmake.stash
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/FILE.h.79AEFC497861DFC5.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/FILE.h.79AEFC497861DFC5.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/FILE.h.79AEFC497861DFC5.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/FILE.h.79AEFC497861DFC5.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QApplication.A474B06CEF58703F.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QApplication.A474B06CEF58703F.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QApplication.A474B06CEF58703F.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QApplication.A474B06CEF58703F.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QLocale.01F1E8743C4251DF.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QLocale.01F1E8743C4251DF.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QLocale.01F1E8743C4251DF.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QLocale.01F1E8743C4251DF.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QMainWindow.78DB6FD40CBCC891.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QMainWindow.78DB6FD40CBCC891.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QMainWindow.78DB6FD40CBCC891.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QMainWindow.78DB6FD40CBCC891.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QTranslator.BF3534267250AC30.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QTranslator.BF3534267250AC30.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QTranslator.BF3534267250AC30.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QTranslator.BF3534267250AC30.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__FILE.h.3324F85E382E036A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__FILE.h.3324F85E382E036A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__FILE.h.3324F85E382E036A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__FILE.h.3324F85E382E036A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos64_t.h.23C43F442076149A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos64_t.h.23C43F442076149A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos64_t.h.23C43F442076149A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos64_t.h.23C43F442076149A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos_t.h.ECFBE9EEDAAB6648.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos_t.h.ECFBE9EEDAAB6648.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos_t.h.ECFBE9EEDAAB6648.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos_t.h.ECFBE9EEDAAB6648.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__locale_t.h.40EA38A2DCA58618.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__locale_t.h.40EA38A2DCA58618.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__locale_t.h.40EA38A2DCA58618.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__locale_t.h.40EA38A2DCA58618.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__mbstate_t.h.6C32CF66236653D7.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__mbstate_t.h.6C32CF66236653D7.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__mbstate_t.h.6C32CF66236653D7.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__mbstate_t.h.6C32CF66236653D7.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__sigset_t.h.72131E8056C7E284.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__sigset_t.h.72131E8056C7E284.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__sigset_t.h.72131E8056C7E284.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__sigset_t.h.72131E8056C7E284.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___gnuc_va_list.h.957EE2B4DB6A5247.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___gnuc_va_list.h.957EE2B4DB6A5247.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___gnuc_va_list.h.957EE2B4DB6A5247.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___gnuc_va_list.h.957EE2B4DB6A5247.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___va_copy.h.11ED534E7AF4A856.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___va_copy.h.11ED534E7AF4A856.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___va_copy.h.11ED534E7AF4A856.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___va_copy.h.11ED534E7AF4A856.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_arg.h.C38675C0D160CE4C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_arg.h.C38675C0D160CE4C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_arg.h.C38675C0D160CE4C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_arg.h.C38675C0D160CE4C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_copy.h.5812F997B3F780A9.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_copy.h.5812F997B3F780A9.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_copy.h.5812F997B3F780A9.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_copy.h.5812F997B3F780A9.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_list.h.A20C0FFDA235CCCC.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_list.h.A20C0FFDA235CCCC.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_list.h.A20C0FFDA235CCCC.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_list.h.A20C0FFDA235CCCC.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_max_align_t.h.9A696B9ACA5AF69C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_max_align_t.h.9A696B9ACA5AF69C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_max_align_t.h.9A696B9ACA5AF69C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_max_align_t.h.9A696B9ACA5AF69C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_null.h.46DACB2AE1FCBB57.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_null.h.46DACB2AE1FCBB57.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_null.h.46DACB2AE1FCBB57.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_null.h.46DACB2AE1FCBB57.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_nullptr_t.h.BB76DF7F0265238C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_nullptr_t.h.BB76DF7F0265238C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_nullptr_t.h.BB76DF7F0265238C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_nullptr_t.h.BB76DF7F0265238C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_offsetof.h.F032B8137362A473.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_offsetof.h.F032B8137362A473.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_offsetof.h.F032B8137362A473.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_offsetof.h.F032B8137362A473.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_ptrdiff_t.h.244B2A4B8AE5E0B4.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_ptrdiff_t.h.244B2A4B8AE5E0B4.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_ptrdiff_t.h.244B2A4B8AE5E0B4.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_ptrdiff_t.h.244B2A4B8AE5E0B4.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_size_t.h.747ED4A2DA41774B.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_size_t.h.747ED4A2DA41774B.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_size_t.h.747ED4A2DA41774B.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_size_t.h.747ED4A2DA41774B.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_wchar_t.h.E89E65F6312D18C8.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_wchar_t.h.E89E65F6312D18C8.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_wchar_t.h.E89E65F6312D18C8.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_wchar_t.h.E89E65F6312D18C8.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithm.4283CE8E04B88D2A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithm.4283CE8E04B88D2A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithm.4283CE8E04B88D2A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithm.4283CE8E04B88D2A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithmfwd.h.B52ADC7A074104CF.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithmfwd.h.B52ADC7A074104CF.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithmfwd.h.B52ADC7A074104CF.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithmfwd.h.B52ADC7A074104CF.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/align.h.80C2512B8F842646.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/align.h.80C2512B8F842646.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/align.h.80C2512B8F842646.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/align.h.80C2512B8F842646.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/aligned_buffer.h.A18F22CAB29234EA.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/aligned_buffer.h.A18F22CAB29234EA.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/aligned_buffer.h.A18F22CAB29234EA.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/aligned_buffer.h.A18F22CAB29234EA.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.5CF5F0A69C036EAA.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.5CF5F0A69C036EAA.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.5CF5F0A69C036EAA.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.5CF5F0A69C036EAA.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.72E7C35C664767C1.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.72E7C35C664767C1.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.72E7C35C664767C1.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.72E7C35C664767C1.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloca.h.793370BF9878CFB6.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloca.h.793370BF9878CFB6.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloca.h.793370BF9878CFB6.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloca.h.793370BF9878CFB6.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocated_ptr.h.8214ECF4C56E78C2.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocated_ptr.h.8214ECF4C56E78C2.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocated_ptr.h.8214ECF4C56E78C2.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocated_ptr.h.8214ECF4C56E78C2.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocator.h.D31E7B8BEFD5AE94.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocator.h.D31E7B8BEFD5AE94.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocator.h.D31E7B8BEFD5AE94.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocator.h.D31E7B8BEFD5AE94.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/array.184FFFD3B962987A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/array.184FFFD3B962987A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/array.184FFFD3B962987A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/array.184FFFD3B962987A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assert.h.9895EEC17E1D2A2B.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assert.h.9895EEC17E1D2A2B.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assert.h.9895EEC17E1D2A2B.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assert.h.9895EEC17E1D2A2B.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assertions.h.266799074BAB8854.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assertions.h.266799074BAB8854.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assertions.h.266799074BAB8854.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assertions.h.266799074BAB8854.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic.46821F82D327FD81.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic.46821F82D327FD81.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic.46821F82D327FD81.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic.46821F82D327FD81.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_base.h.9272BFEE4EE55D68.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_base.h.9272BFEE4EE55D68.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_base.h.9272BFEE4EE55D68.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_base.h.9272BFEE4EE55D68.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_lockfree_defines.h.2A0580E3C1CF977D.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_lockfree_defines.h.2A0580E3C1CF977D.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_lockfree_defines.h.2A0580E3C1CF977D.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_lockfree_defines.h.2A0580E3C1CF977D.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_wide_counter.h.397D66B6BECC0AA2.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_wide_counter.h.397D66B6BECC0AA2.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_wide_counter.h.397D66B6BECC0AA2.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_wide_counter.h.397D66B6BECC0AA2.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_word.h.0B7FB187C2532DE8.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_word.h.0B7FB187C2532DE8.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_word.h.0B7FB187C2532DE8.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_word.h.0B7FB187C2532DE8.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomicity.h.D4655A6FAF2C5588.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomicity.h.D4655A6FAF2C5588.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomicity.h.D4655A6FAF2C5588.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomicity.h.D4655A6FAF2C5588.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/auto_ptr.h.D1AF7143391B211D.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/auto_ptr.h.D1AF7143391B211D.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/auto_ptr.h.D1AF7143391B211D.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/auto_ptr.h.D1AF7143391B211D.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.h.636F8FA9AD80474A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.h.636F8FA9AD80474A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.h.636F8FA9AD80474A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.h.636F8FA9AD80474A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.tcc.2D0C76EB3099AFF8.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.tcc.2D0C76EB3099AFF8.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.tcc.2D0C76EB3099AFF8.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.tcc.2D0C76EB3099AFF8.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/binders.h.C589B2454DC21565.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/binders.h.C589B2454DC21565.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/binders.h.C589B2454DC21565.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/binders.h.C589B2454DC21565.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/bit.E77EA5629EB3D467.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/bit.E77EA5629EB3D467.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/bit.E77EA5629EB3D467.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/bit.E77EA5629EB3D467.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/byteswap.h.E57FF553A16DFAFC.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/byteswap.h.E57FF553A16DFAFC.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/byteswap.h.E57FF553A16DFAFC.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/byteswap.h.E57FF553A16DFAFC.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++allocator.h.20AC450864A96F4F.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++allocator.h.20AC450864A96F4F.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++allocator.h.20AC450864A96F4F.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++allocator.h.20AC450864A96F4F.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++config.h.BF2F33665D7EB4A5.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++config.h.BF2F33665D7EB4A5.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++config.h.BF2F33665D7EB4A5.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++config.h.BF2F33665D7EB4A5.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++locale.h.53918663E9B050A1.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++locale.h.53918663E9B050A1.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++locale.h.53918663E9B050A1.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++locale.h.53918663E9B050A1.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cctype.7A2E5B928BCF3845.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cctype.7A2E5B928BCF3845.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cctype.7A2E5B928BCF3845.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cctype.7A2E5B928BCF3845.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cdefs.h.E4D450DF98C1338F.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cdefs.h.E4D450DF98C1338F.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cdefs.h.E4D450DF98C1338F.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cdefs.h.E4D450DF98C1338F.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cerrno.B65C14291DEB12F2.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cerrno.B65C14291DEB12F2.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cerrno.B65C14291DEB12F2.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cerrno.B65C14291DEB12F2.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/char_traits.h.263114DAEE0F7CAC.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/char_traits.h.263114DAEE0F7CAC.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/char_traits.h.263114DAEE0F7CAC.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/char_traits.h.263114DAEE0F7CAC.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/charconv.h.45DC5854263DB0A4.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/charconv.h.45DC5854263DB0A4.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/charconv.h.45DC5854263DB0A4.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/charconv.h.45DC5854263DB0A4.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.F95978433952CB73.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.F95978433952CB73.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.F95978433952CB73.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.F95978433952CB73.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.h.E832445DA3CBDA93.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.h.E832445DA3CBDA93.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.h.E832445DA3CBDA93.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.h.E832445DA3CBDA93.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clocale.8BFEF3D6DA37B94B.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clocale.8BFEF3D6DA37B94B.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clocale.8BFEF3D6DA37B94B.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clocale.8BFEF3D6DA37B94B.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clock_t.h.65AFE5BA7329BCD4.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clock_t.h.65AFE5BA7329BCD4.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clock_t.h.65AFE5BA7329BCD4.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clock_t.h.65AFE5BA7329BCD4.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clockid_t.h.5545878511E5BAF1.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clockid_t.h.5545878511E5BAF1.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clockid_t.h.5545878511E5BAF1.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clockid_t.h.5545878511E5BAF1.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/compare.EDA7854AE5DA59D4.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/compare.EDA7854AE5DA59D4.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/compare.EDA7854AE5DA59D4.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/compare.EDA7854AE5DA59D4.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concept_check.h.39429B249CB86886.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concept_check.h.39429B249CB86886.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concept_check.h.39429B249CB86886.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concept_check.h.39429B249CB86886.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concurrence.h.368FF763D62F871B.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concurrence.h.368FF763D62F871B.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concurrence.h.368FF763D62F871B.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concurrence.h.368FF763D62F871B.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cookie_io_functions_t.h.5A08066DC7F05542.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cookie_io_functions_t.h.5A08066DC7F05542.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cookie_io_functions_t.h.5A08066DC7F05542.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cookie_io_functions_t.h.5A08066DC7F05542.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpp_type_traits.h.D80F5D0FD57269EA.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpp_type_traits.h.D80F5D0FD57269EA.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpp_type_traits.h.D80F5D0FD57269EA.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpp_type_traits.h.D80F5D0FD57269EA.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu-set.h.B40F3E2869BE4FF9.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu-set.h.B40F3E2869BE4FF9.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu-set.h.B40F3E2869BE4FF9.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu-set.h.B40F3E2869BE4FF9.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu_defines.h.4E18A129B41E38AC.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu_defines.h.4E18A129B41E38AC.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu_defines.h.4E18A129B41E38AC.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu_defines.h.4E18A129B41E38AC.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstddef.06546D6D9FEED08D.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstddef.06546D6D9FEED08D.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstddef.06546D6D9FEED08D.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstddef.06546D6D9FEED08D.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdint.91EF72212746155E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdint.91EF72212746155E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdint.91EF72212746155E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdint.91EF72212746155E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdio.E3D7014BBC7C7170.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdio.E3D7014BBC7C7170.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdio.E3D7014BBC7C7170.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdio.E3D7014BBC7C7170.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdlib.73317090CF3984CF.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdlib.73317090CF3984CF.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdlib.73317090CF3984CF.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdlib.73317090CF3984CF.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctime.FD7CD791ADF7455F.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctime.FD7CD791ADF7455F.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctime.FD7CD791ADF7455F.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctime.FD7CD791ADF7455F.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctype.h.B268CEA0CECCFC59.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctype.h.B268CEA0CECCFC59.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctype.h.B268CEA0CECCFC59.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctype.h.B268CEA0CECCFC59.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cwchar.415F3E4D1314A235.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cwchar.415F3E4D1314A235.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cwchar.415F3E4D1314A235.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cwchar.415F3E4D1314A235.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_forced.h.260618EE85312CAA.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_forced.h.260618EE85312CAA.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_forced.h.260618EE85312CAA.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_forced.h.260618EE85312CAA.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_init_exception.h.CA78BEA70589FE17.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_init_exception.h.CA78BEA70589FE17.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_init_exception.h.CA78BEA70589FE17.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_init_exception.h.CA78BEA70589FE17.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/debug.h.E107AF16C7F0CBAA.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/debug.h.E107AF16C7F0CBAA.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/debug.h.E107AF16C7F0CBAA.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/debug.h.E107AF16C7F0CBAA.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/enable_special_members.h.D0E1B0D83298787A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/enable_special_members.h.D0E1B0D83298787A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/enable_special_members.h.D0E1B0D83298787A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/enable_special_members.h.D0E1B0D83298787A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.1FC6A4D6D2846204.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.1FC6A4D6D2846204.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.1FC6A4D6D2846204.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.1FC6A4D6D2846204.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.20F8E286A486EE09.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.20F8E286A486EE09.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.20F8E286A486EE09.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.20F8E286A486EE09.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endianness.h.F2D2CC6251A4EAFA.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endianness.h.F2D2CC6251A4EAFA.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endianness.h.F2D2CC6251A4EAFA.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endianness.h.F2D2CC6251A4EAFA.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/erase_if.h.52AC17D898D2345C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/erase_if.h.52AC17D898D2345C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/erase_if.h.52AC17D898D2345C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/erase_if.h.52AC17D898D2345C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno-base.h.23FC55A99C73A727.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno-base.h.23FC55A99C73A727.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno-base.h.23FC55A99C73A727.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno-base.h.23FC55A99C73A727.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.063064A523A47758.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.063064A523A47758.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.063064A523A47758.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.063064A523A47758.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.10013861918E601A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.10013861918E601A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.10013861918E601A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.10013861918E601A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.19BCCCD58DA5623E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.19BCCCD58DA5623E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.19BCCCD58DA5623E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.19BCCCD58DA5623E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.33F6986A3C61A3BF.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.33F6986A3C61A3BF.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.33F6986A3C61A3BF.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.33F6986A3C61A3BF.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.3F8ECD84FB880B64.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.3F8ECD84FB880B64.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.3F8ECD84FB880B64.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.3F8ECD84FB880B64.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_constants.h.FAB62781508B6283.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_constants.h.FAB62781508B6283.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_constants.h.FAB62781508B6283.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_constants.h.FAB62781508B6283.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_t.h.58D3895A591B592D.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_t.h.58D3895A591B592D.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_t.h.58D3895A591B592D.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_t.h.58D3895A591B592D.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.9BD9E09A0A7198C6.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.9BD9E09A0A7198C6.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.9BD9E09A0A7198C6.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.9BD9E09A0A7198C6.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.h.60232BC787A23EFB.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.h.60232BC787A23EFB.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.h.60232BC787A23EFB.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.h.60232BC787A23EFB.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_defines.h.E3E83F3521CDDF95.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_defines.h.E3E83F3521CDDF95.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_defines.h.E3E83F3521CDDF95.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_defines.h.E3E83F3521CDDF95.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_ptr.h.A3D4E42C18D066BB.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_ptr.h.A3D4E42C18D066BB.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_ptr.h.A3D4E42C18D066BB.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_ptr.h.A3D4E42C18D066BB.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/execution_defs.h.EA0BF88CD36110B9.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/execution_defs.h.EA0BF88CD36110B9.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/execution_defs.h.EA0BF88CD36110B9.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/execution_defs.h.EA0BF88CD36110B9.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features-time64.h.BFBA8D3CA0316037.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features-time64.h.BFBA8D3CA0316037.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features-time64.h.BFBA8D3CA0316037.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features-time64.h.BFBA8D3CA0316037.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features.h.5A4ED7C80201A723.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features.h.5A4ED7C80201A723.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features.h.5A4ED7C80201A723.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features.h.5A4ED7C80201A723.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn-common.h.0FE8C4DDCB84E088.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn-common.h.0FE8C4DDCB84E088.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn-common.h.0FE8C4DDCB84E088.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn-common.h.0FE8C4DDCB84E088.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn.h.DA21C738CC1B6ABF.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn.h.DA21C738CC1B6ABF.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn.h.DA21C738CC1B6ABF.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn.h.DA21C738CC1B6ABF.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functexcept.h.206192DEF17B89F8.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functexcept.h.206192DEF17B89F8.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functexcept.h.206192DEF17B89F8.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functexcept.h.206192DEF17B89F8.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional.1ABC5CEB1A730878.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional.1ABC5CEB1A730878.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional.1ABC5CEB1A730878.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional.1ABC5CEB1A730878.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional_hash.h.1DDE07C659671E5C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional_hash.h.1DDE07C659671E5C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional_hash.h.1DDE07C659671E5C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional_hash.h.1DDE07C659671E5C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_algorithm_defs.h.400B86BACA15F86C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_algorithm_defs.h.400B86BACA15F86C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_algorithm_defs.h.400B86BACA15F86C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_algorithm_defs.h.400B86BACA15F86C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_memory_defs.h.29B5F90E12B4C61C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_memory_defs.h.29B5F90E12B4C61C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_memory_defs.h.29B5F90E12B4C61C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_memory_defs.h.29B5F90E12B4C61C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_numeric_defs.h.6191E3EBAF802F7C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_numeric_defs.h.6191E3EBAF802F7C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_numeric_defs.h.6191E3EBAF802F7C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_numeric_defs.h.6191E3EBAF802F7C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr-default.h.7F136A8E758182CE.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr-default.h.7F136A8E758182CE.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr-default.h.7F136A8E758182CE.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr-default.h.7F136A8E758182CE.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr.h.70C66586E0E99D6D.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr.h.70C66586E0E99D6D.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr.h.70C66586E0E99D6D.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr.h.70C66586E0E99D6D.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hash_bytes.h.878C140FA90D5822.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hash_bytes.h.878C140FA90D5822.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hash_bytes.h.878C140FA90D5822.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hash_bytes.h.878C140FA90D5822.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable.h.44D7678B598CA27C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable.h.44D7678B598CA27C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable.h.44D7678B598CA27C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable.h.44D7678B598CA27C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable_policy.h.02AE91A05F6E02C7.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable_policy.h.02AE91A05F6E02C7.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable_policy.h.02AE91A05F6E02C7.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable_policy.h.02AE91A05F6E02C7.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/initializer_list.AFC06A41CFC1543D.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/initializer_list.AFC06A41CFC1543D.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/initializer_list.AFC06A41CFC1543D.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/initializer_list.AFC06A41CFC1543D.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/invoke.h.2B1ACA2407CB05E3.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/invoke.h.2B1ACA2407CB05E3.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/invoke.h.2B1ACA2407CB05E3.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/invoke.h.2B1ACA2407CB05E3.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ios_base.h.0442D829AE4A2428.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ios_base.h.0442D829AE4A2428.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ios_base.h.0442D829AE4A2428.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ios_base.h.0442D829AE4A2428.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iosfwd.163CBDA627BDB3A3.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iosfwd.163CBDA627BDB3A3.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iosfwd.163CBDA627BDB3A3.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iosfwd.163CBDA627BDB3A3.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iterator.1BD365EA5EDE5210.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iterator.1BD365EA5EDE5210.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iterator.1BD365EA5EDE5210.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iterator.1BD365EA5EDE5210.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/libc-header-start.h.E88219B53B0B0BF5.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/libc-header-start.h.E88219B53B0B0BF5.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/libc-header-start.h.E88219B53B0B0BF5.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/libc-header-start.h.E88219B53B0B0BF5.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.507F66A5F268FCAA.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.507F66A5F268FCAA.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.507F66A5F268FCAA.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.507F66A5F268FCAA.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1DFE7D0FE6434B13.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1DFE7D0FE6434B13.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1DFE7D0FE6434B13.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1DFE7D0FE6434B13.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1E7D7771EC751FFB.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1E7D7771EC751FFB.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1E7D7771EC751FFB.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1E7D7771EC751FFB.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.C293B8934AC926BB.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.C293B8934AC926BB.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.C293B8934AC926BB.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.C293B8934AC926BB.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.7909E1D6E2B739A0.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.7909E1D6E2B739A0.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.7909E1D6E2B739A0.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.7909E1D6E2B739A0.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.tcc.FF41A54BBD49B033.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.tcc.FF41A54BBD49B033.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.tcc.FF41A54BBD49B033.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.tcc.FF41A54BBD49B033.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/local_lim.h.2CFD657F256B117E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/local_lim.h.2CFD657F256B117E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/local_lim.h.2CFD657F256B117E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/local_lim.h.2CFD657F256B117E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.E3C63D05A4E78516.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.E3C63D05A4E78516.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.E3C63D05A4E78516.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.E3C63D05A4E78516.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.F1B51844858762D2.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.F1B51844858762D2.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.F1B51844858762D2.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.F1B51844858762D2.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.h.03600D2B458E75FA.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.h.03600D2B458E75FA.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.h.03600D2B458E75FA.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.h.03600D2B458E75FA.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.tcc.69A59E265193CBC8.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.tcc.69A59E265193CBC8.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.tcc.69A59E265193CBC8.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.tcc.69A59E265193CBC8.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_t.h.557516A6B361170F.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_t.h.557516A6B361170F.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_t.h.557516A6B361170F.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_t.h.557516A6B361170F.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/localefwd.h.8D507D2D246F7EFC.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/localefwd.h.8D507D2D246F7EFC.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/localefwd.h.8D507D2D246F7EFC.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/localefwd.h.8D507D2D246F7EFC.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/long-double.h.ACD735A1862B6BF8.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/long-double.h.ACD735A1862B6BF8.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/long-double.h.ACD735A1862B6BF8.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/long-double.h.ACD735A1862B6BF8.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/main.cpp.2D227B92B66939DB.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/main.cpp.2D227B92B66939DB.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/main.cpp.2D227B92B66939DB.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/main.cpp.2D227B92B66939DB.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.cpp.5DBE48AB22A3742A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.cpp.5DBE48AB22A3742A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.cpp.5DBE48AB22A3742A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.cpp.5DBE48AB22A3742A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.h.2DEFA841ACD26463.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.h.2DEFA841ACD26463.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.h.2DEFA841ACD26463.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.h.2DEFA841ACD26463.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/map.67F74A10898EA76A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/map.67F74A10898EA76A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/map.67F74A10898EA76A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/map.67F74A10898EA76A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mbstate_t.h.F9237FB65FF84D5A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mbstate_t.h.F9237FB65FF84D5A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mbstate_t.h.F9237FB65FF84D5A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mbstate_t.h.F9237FB65FF84D5A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory.DEB7D2B4EBB93631.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory.DEB7D2B4EBB93631.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory.DEB7D2B4EBB93631.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory.DEB7D2B4EBB93631.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory_resource.h.8CBC2A2935956F47.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory_resource.h.8CBC2A2935956F47.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory_resource.h.8CBC2A2935956F47.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory_resource.h.8CBC2A2935956F47.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memoryfwd.h.8339F1696DAE3C08.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memoryfwd.h.8339F1696DAE3C08.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memoryfwd.h.8339F1696DAE3C08.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memoryfwd.h.8339F1696DAE3C08.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/move.h.82CE505FF4CFACB8.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/move.h.82CE505FF4CFACB8.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/move.h.82CE505FF4CFACB8.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/move.h.82CE505FF4CFACB8.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/nested_exception.h.5EE3E7707B4F93EB.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/nested_exception.h.5EE3E7707B4F93EB.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/nested_exception.h.5EE3E7707B4F93EB.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/nested_exception.h.5EE3E7707B4F93EB.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new.41D56A2D69E57DED.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new.41D56A2D69E57DED.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new.41D56A2D69E57DED.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new.41D56A2D69E57DED.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new_allocator.h.FD7B7B64B2A2207B.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new_allocator.h.FD7B7B64B2A2207B.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new_allocator.h.FD7B7B64B2A2207B.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new_allocator.h.FD7B7B64B2A2207B.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/node_handle.h.F46F9F3F43861006.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/node_handle.h.F46F9F3F43861006.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/node_handle.h.F46F9F3F43861006.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/node_handle.h.F46F9F3F43861006.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric.F93D8B803F42F31D.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric.F93D8B803F42F31D.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric.F93D8B803F42F31D.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric.F93D8B803F42F31D.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric_traits.h.8FEF7D9B8E9913D8.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric_traits.h.8FEF7D9B8E9913D8.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric_traits.h.8FEF7D9B8E9913D8.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric_traits.h.8FEF7D9B8E9913D8.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/os_defines.h.5BE086DD68F6A410.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/os_defines.h.5BE086DD68F6A410.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/os_defines.h.5BE086DD68F6A410.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/os_defines.h.5BE086DD68F6A410.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ostream_insert.h.D2F22116BE7D73E6.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ostream_insert.h.D2F22116BE7D73E6.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ostream_insert.h.D2F22116BE7D73E6.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ostream_insert.h.D2F22116BE7D73E6.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/parse_numbers.h.EC5583E0556FCEF1.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/parse_numbers.h.EC5583E0556FCEF1.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/parse_numbers.h.EC5583E0556FCEF1.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/parse_numbers.h.EC5583E0556FCEF1.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix1_lim.h.D94E4687FC9359FF.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix1_lim.h.D94E4687FC9359FF.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix1_lim.h.D94E4687FC9359FF.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix1_lim.h.D94E4687FC9359FF.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix2_lim.h.430DA38A1F301F29.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix2_lim.h.430DA38A1F301F29.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix2_lim.h.430DA38A1F301F29.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix2_lim.h.430DA38A1F301F29.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/postypes.h.BE1513ED32E6A399.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/postypes.h.BE1513ED32E6A399.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/postypes.h.BE1513ED32E6A399.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/postypes.h.BE1513ED32E6A399.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/predefined_ops.h.B15CDC54361DCC11.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/predefined_ops.h.B15CDC54361DCC11.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/predefined_ops.h.B15CDC54361DCC11.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/predefined_ops.h.B15CDC54361DCC11.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pstl_config.h.78EC065511725BA3.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pstl_config.h.78EC065511725BA3.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pstl_config.h.78EC065511725BA3.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pstl_config.h.78EC065511725BA3.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread.h.022320E0CE01A46D.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread.h.022320E0CE01A46D.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread.h.022320E0CE01A46D.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread.h.022320E0CE01A46D.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread_stack_min-dynamic.h.6F432801F0DF58B7.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread_stack_min-dynamic.h.6F432801F0DF58B7.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread_stack_min-dynamic.h.6F432801F0DF58B7.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread_stack_min-dynamic.h.6F432801F0DF58B7.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes-arch.h.9E138C411BE448A0.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes-arch.h.9E138C411BE448A0.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes-arch.h.9E138C411BE448A0.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes-arch.h.9E138C411BE448A0.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes.h.BAA8217B62BB6E86.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes.h.BAA8217B62BB6E86.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes.h.BAA8217B62BB6E86.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes.h.BAA8217B62BB6E86.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ptr_traits.h.BC3863E4C7FECDA0.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ptr_traits.h.BC3863E4C7FECDA0.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ptr_traits.h.BC3863E4C7FECDA0.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ptr_traits.h.BC3863E4C7FECDA0.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qalgorithms.h.FD2ECFF5676E6790.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qalgorithms.h.FD2ECFF5676E6790.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qalgorithms.h.FD2ECFF5676E6790.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qalgorithms.h.FD2ECFF5676E6790.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qapplication.h.A93E4553FB9CB7A2.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qapplication.h.A93E4553FB9CB7A2.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qapplication.h.A93E4553FB9CB7A2.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qapplication.h.A93E4553FB9CB7A2.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qarraydata.h.59BE31F3BBA8ED3E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qarraydata.h.59BE31F3BBA8ED3E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qarraydata.h.59BE31F3BBA8ED3E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qarraydata.h.59BE31F3BBA8ED3E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic.h.F27F4B16AB53D9F8.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic.h.F27F4B16AB53D9F8.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic.h.F27F4B16AB53D9F8.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic.h.F27F4B16AB53D9F8.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic_cxx11.h.69F2114361242273.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic_cxx11.h.69F2114361242273.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic_cxx11.h.69F2114361242273.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic_cxx11.h.69F2114361242273.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbasicatomic.h.A2BFD15B643C1404.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbasicatomic.h.A2BFD15B643C1404.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbasicatomic.h.A2BFD15B643C1404.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbasicatomic.h.A2BFD15B643C1404.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbrush.h.D44E532BF6C7C41E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbrush.h.D44E532BF6C7C41E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbrush.h.D44E532BF6C7C41E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbrush.h.D44E532BF6C7C41E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearray.h.3E258E5BF8C780EA.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearray.h.3E258E5BF8C780EA.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearray.h.3E258E5BF8C780EA.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearray.h.3E258E5BF8C780EA.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearraylist.h.E2E8090DE1F836AD.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearraylist.h.E2E8090DE1F836AD.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearraylist.h.E2E8090DE1F836AD.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearraylist.h.E2E8090DE1F836AD.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qchar.h.AA0A3CD3BD472DA0.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qchar.h.AA0A3CD3BD472DA0.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qchar.h.AA0A3CD3BD472DA0.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qchar.h.AA0A3CD3BD472DA0.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcolor.h.5684E01578882E86.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcolor.h.5684E01578882E86.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcolor.h.5684E01578882E86.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcolor.h.5684E01578882E86.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcompilerdetection.h.7273FAC81D36B620.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcompilerdetection.h.7273FAC81D36B620.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcompilerdetection.h.7273FAC81D36B620.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcompilerdetection.h.7273FAC81D36B620.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qconfig.h.F68B1AFB5E4EF498.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qconfig.h.F68B1AFB5E4EF498.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qconfig.h.F68B1AFB5E4EF498.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qconfig.h.F68B1AFB5E4EF498.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainerfwd.h.A8D45E2A7296D1C8.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainerfwd.h.A8D45E2A7296D1C8.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainerfwd.h.A8D45E2A7296D1C8.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainerfwd.h.A8D45E2A7296D1C8.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainertools_impl.h.7644E4C51B877567.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainertools_impl.h.7644E4C51B877567.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainertools_impl.h.7644E4C51B877567.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainertools_impl.h.7644E4C51B877567.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreapplication.h.0A5B8B7796FFF62E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreapplication.h.0A5B8B7796FFF62E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreapplication.h.0A5B8B7796FFF62E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreapplication.h.0A5B8B7796FFF62E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreevent.h.F3CEEB53B346C550.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreevent.h.F3CEEB53B346C550.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreevent.h.F3CEEB53B346C550.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreevent.h.F3CEEB53B346C550.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcursor.h.69E8ABF61EB150EC.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcursor.h.69E8ABF61EB150EC.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcursor.h.69E8ABF61EB150EC.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcursor.h.69E8ABF61EB150EC.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qdatastream.h.911D7CBB33217000.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qdatastream.h.911D7CBB33217000.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qdatastream.h.911D7CBB33217000.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qdatastream.h.911D7CBB33217000.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qeventloop.h.634AE2F88E9E40CC.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qeventloop.h.634AE2F88E9E40CC.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qeventloop.h.634AE2F88E9E40CC.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qeventloop.h.634AE2F88E9E40CC.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qflags.h.759D8986082A8255.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qflags.h.759D8986082A8255.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qflags.h.759D8986082A8255.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qflags.h.759D8986082A8255.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfont.h.A1BC5EA710C0475E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfont.h.A1BC5EA710C0475E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfont.h.A1BC5EA710C0475E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfont.h.A1BC5EA710C0475E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontinfo.h.2B115D24EC8E4A62.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontinfo.h.2B115D24EC8E4A62.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontinfo.h.2B115D24EC8E4A62.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontinfo.h.2B115D24EC8E4A62.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontmetrics.h.1E754D652EDBD45C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontmetrics.h.1E754D652EDBD45C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontmetrics.h.1E754D652EDBD45C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontmetrics.h.1E754D652EDBD45C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qgenericatomic.h.D2595E9059CE3E6F.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qgenericatomic.h.D2595E9059CE3E6F.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qgenericatomic.h.D2595E9059CE3E6F.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qgenericatomic.h.D2595E9059CE3E6F.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobal.h.80C5986D0C867ACE.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobal.h.80C5986D0C867ACE.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobal.h.80C5986D0C867ACE.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobal.h.80C5986D0C867ACE.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobalstatic.h.B90F9758F0EF15A9.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobalstatic.h.B90F9758F0EF15A9.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobalstatic.h.B90F9758F0EF15A9.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobalstatic.h.B90F9758F0EF15A9.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qguiapplication.h.B71C26C78EAD409D.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qguiapplication.h.B71C26C78EAD409D.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qguiapplication.h.B71C26C78EAD409D.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qguiapplication.h.B71C26C78EAD409D.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhash.h.C345BB5A3DCF91DD.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhash.h.C345BB5A3DCF91DD.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhash.h.C345BB5A3DCF91DD.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhash.h.C345BB5A3DCF91DD.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhashfunctions.h.7524BE336D4E70AF.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhashfunctions.h.7524BE336D4E70AF.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhashfunctions.h.7524BE336D4E70AF.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhashfunctions.h.7524BE336D4E70AF.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qicon.h.F590370864B9ACC9.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qicon.h.F590370864B9ACC9.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qicon.h.F590370864B9ACC9.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qicon.h.F590370864B9ACC9.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qimage.h.B98B60217EC4C94F.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qimage.h.B98B60217EC4C94F.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qimage.h.B98B60217EC4C94F.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qimage.h.B98B60217EC4C94F.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qinputmethod.h.62638013DB836F5C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qinputmethod.h.62638013DB836F5C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qinputmethod.h.62638013DB836F5C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qinputmethod.h.62638013DB836F5C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiodevice.h.86919C8F00908C87.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiodevice.h.86919C8F00908C87.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiodevice.h.86919C8F00908C87.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiodevice.h.86919C8F00908C87.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiterator.h.A52C38FD59FD21C6.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiterator.h.A52C38FD59FD21C6.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiterator.h.A52C38FD59FD21C6.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiterator.h.A52C38FD59FD21C6.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qkeysequence.h.EC0D1C6B79C0D9AF.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qkeysequence.h.EC0D1C6B79C0D9AF.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qkeysequence.h.EC0D1C6B79C0D9AF.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qkeysequence.h.EC0D1C6B79C0D9AF.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qline.h.08A4D350D9C9644B.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qline.h.08A4D350D9C9644B.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qline.h.08A4D350D9C9644B.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qline.h.08A4D350D9C9644B.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlist.h.A54757BEE4315CE6.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlist.h.A54757BEE4315CE6.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlist.h.A54757BEE4315CE6.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlist.h.A54757BEE4315CE6.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlocale.h.7E7DB33F1A299A16.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlocale.h.7E7DB33F1A299A16.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlocale.h.7E7DB33F1A299A16.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlocale.h.7E7DB33F1A299A16.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlogging.h.88C32C1FE85F3443.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlogging.h.88C32C1FE85F3443.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlogging.h.88C32C1FE85F3443.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlogging.h.88C32C1FE85F3443.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmainwindow.h.2825B14DFE1FF1B4.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmainwindow.h.2825B14DFE1FF1B4.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmainwindow.h.2825B14DFE1FF1B4.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmainwindow.h.2825B14DFE1FF1B4.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmap.h.8CA468BD1FBCE665.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmap.h.8CA468BD1FBCE665.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmap.h.8CA468BD1FBCE665.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmap.h.8CA468BD1FBCE665.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmargins.h.C0D077F7860E1277.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmargins.h.C0D077F7860E1277.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmargins.h.C0D077F7860E1277.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmargins.h.C0D077F7860E1277.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmatrix.h.00820805EF576E4B.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmatrix.h.00820805EF576E4B.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmatrix.h.00820805EF576E4B.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmatrix.h.00820805EF576E4B.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmetatype.h.541E34D6E6760512.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmetatype.h.541E34D6E6760512.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmetatype.h.541E34D6E6760512.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmetatype.h.541E34D6E6760512.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnamespace.h.EC3FC28536503AF1.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnamespace.h.EC3FC28536503AF1.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnamespace.h.EC3FC28536503AF1.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnamespace.h.EC3FC28536503AF1.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnumeric.h.A66D4612F55B13BE.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnumeric.h.A66D4612F55B13BE.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnumeric.h.A66D4612F55B13BE.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnumeric.h.A66D4612F55B13BE.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject.h.8D479A7B3FDCD700.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject.h.8D479A7B3FDCD700.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject.h.8D479A7B3FDCD700.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject.h.8D479A7B3FDCD700.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject_impl.h.310F998ABFD21C29.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject_impl.h.310F998ABFD21C29.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject_impl.h.310F998ABFD21C29.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject_impl.h.310F998ABFD21C29.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.598B10433A0B063A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.598B10433A0B063A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.598B10433A0B063A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.598B10433A0B063A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.A64CF055117FDFF7.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.A64CF055117FDFF7.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.A64CF055117FDFF7.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.A64CF055117FDFF7.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs_impl.h.7990AFD078F8EA35.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs_impl.h.7990AFD078F8EA35.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs_impl.h.7990AFD078F8EA35.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs_impl.h.7990AFD078F8EA35.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpaintdevice.h.4748152C3010F1F9.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpaintdevice.h.4748152C3010F1F9.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpaintdevice.h.4748152C3010F1F9.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpaintdevice.h.4748152C3010F1F9.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpair.h.9DEE0C3D7A14D2D0.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpair.h.9DEE0C3D7A14D2D0.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpair.h.9DEE0C3D7A14D2D0.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpair.h.9DEE0C3D7A14D2D0.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpalette.h.4842B06684DDBDAE.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpalette.h.4842B06684DDBDAE.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpalette.h.4842B06684DDBDAE.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpalette.h.4842B06684DDBDAE.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixelformat.h.620C90AEA27BFC2A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixelformat.h.620C90AEA27BFC2A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixelformat.h.620C90AEA27BFC2A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixelformat.h.620C90AEA27BFC2A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixmap.h.D73E0EAB31C7D791.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixmap.h.D73E0EAB31C7D791.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixmap.h.D73E0EAB31C7D791.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixmap.h.D73E0EAB31C7D791.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpoint.h.A7DD7B4CA031A3A7.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpoint.h.A7DD7B4CA031A3A7.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpoint.h.A7DD7B4CA031A3A7.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpoint.h.A7DD7B4CA031A3A7.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpolygon.h.4000A0F75B81224E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpolygon.h.4000A0F75B81224E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpolygon.h.4000A0F75B81224E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpolygon.h.4000A0F75B81224E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qprocessordetection.h.F5198DD5442AFC6E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qprocessordetection.h.F5198DD5442AFC6E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qprocessordetection.h.F5198DD5442AFC6E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qprocessordetection.h.F5198DD5442AFC6E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrect.h.F6CF1537A0B18D4C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrect.h.F6CF1537A0B18D4C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrect.h.F6CF1537A0B18D4C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrect.h.F6CF1537A0B18D4C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrefcount.h.6BCA9FE7BAF3DF25.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrefcount.h.6BCA9FE7BAF3DF25.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrefcount.h.6BCA9FE7BAF3DF25.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrefcount.h.6BCA9FE7BAF3DF25.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregexp.h.8088EF7E18743A13.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregexp.h.8088EF7E18743A13.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregexp.h.8088EF7E18743A13.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregexp.h.8088EF7E18743A13.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregion.h.56C430EE51273A95.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregion.h.56C430EE51273A95.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregion.h.56C430EE51273A95.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregion.h.56C430EE51273A95.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgb.h.2B6D1755758FF0DF.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgb.h.2B6D1755758FF0DF.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgb.h.2B6D1755758FF0DF.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgb.h.2B6D1755758FF0DF.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgba64.h.A8C3238E8B988F3B.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgba64.h.A8C3238E8B988F3B.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgba64.h.A8C3238E8B988F3B.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgba64.h.A8C3238E8B988F3B.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qscopedpointer.h.447CA7EB36AE21C6.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qscopedpointer.h.447CA7EB36AE21C6.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qscopedpointer.h.447CA7EB36AE21C6.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qscopedpointer.h.447CA7EB36AE21C6.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qshareddata.h.1613C0F5A4F18669.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qshareddata.h.1613C0F5A4F18669.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qshareddata.h.1613C0F5A4F18669.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qshareddata.h.1613C0F5A4F18669.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer.h.9FB2460B773F76C5.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer.h.9FB2460B773F76C5.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer.h.9FB2460B773F76C5.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer.h.9FB2460B773F76C5.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer_impl.h.901DC4E517036607.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer_impl.h.901DC4E517036607.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer_impl.h.901DC4E517036607.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer_impl.h.901DC4E517036607.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsize.h.BEC23C243EFEF7A4.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsize.h.BEC23C243EFEF7A4.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsize.h.BEC23C243EFEF7A4.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsize.h.BEC23C243EFEF7A4.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsizepolicy.h.118596B94F6E5633.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsizepolicy.h.118596B94F6E5633.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsizepolicy.h.118596B94F6E5633.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsizepolicy.h.118596B94F6E5633.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstring.h.D18E3F7143B0C176.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstring.h.D18E3F7143B0C176.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstring.h.D18E3F7143B0C176.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstring.h.D18E3F7143B0C176.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringalgorithms.h.BCB989669B8CD32D.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringalgorithms.h.BCB989669B8CD32D.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringalgorithms.h.BCB989669B8CD32D.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringalgorithms.h.BCB989669B8CD32D.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringlist.h.B03A2F9985D050E5.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringlist.h.B03A2F9985D050E5.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringlist.h.B03A2F9985D050E5.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringlist.h.B03A2F9985D050E5.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringliteral.h.0A066A3902B9CE30.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringliteral.h.0A066A3902B9CE30.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringliteral.h.0A066A3902B9CE30.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringliteral.h.0A066A3902B9CE30.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringmatcher.h.7D870B6147C84076.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringmatcher.h.7D870B6147C84076.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringmatcher.h.7D870B6147C84076.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringmatcher.h.7D870B6147C84076.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringview.h.A67B8B8FF41BFF55.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringview.h.A67B8B8FF41BFF55.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringview.h.A67B8B8FF41BFF55.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringview.h.A67B8B8FF41BFF55.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsysinfo.h.8EF4D5AF4D751B51.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsysinfo.h.8EF4D5AF4D751B51.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsysinfo.h.8EF4D5AF4D751B51.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsysinfo.h.8EF4D5AF4D751B51.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsystemdetection.h.8329D2CD97522D7C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsystemdetection.h.8329D2CD97522D7C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsystemdetection.h.8329D2CD97522D7C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsystemdetection.h.8329D2CD97522D7C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtabwidget.h.C4E9E0C72F6941B1.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtabwidget.h.C4E9E0C72F6941B1.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtabwidget.h.C4E9E0C72F6941B1.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtabwidget.h.C4E9E0C72F6941B1.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtcore-config.h.0C11AA7F7C9F0EA4.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtcore-config.h.0C11AA7F7C9F0EA4.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtcore-config.h.0C11AA7F7C9F0EA4.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtcore-config.h.0C11AA7F7C9F0EA4.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtgui-config.h.0898F0E1544AC047.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtgui-config.h.0898F0E1544AC047.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtgui-config.h.0898F0E1544AC047.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtgui-config.h.0898F0E1544AC047.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtguiglobal.h.80A0DFCC7763ABCB.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtguiglobal.h.80A0DFCC7763ABCB.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtguiglobal.h.80A0DFCC7763ABCB.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtguiglobal.h.80A0DFCC7763ABCB.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtransform.h.97E922D9DE075E31.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtransform.h.97E922D9DE075E31.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtransform.h.97E922D9DE075E31.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtransform.h.97E922D9DE075E31.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtranslator.h.E43F40A38E0AFDC4.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtranslator.h.E43F40A38E0AFDC4.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtranslator.h.E43F40A38E0AFDC4.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtranslator.h.E43F40A38E0AFDC4.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgets-config.h.3C31FF7C5B82440C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgets-config.h.3C31FF7C5B82440C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgets-config.h.3C31FF7C5B82440C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgets-config.h.3C31FF7C5B82440C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgetsglobal.h.0D7FCF3A707EDF44.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgetsglobal.h.0D7FCF3A707EDF44.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgetsglobal.h.0D7FCF3A707EDF44.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgetsglobal.h.0D7FCF3A707EDF44.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtypeinfo.h.5160790443A251D4.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtypeinfo.h.5160790443A251D4.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtypeinfo.h.5160790443A251D4.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtypeinfo.h.5160790443A251D4.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvariant.h.4C476E0F61671237.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvariant.h.4C476E0F61671237.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvariant.h.4C476E0F61671237.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvariant.h.4C476E0F61671237.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvarlengtharray.h.7FE8B531C3A3B76F.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvarlengtharray.h.7FE8B531C3A3B76F.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvarlengtharray.h.7FE8B531C3A3B76F.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvarlengtharray.h.7FE8B531C3A3B76F.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvector.h.D123A02691F2B7AD.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvector.h.D123A02691F2B7AD.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvector.h.D123A02691F2B7AD.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvector.h.D123A02691F2B7AD.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qversiontagging.h.3C43080618F516BF.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qversiontagging.h.3C43080618F516BF.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qversiontagging.h.3C43080618F516BF.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qversiontagging.h.3C43080618F516BF.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwidget.h.5A43191B86718350.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwidget.h.5A43191B86718350.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwidget.h.5A43191B86718350.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwidget.h.5A43191B86718350.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwindowdefs.h.434E87C4F63B3C91.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwindowdefs.h.434E87C4F63B3C91.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwindowdefs.h.434E87C4F63B3C91.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwindowdefs.h.434E87C4F63B3C91.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/range_access.h.F2D342D0170A00E0.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/range_access.h.F2D342D0170A00E0.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/range_access.h.F2D342D0170A00E0.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/range_access.h.F2D342D0170A00E0.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ratio.637BCEE78C1EAF1F.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ratio.637BCEE78C1EAF1F.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ratio.637BCEE78C1EAF1F.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ratio.637BCEE78C1EAF1F.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/refwrap.h.F7E25ED78261BCB2.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/refwrap.h.F7E25ED78261BCB2.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/refwrap.h.F7E25ED78261BCB2.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/refwrap.h.F7E25ED78261BCB2.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/requires_hosted.h.26268E021F0ECE3C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/requires_hosted.h.26268E021F0ECE3C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/requires_hosted.h.26268E021F0ECE3C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/requires_hosted.h.26268E021F0ECE3C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.A585A48500495348.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.A585A48500495348.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.A585A48500495348.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.A585A48500495348.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.E8530EF262253892.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.E8530EF262253892.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.E8530EF262253892.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.E8530EF262253892.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.BA57472D13519767.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.BA57472D13519767.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.BA57472D13519767.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.BA57472D13519767.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.E19325D0BE3592A0.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.E19325D0BE3592A0.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.E19325D0BE3592A0.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.E19325D0BE3592A0.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/setjmp.h.71DEFB3DCC800794.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/setjmp.h.71DEFB3DCC800794.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/setjmp.h.71DEFB3DCC800794.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/setjmp.h.71DEFB3DCC800794.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr.h.58B2A3F1F22B1E10.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr.h.58B2A3F1F22B1E10.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr.h.58B2A3F1F22B1E10.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr.h.58B2A3F1F22B1E10.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_atomic.h.D4122DD7C624F18E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_atomic.h.D4122DD7C624F18E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_atomic.h.D4122DD7C624F18E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_atomic.h.D4122DD7C624F18E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_base.h.BE69034022EA8FA4.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_base.h.BE69034022EA8FA4.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_base.h.BE69034022EA8FA4.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_base.h.BE69034022EA8FA4.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sigset_t.h.32273C537A103809.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sigset_t.h.32273C537A103809.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sigset_t.h.32273C537A103809.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sigset_t.h.32273C537A103809.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/single_threaded.h.918E7314A6EC8DC0.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/single_threaded.h.918E7314A6EC8DC0.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/single_threaded.h.918E7314A6EC8DC0.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/single_threaded.h.918E7314A6EC8DC0.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_abs.h.B5BC80B73AA8AA04.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_abs.h.B5BC80B73AA8AA04.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_abs.h.B5BC80B73AA8AA04.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_abs.h.B5BC80B73AA8AA04.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_function.h.1DBFFD209E231917.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_function.h.1DBFFD209E231917.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_function.h.1DBFFD209E231917.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_function.h.1DBFFD209E231917.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdarg.h.32EA7B95DAFCCF99.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdarg.h.32EA7B95DAFCCF99.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdarg.h.32EA7B95DAFCCF99.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdarg.h.32EA7B95DAFCCF99.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdc-predef.h.9EA93D70716BF84B.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdc-predef.h.9EA93D70716BF84B.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdc-predef.h.9EA93D70716BF84B.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdc-predef.h.9EA93D70716BF84B.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stddef.h.B10142B5B6E10391.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stddef.h.B10142B5B6E10391.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stddef.h.B10142B5B6E10391.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stddef.h.B10142B5B6E10391.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdexcept.FC9481857B4FA9B4.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdexcept.FC9481857B4FA9B4.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdexcept.FC9481857B4FA9B4.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdexcept.FC9481857B4FA9B4.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-intn.h.EE0939E700184847.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-intn.h.EE0939E700184847.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-intn.h.EE0939E700184847.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-intn.h.EE0939E700184847.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-least.h.A0CB5BC401DAC650.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-least.h.A0CB5BC401DAC650.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-least.h.A0CB5BC401DAC650.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-least.h.A0CB5BC401DAC650.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-uintn.h.B3EA113168048B57.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-uintn.h.B3EA113168048B57.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-uintn.h.B3EA113168048B57.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-uintn.h.B3EA113168048B57.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.08597F86630FDE5E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.08597F86630FDE5E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.08597F86630FDE5E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.08597F86630FDE5E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.22B451C129B23D79.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.22B451C129B23D79.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.22B451C129B23D79.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.22B451C129B23D79.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio.h.6919C07CB89D47AD.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio.h.6919C07CB89D47AD.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio.h.6919C07CB89D47AD.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio.h.6919C07CB89D47AD.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio_lim.h.09E79B5FC5C8DF86.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio_lim.h.09E79B5FC5C8DF86.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio_lim.h.09E79B5FC5C8DF86.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio_lim.h.09E79B5FC5C8DF86.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib-float.h.126E8959FAE2A511.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib-float.h.126E8959FAE2A511.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib-float.h.126E8959FAE2A511.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib-float.h.126E8959FAE2A511.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.42D90B865E21AB50.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.42D90B865E21AB50.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.42D90B865E21AB50.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.42D90B865E21AB50.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.61AA7B9EED10C430.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.61AA7B9EED10C430.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.61AA7B9EED10C430.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.61AA7B9EED10C430.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algo.h.336B2A99E112B831.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algo.h.336B2A99E112B831.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algo.h.336B2A99E112B831.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algo.h.336B2A99E112B831.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algobase.h.555E5AB59D1CE434.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algobase.h.555E5AB59D1CE434.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algobase.h.555E5AB59D1CE434.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algobase.h.555E5AB59D1CE434.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_bvector.h.8AE3CEBB0EAAE7AC.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_bvector.h.8AE3CEBB0EAAE7AC.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_bvector.h.8AE3CEBB0EAAE7AC.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_bvector.h.8AE3CEBB0EAAE7AC.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_construct.h.675F3C756D2CDDFB.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_construct.h.675F3C756D2CDDFB.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_construct.h.675F3C756D2CDDFB.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_construct.h.675F3C756D2CDDFB.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_function.h.4312324AADC9200E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_function.h.4312324AADC9200E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_function.h.4312324AADC9200E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_function.h.4312324AADC9200E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_heap.h.A0022ED15B79087D.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_heap.h.A0022ED15B79087D.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_heap.h.A0022ED15B79087D.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_heap.h.A0022ED15B79087D.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator.h.70D88ADB523A155E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator.h.70D88ADB523A155E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator.h.70D88ADB523A155E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator.h.70D88ADB523A155E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_funcs.h.0D39D2E36115557E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_funcs.h.0D39D2E36115557E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_funcs.h.0D39D2E36115557E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_funcs.h.0D39D2E36115557E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_types.h.1C2D9B2B05C1363B.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_types.h.1C2D9B2B05C1363B.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_types.h.1C2D9B2B05C1363B.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_types.h.1C2D9B2B05C1363B.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_list.h.063E636C37F12734.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_list.h.063E636C37F12734.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_list.h.063E636C37F12734.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_list.h.063E636C37F12734.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_map.h.EC07165BB825159E.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_map.h.EC07165BB825159E.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_map.h.EC07165BB825159E.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_map.h.EC07165BB825159E.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_multimap.h.5B0E5766E75F4152.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_multimap.h.5B0E5766E75F4152.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_multimap.h.5B0E5766E75F4152.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_multimap.h.5B0E5766E75F4152.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_numeric.h.936BC0F7F7FAE23C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_numeric.h.936BC0F7F7FAE23C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_numeric.h.936BC0F7F7FAE23C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_numeric.h.936BC0F7F7FAE23C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_pair.h.33E007C18AD1880F.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_pair.h.33E007C18AD1880F.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_pair.h.33E007C18AD1880F.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_pair.h.33E007C18AD1880F.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_raw_storage_iter.h.E907E48D11449F0C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_raw_storage_iter.h.E907E48D11449F0C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_raw_storage_iter.h.E907E48D11449F0C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_raw_storage_iter.h.E907E48D11449F0C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_relops.h.8CD880CC32BA3E47.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_relops.h.8CD880CC32BA3E47.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_relops.h.8CD880CC32BA3E47.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_relops.h.8CD880CC32BA3E47.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tempbuf.h.1CFD178B11157DBE.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tempbuf.h.1CFD178B11157DBE.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tempbuf.h.1CFD178B11157DBE.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tempbuf.h.1CFD178B11157DBE.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tree.h.C190197022C6FA1F.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tree.h.C190197022C6FA1F.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tree.h.C190197022C6FA1F.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tree.h.C190197022C6FA1F.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_uninitialized.h.54EDC68402026771.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_uninitialized.h.54EDC68402026771.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_uninitialized.h.54EDC68402026771.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_uninitialized.h.54EDC68402026771.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_vector.h.5BE0DC1E083D4239.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_vector.h.5BE0DC1E083D4239.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_vector.h.5BE0DC1E083D4239.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_vector.h.5BE0DC1E083D4239.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stream_iterator.h.61B56BA0B3239EDE.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stream_iterator.h.61B56BA0B3239EDE.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stream_iterator.h.61B56BA0B3239EDE.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stream_iterator.h.61B56BA0B3239EDE.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.7FD2D3A2B827E078.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.7FD2D3A2B827E078.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.7FD2D3A2B827E078.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.7FD2D3A2B827E078.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.tcc.FB7963A391C77967.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.tcc.FB7963A391C77967.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.tcc.FB7963A391C77967.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.tcc.FB7963A391C77967.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf_iterator.h.2D64BA51BC9EC9AD.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf_iterator.h.2D64BA51BC9EC9AD.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf_iterator.h.2D64BA51BC9EC9AD.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf_iterator.h.2D64BA51BC9EC9AD.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.7B4FE7410F5C09C9.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.7B4FE7410F5C09C9.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.7B4FE7410F5C09C9.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.7B4FE7410F5C09C9.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.h.979B97B48AB27554.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.h.979B97B48AB27554.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.h.979B97B48AB27554.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.h.979B97B48AB27554.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_conversions.h.FEDA0A74BBD67E42.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_conversions.h.FEDA0A74BBD67E42.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_conversions.h.FEDA0A74BBD67E42.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_conversions.h.FEDA0A74BBD67E42.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.808DF2D0BB7723EB.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.808DF2D0BB7723EB.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.808DF2D0BB7723EB.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.808DF2D0BB7723EB.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.tcc.3D79C5B861AFBD05.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.tcc.3D79C5B861AFBD05.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.tcc.3D79C5B861AFBD05.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.tcc.3D79C5B861AFBD05.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stringfwd.h.557FE983BB1E2646.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stringfwd.h.557FE983BB1E2646.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stringfwd.h.557FE983BB1E2646.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stringfwd.h.557FE983BB1E2646.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/strings.h.9EB46A34EB89BB5D.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/strings.h.9EB46A34EB89BB5D.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/strings.h.9EB46A34EB89BB5D.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/strings.h.9EB46A34EB89BB5D.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_FILE.h.2B6C435DE91D3DF8.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_FILE.h.2B6C435DE91D3DF8.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_FILE.h.2B6C435DE91D3DF8.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_FILE.h.2B6C435DE91D3DF8.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct___jmp_buf_tag.h.C41AC0386D4A06C8.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct___jmp_buf_tag.h.C41AC0386D4A06C8.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct___jmp_buf_tag.h.C41AC0386D4A06C8.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct___jmp_buf_tag.h.C41AC0386D4A06C8.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_itimerspec.h.7F2AA6FE7224B30F.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_itimerspec.h.7F2AA6FE7224B30F.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_itimerspec.h.7F2AA6FE7224B30F.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_itimerspec.h.7F2AA6FE7224B30F.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_mutex.h.A62EF32C01DB3505.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_mutex.h.A62EF32C01DB3505.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_mutex.h.A62EF32C01DB3505.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_mutex.h.A62EF32C01DB3505.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_rwlock.h.76DF445C3AA414C9.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_rwlock.h.76DF445C3AA414C9.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_rwlock.h.76DF445C3AA414C9.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_rwlock.h.76DF445C3AA414C9.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_sched_param.h.B3F662015F7067C8.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_sched_param.h.B3F662015F7067C8.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_sched_param.h.B3F662015F7067C8.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_sched_param.h.B3F662015F7067C8.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timespec.h.0E09B6677A8D6A08.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timespec.h.0E09B6677A8D6A08.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timespec.h.0E09B6677A8D6A08.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timespec.h.0E09B6677A8D6A08.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timeval.h.4A17C4CCB9EE5883.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timeval.h.4A17C4CCB9EE5883.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timeval.h.4A17C4CCB9EE5883.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timeval.h.4A17C4CCB9EE5883.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_tm.h.472DDF26D5924DB0.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_tm.h.472DDF26D5924DB0.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_tm.h.472DDF26D5924DB0.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_tm.h.472DDF26D5924DB0.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs-64.h.C743FD695F310B00.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs-64.h.C743FD695F310B00.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs-64.h.C743FD695F310B00.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs-64.h.C743FD695F310B00.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs.h.07D09A29AEBA877C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs.h.07D09A29AEBA877C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs.h.07D09A29AEBA877C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs.h.07D09A29AEBA877C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/system_error.8A12E1E8FFB1D44A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/system_error.8A12E1E8FFB1D44A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/system_error.8A12E1E8FFB1D44A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/system_error.8A12E1E8FFB1D44A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/thread-shared-types.h.D988ADBA7666A8DD.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/thread-shared-types.h.D988ADBA7666A8DD.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/thread-shared-types.h.D988ADBA7666A8DD.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/thread-shared-types.h.D988ADBA7666A8DD.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.E3714B647728C2FE.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.E3714B647728C2FE.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.E3714B647728C2FE.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.E3714B647728C2FE.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.EDC06F0AFB6EC7EC.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.EDC06F0AFB6EC7EC.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.EDC06F0AFB6EC7EC.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.EDC06F0AFB6EC7EC.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time64.h.1807D6F5124100A2.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time64.h.1807D6F5124100A2.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time64.h.1807D6F5124100A2.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time64.h.1807D6F5124100A2.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time_t.h.CAA645D29A7A0EF9.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time_t.h.CAA645D29A7A0EF9.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time_t.h.CAA645D29A7A0EF9.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time_t.h.CAA645D29A7A0EF9.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timer_t.h.3EFB88CBA2B5B801.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timer_t.h.3EFB88CBA2B5B801.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timer_t.h.3EFB88CBA2B5B801.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timer_t.h.3EFB88CBA2B5B801.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timesize.h.44719E86E09400E4.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timesize.h.44719E86E09400E4.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timesize.h.44719E86E09400E4.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timesize.h.44719E86E09400E4.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timex.h.F2D36E17192C32F0.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timex.h.F2D36E17192C32F0.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timex.h.F2D36E17192C32F0.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timex.h.F2D36E17192C32F0.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/tuple.778CE823941F84F0.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/tuple.778CE823941F84F0.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/tuple.778CE823941F84F0.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/tuple.778CE823941F84F0.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.DE435E04D8184E0C.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.DE435E04D8184E0C.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.DE435E04D8184E0C.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.DE435E04D8184E0C.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.h.833B6807C34CC271.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.h.833B6807C34CC271.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.h.833B6807C34CC271.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.h.833B6807C34CC271.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typeinfo.0065C4A406A05D71.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typeinfo.0065C4A406A05D71.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typeinfo.0065C4A406A05D71.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typeinfo.0065C4A406A05D71.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5A59583DBE28918.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5A59583DBE28918.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5A59583DBE28918.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5A59583DBE28918.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5E7FE6DA0F78AF5.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5E7FE6DA0F78AF5.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5E7FE6DA0F78AF5.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5E7FE6DA0F78AF5.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typesizes.h.A6E116B64E63B90B.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typesizes.h.A6E116B64E63B90B.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typesizes.h.A6E116B64E63B90B.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typesizes.h.A6E116B64E63B90B.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uintn-identity.h.CB86545C6FF94BB3.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uintn-identity.h.CB86545C6FF94BB3.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uintn-identity.h.CB86545C6FF94BB3.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uintn-identity.h.CB86545C6FF94BB3.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uio_lim.h.DF584C6AE54BEA07.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uio_lim.h.DF584C6AE54BEA07.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uio_lim.h.DF584C6AE54BEA07.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uio_lim.h.DF584C6AE54BEA07.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uniform_int_dist.h.C54B19F2B43B693B.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uniform_int_dist.h.C54B19F2B43B693B.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uniform_int_dist.h.C54B19F2B43B693B.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uniform_int_dist.h.C54B19F2B43B693B.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unique_ptr.h.A3AB02F93B77F5A0.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unique_ptr.h.A3AB02F93B77F5A0.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unique_ptr.h.A3AB02F93B77F5A0.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unique_ptr.h.A3AB02F93B77F5A0.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.CA82C61ED27DA8D6.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.CA82C61ED27DA8D6.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.CA82C61ED27DA8D6.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.CA82C61ED27DA8D6.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.h.917859E405C5B5EA.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.h.917859E405C5B5EA.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.h.917859E405C5B5EA.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.h.917859E405C5B5EA.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator.h.258C17386C08195D.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator.h.258C17386C08195D.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator.h.258C17386C08195D.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator.h.258C17386C08195D.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator_args.h.DD2424DE20F3F1C7.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator_args.h.DD2424DE20F3F1C7.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator_args.h.DD2424DE20F3F1C7.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator_args.h.DD2424DE20F3F1C7.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.5D04E6A553B4780A.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.5D04E6A553B4780A.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.5D04E6A553B4780A.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.5D04E6A553B4780A.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.h.15845B2F303871C2.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.h.15845B2F303871C2.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.h.15845B2F303871C2.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.h.15845B2F303871C2.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/variant.0361674085D4F5FD.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/variant.0361674085D4F5FD.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/variant.0361674085D4F5FD.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/variant.0361674085D4F5FD.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.04C1B55C46383484.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.04C1B55C46383484.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.04C1B55C46383484.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.04C1B55C46383484.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.tcc.9925CCCCF876B8E0.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.tcc.9925CCCCF876B8E0.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.tcc.9925CCCCF876B8E0.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.tcc.9925CCCCF876B8E0.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitflags.h.8046C5530CD87302.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitflags.h.8046C5530CD87302.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitflags.h.8046C5530CD87302.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitflags.h.8046C5530CD87302.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitstatus.h.D7C4F06852D51050.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitstatus.h.D7C4F06852D51050.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitstatus.h.D7C4F06852D51050.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitstatus.h.D7C4F06852D51050.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.27C0562D93BBAA12.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.27C0562D93BBAA12.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.27C0562D93BBAA12.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.27C0562D93BBAA12.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.83BD995621576773.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.83BD995621576773.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.83BD995621576773.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.83BD995621576773.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wint_t.h.DAC5928CF0BA7895.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wint_t.h.DAC5928CF0BA7895.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wint_t.h.DAC5928CF0BA7895.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wint_t.h.DAC5928CF0BA7895.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wordsize.h.23D8030BEC81E6F1.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wordsize.h.23D8030BEC81E6F1.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wordsize.h.23D8030BEC81E6F1.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wordsize.h.23D8030BEC81E6F1.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/xopen_lim.h.E4E4BC8C11167D14.idx b/pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/xopen_lim.h.E4E4BC8C11167D14.idx
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/xopen_lim.h.E4E4BC8C11167D14.idx
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/xopen_lim.h.E4E4BC8C11167D14.idx
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/compile_commands.json b/pyqt_project/build/Desktop-Debug/.qtc_clangd/compile_commands.json
similarity index 100%
rename from untitled/build/Desktop-Debug/.qtc_clangd/compile_commands.json
rename to pyqt_project/build/Desktop-Debug/.qtc_clangd/compile_commands.json
diff --git a/untitled/build/Desktop-Debug/qmake_qmake_qm_files.qrc b/pyqt_project/build/Desktop-Debug/qmake_qmake_qm_files.qrc
similarity index 100%
rename from untitled/build/Desktop-Debug/qmake_qmake_qm_files.qrc
rename to pyqt_project/build/Desktop-Debug/qmake_qmake_qm_files.qrc
diff --git a/untitled/main.cpp b/pyqt_project/main.cpp
similarity index 100%
rename from untitled/main.cpp
rename to pyqt_project/main.cpp
diff --git a/untitled/mainwindow.cpp b/pyqt_project/mainwindow.cpp
similarity index 100%
rename from untitled/mainwindow.cpp
rename to pyqt_project/mainwindow.cpp
diff --git a/untitled/mainwindow.h b/pyqt_project/mainwindow.h
similarity index 100%
rename from untitled/mainwindow.h
rename to pyqt_project/mainwindow.h
diff --git a/untitled/mainwindow.ui b/pyqt_project/mainwindow.ui
similarity index 100%
rename from untitled/mainwindow.ui
rename to pyqt_project/mainwindow.ui
diff --git a/untitled/mainwindow_ui.py b/pyqt_project/mainwindow_ui.py
similarity index 100%
rename from untitled/mainwindow_ui.py
rename to pyqt_project/mainwindow_ui.py
diff --git a/untitled/untitled.pro b/pyqt_project/untitled.pro
similarity index 100%
rename from untitled/untitled.pro
rename to pyqt_project/untitled.pro
diff --git a/untitled/untitled_en_US.ts b/pyqt_project/untitled_en_US.ts
similarity index 100%
rename from untitled/untitled_en_US.ts
rename to pyqt_project/untitled_en_US.ts
diff --git a/readScale.py b/readScale.py
deleted file mode 100644
index 49061f1..0000000
--- a/readScale.py
+++ /dev/null
@@ -1,301 +0,0 @@
-import serial
-import binascii
-import math
-import mariadb
-import copy
-
-
-# aktuell ist es so programmiert, dass es annimmt, dass in kg gemessen wird (andere Einheiten liefern also flasche Ergebnisse)
-# das was man noch dazuprogrammieren kann, ist wenn mehrere Teile auf der Waage liegen, ob dann die Typen noch immer erkannt werden
-
-
-
-
-db_config = {
- 'user': 'dbUser',
- 'password': 'dbPassword',
- 'host': 'localhost',
- 'database': 'projectGeislinger',
- 'port': 3306 # Standard port for MariaDB
-}
-
-# Establishing the connection
-conn = mariadb.connect(**db_config)
-# Create a cursor to execute queries
-cursor = conn.cursor()
-
-# Konfiguration der seriellen Schnittstelle
-ser = serial.Serial('/dev/ttyUSB0', 9600)
-
-waageEingeschwungen = False
-
-
-
-def wahrscheinlichkeitsDichte(x,mue, var):
- # in der Funktion wird der Wahrscheinlichkeitsdichtenwert der Variable x für eine bestimmte Normalverteilung berechnet
- standardabweichung = var**0.5
-
- result = 1/(standardabweichung * (2*math.pi)**0.5 ) * math.exp(-0.5 * ((x-mue)/standardabweichung)**2)
-
- return result
-
-def wahrscheinlichkeitsDichteMultipVar(waageMessung, numberObjectList, results):
- # in der Funktion wird der Wahrscheinlichkeitsdichtenwert der Variable waageMessung für eine bestimmte Normalverteilung berechnet
-
- # Mathematische Sätze, auf welchen die Berechnung basiert:
- # seien X1,..., Xn unabhängige Zufallsvariablen mit Dichten f1,..., fn, dann hat X = (X1,...,Xn) die gemeinsame Dichte f(x1,...,xn) = f1(x1) * ... + fn(xn)
- # seien X1,..., Xn unabhängige Zufallsvariablen die N(mue_i, sigma_i^2) verteilt sind, dann ist X = X1+...+Xn - N(mue, sigma^2) verteilt mit mue=mue1+...+mue_n, sigma^2 = sigma_1^2+...+sigma_n^2
-
- result = 0
-
- # Berechnung vom Gesamtmittelwert
- mueGes = 0
- for i in range(0, len(numberObjectList)):
- mueGes = mueGes + numberObjectList[i] * results[i][2]
-
- # Berechnung von der Gesamtvarianz (var = sigma^2)
- varGes = 0
- for i in range(0, len(numberObjectList)):
- varGes = varGes + numberObjectList[i] * results[i][3]
-
- # Berechnung der Wahrscheinlichkeitsdichte
- standardabweichungGes = varGes**0.5
- result = 1/(standardabweichungGes * (2*math.pi)**0.5 ) * math.exp(-0.5 * ((waageMessung-mueGes)/standardabweichungGes)**2)
-
- return result
-
-
-# die Funktion kann man vermutlich rauslöschen
-def numberSmallerObjects(numberBiggerObjects, messungWaage, mue1,mue2, sigma2):
- for i in range(1,10000):
- #damit wird geprüft, ob eh auch ein Objekt vom Typ1 auf der Waage liegt, oder nur ein Objekt vom Typ2
- # eigentlich müsste da 3*sigma drinnen stehen, um 99,7% der Fälle abzudecken, aber das ist nur bei einer gültigen Normalverteilung zutreffend (mit ausreichend Messungen)
- if (messungWaage-numberBiggerObjects*(mue2+10*sigma2))/mue1 > 0:
- if i > (messungWaage-numberBiggerObjects*mue2)/mue1:
- return i
- else:
- return -1
-
-
-def sumMaxWeightObjects(objectType, numberObjectList, results):
- sum = 0
-
- # die Anzahl an Bauteilen, welche dem Objekttypen zugeordnet sind, sollen nicht mit dazugerechnet werden
- for i in range(objectType+1, len(numberObjectList)):
- # eigentlich müsste man nur mit 3 multiplizieren, um 99,7% der Bauteile im Bereich zu haben - das gilt aber nur für eine gültige Normalverteilung
- #sum = sum + numberObjectList[i] * (results[i][2] + 3 * math.sqrt(results[i][3]))
- sum = sum + numberObjectList[i] * (results[i][2])
-
- return sum
-
-
-def numberPossibleObjects(objectType, numberObjectList, results, messungWaage):
- # der objectType definiert, welcher der Objekte das Anschauungsobjekt ist
- # wenn nur ein Objekt darauf gelegt wird, welches nicht vom Typen des Anschauungsobjektes ist, dann wird 1 zurück gegeben
-
- #print(results[objectType][2]-10*math.sqrt(results[objectType][3]))
- #print((messungWaage-sumMaxWeightObjects(objectType, numberObjectList, results))/results[objectType][2])
-
- # wenn kein Gewicht auf der Waage liegt, dann soll -1 zurück gegeben werden.
- if messungWaage <= 0:
- return -1
-
- #print(results[objectType][2])
- #print(((messungWaage-sumMaxWeightObjects(objectType, numberObjectList, results))/(results[objectType][2]+3*math.sqrt(results[objectType][3]))))
- #print(((messungWaage-sumMaxWeightObjects(objectType, numberObjectList, results))/(results[objectType][2]-3*math.sqrt(results[objectType][3]))))
- #zwischenSumme = ((messungWaage-sumMaxWeightObjects(objectType, numberObjectList, results))/(results[objectType][2]+3*math.sqrt(results[objectType][3])))
- zwischenSumme = ((messungWaage-sumMaxWeightObjects(objectType, numberObjectList, results))/(results[objectType][2]))
- for i in range(1,10000):
- if zwischenSumme <= 0: #in diesem Fall wird das gesamte Gewicht der Messung durch Objekte eines anderen Typen "aufgebraucht"
- return 0
- if i > zwischenSumme:
- return i # i entspricht beim returnen der Anzahl der möglichen Objekte
-
-def anzBauteileCountFunction(numberObjectList):
- counter = 0
-
- for i in range(0,len(numberObjectList)):
- if numberObjectList[i] > 0:
- counter = counter + 1
-
- return counter
-
-"""
- for i in range(1,10000):
- #damit wird geprüft, ob eh auch ein Objekt vom Typ1 auf der Waage liegt, oder nur ein Objekt vom Typ2
- # eigentlich müsste da 3*sigma drinnen stehen, um 99,7% der Fälle abzudecken, aber das ist nur bei einer gültigen Normalverteilung zutreffend (mit ausreichend Messungen)
- if (messungWaage-numberBiggerObjects*(mue2+10*sigma2))/mue1 > 0:
- if i > (messungWaage-numberBiggerObjects*mue2)/mue1:
- return i
- else:
- return -1
-"""
-
-
-def main():
-
-
- print("connection is open: ", ser.is_open)
- print("port to which it is connected: ", ser.portstr)
-
-
- #an die Waage den Befehl senden, dass sie ausgelesen werden soll
- ser.write(b'getWeight\n')
- #ser.write(b'tare\n')
- serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
-
- # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
- lenString = len(serialString)-1
- if serialString[lenString] == "g" and serialString[lenString-1] == "k":
- print("ist eingeschwungen")
- waageEingeschwungen = True
- else:
- print("die Waage ist noch nicht eingeschwungen")
- waageEingeschwungen = False
-
- #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
- intString = ""
- for i in serialString:
- if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
- intString = intString + i
- print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
-
-
- # wenn die Waage nicht eingeschwungen ist, dann soll auch nichts weiter gemacht werden
- if( waageEingeschwungen == True and float(intString)>0):
-
-
- # Define the SQL query
- sql_query = "SELECT * FROM projectGeislinger.Einzelteile"
- # Execute the query
- cursor.execute(sql_query)
- # Fetch results
- results = cursor.fetchall()
- # Display data
- print("Ausgabe der Daten der Datenbank:")
- for row in results:
- print(row)
-
-
- anzBauteiltypen = len(results)
- anzBauteile = anzBauteiltypen * [0] # erstellt eine Liste, in welcher die Anzahl der Bauteiltypen gespeichert ist, welche für die weiteren Schleifen verwendet wird
- wahrscheinleichkeitsMatrix = []
-
- # Berechnen der Anzahl an Objekten
- for i in range(0, anzBauteiltypen):
- #bauteilTypCounter = i+1 #zum hochzählen der Anzahlen der Bauteiltypen nach der k-Schleife
-
- while(True):
- if i<(anzBauteiltypen-1): # wenn i die letzte Spalte der Bauteiltypenmatrix ist, dann soll der Teil übersprungen werden
- for k in range(0, 10000):
- anzBauteile[i+1] = k
- nrObjects = numberPossibleObjects(i, anzBauteile, results, float(intString))
- if nrObjects == -1 or nrObjects == 0:
- break
- anzBauteile[i] = nrObjects
- wahrscheinleichkeitsMatrix.append([wahrscheinlichkeitsDichteMultipVar(float(intString), anzBauteile[:], results), anzBauteile[:]])
- # da die Berechnete Anzahl an möglichen Messobjekten um 0 bis +1 um den "wahren" Wert schwankt, wird in der Folge auch die Wahrscheinlichkeit mit einer um 1 verringerten Bauteilanzahl berechnet (sollte diese größer als 1 sein)
- if(anzBauteile[i] >= 1 and anzBauteileCountFunction(anzBauteile)>1):
- anzBauteile = anzBauteile[:]
- anzBauteile[i] = anzBauteile[i]-1
- wahrscheinleichkeitsMatrix.append([wahrscheinlichkeitsDichteMultipVar(float(intString), anzBauteile[:], results), anzBauteile[:]])
-
- anzBauteile[i+1] = 0
- elif i == (anzBauteiltypen-1):
- nrObjects = numberPossibleObjects(i, anzBauteile, results, float(intString))
- if nrObjects == -1 or nrObjects == 0:
- break
- anzBauteile[i] = nrObjects
- wahrscheinleichkeitsMatrix.append([wahrscheinlichkeitsDichteMultipVar(float(intString), anzBauteile[:], results), anzBauteile[:]])
- if(anzBauteile[i] >= 1 and anzBauteileCountFunction(anzBauteile)>1):
- anzBauteile = anzBauteile[:]
- anzBauteile[i] = anzBauteile[i]-1
- wahrscheinleichkeitsMatrix.append([wahrscheinlichkeitsDichteMultipVar(float(intString), anzBauteile[:], results), anzBauteile[:]])
-
-
- if i >= (anzBauteiltypen-2): #wenn der Fall eintritt, dann wurden alle Fälle überprüft -> dadurch kann die i-Schleife in die letzte Runde gehen, kann das Programm sich ganz beenden
- anzBauteile[i] = 0
- break
-
-
- for m in range(i+2,anzBauteiltypen):
- anzBauteile[m] = anzBauteile[m] + 1
- nrObjects = numberPossibleObjects(i, anzBauteile, results, float(intString))
- if nrObjects >= 1:
- break
- elif nrObjects < 1 and m == (anzBauteiltypen-1) :
- break
- else:
- anzBauteile[m] = 0
-
-
- nrObjects = numberPossibleObjects(i, anzBauteile, results, float(intString))
- if (nrObjects == -1 or nrObjects == 0):
- anzBauteile[anzBauteiltypen-1] = 0
- anzBauteile[i] = 0
- break
-
-
- # Suchen der höchsten Wahrscheinlichkeitsdichte
- countMaxPropDensity = 0
- maxPropDensity = 0
- #print(wahrscheinleichkeitsMatrix[0][0])
- for i in range(0, len(wahrscheinleichkeitsMatrix)):
- if(wahrscheinleichkeitsMatrix[i][0] > maxPropDensity):
- maxPropDensity = wahrscheinleichkeitsMatrix[i][0]
- countMaxPropDensity = i
- if wahrscheinleichkeitsMatrix[i][0] >0:
- print(wahrscheinleichkeitsMatrix[i])
- print(wahrscheinleichkeitsMatrix[countMaxPropDensity][0])
- # die Bauteilkombination mit der höchsten Wahrscheinlichkeitsdichte ausgeben
- for i in range(0, len(wahrscheinleichkeitsMatrix[0][1])):
- print("Bauteiltyp: ", results[i][1]," Anzahl: ", wahrscheinleichkeitsMatrix[countMaxPropDensity][1][i])
-
- #nrObjects = numberPossibleObjects(0, anzBauteile, results, float(intString))
- #print("number objects: ", nrObjects-1)
-
- """
- for i in range(3,0,-1):
- numberOfSmallObjects = numberSmallerObjects(1, float(intString),results[4][2], results[3][2], math.sqrt(results[3][3]))
- print("number of smaller objects: ", numberOfSmallObjects-1)
- """
-
-
- """
- # in der Folge wird nun berechnet, welcher Normalverteilung die Messung am ehesten entspricht
- dBId = 0
- maxPropDensity = 0
- for row in results:
- propDens = wahrscheinlichkeitsDichte(float(intString) ,row[2], row[3])
- if propDens > maxPropDensity:
- maxPropDensity = propDens
- dBId = row[0]
-
-
- #Ausgabe des Bauteiltypen, welchem die Messung am ehesten entspricht
- for row in results:
- if row[0] == dBId:
- print(row[1])
-
- #propDens = wahrscheinlichkeitsDichte(0.042 ,results[0][2], results[0][3])
- #print(propDens)
- """
-
-
-
-
-
-
- ser.close()
- print("connection is open: ", ser.is_open)
-
-
-
-
-
-
-if __name__ == "__main__":
- main()
-
-
-
diff --git a/readScale_Stand01.07.py b/readScale_Stand01.07.py
deleted file mode 100644
index b26afe9..0000000
--- a/readScale_Stand01.07.py
+++ /dev/null
@@ -1,138 +0,0 @@
-import serial
-import binascii
-import math
-import mariadb
-
-
-# aktuell ist es so programmiert, dass es annimmt, dass in kg gemessen wird (andere Einheiten liefern also flasche Ergebnisse)
-# das was man noch dazuprogrammieren kann, ist wenn mehrere Teile auf der Waage liegen, ob dann die Typen noch immer erkannt werden
-
-
-
-
-db_config = {
- 'user': 'dbUser',
- 'password': 'dbPassword',
- 'host': 'localhost',
- 'database': 'projectGeislinger',
- 'port': 3306 # Standard port for MariaDB
-}
-
-# Establishing the connection
-conn = mariadb.connect(**db_config)
-# Create a cursor to execute queries
-cursor = conn.cursor()
-
-# Konfiguration der seriellen Schnittstelle
-ser = serial.Serial('/dev/ttyUSB0', 9600)
-
-waageEingeschwungen = False
-
-
-
-def wahrscheinlichkeitsDichte(x,mue, var):
- # in der Funktion wird der Wahrscheinlichkeitsdichtenwert der Variable x für eine bestimmte Normalverteilung berechnet
- standardabweichung = var**0.5
-
- result = 1/(standardabweichung * (2*math.pi)**0.5 ) * math.exp(-0.5 * ((x-mue)/standardabweichung)**2)
-
- return result
-
-
-
-def numberSmallerObjects(numberBiggerObjects, messungWaage, mue1,mue2, sigma2):
- for i in range(1,10000):
- #damit wird geprüft, ob eh auch ein Objekt vom Typ1 auf der Waage liegt, oder nur ein Objekt vom Typ2
- # eigentlich müsste da 3*sigma drinnen stehen, um 99,7% der Fälle abzudecken, aber das ist nur bei einer gültigen Normalverteilung zutreffend (mit ausreichend Messungen)
- if (messungWaage-numberBiggerObjects*(mue2+10*sigma2))/mue1 > 0:
- print((messungWaage-numberBiggerObjects*(mue2+10*sigma2))/mue1)
-
- if i > (messungWaage-numberBiggerObjects*mue2)/mue1:
- return i
- else:
- return -1
-
-
-
-def main():
-
-
- print("connection is open: ", ser.is_open)
- print("port to which it is connected: ", ser.portstr)
-
-
- #an die Waage den Befehl senden, dass sie ausgelesen werden soll
- ser.write(b'getWeight\n')
- #ser.write(b'tare\n')
- serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
-
- # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
- lenString = len(serialString)-1
- if serialString[lenString] == "g" and serialString[lenString-1] == "k":
- print("ist eingeschwungen")
- waageEingeschwungen = True
- else:
- print("die Waage ist noch nicht eingeschwungen")
- waageEingeschwungen = False
-
- #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
- intString = ""
- for i in serialString:
- if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
- intString = intString + i
- print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
-
-
- # wenn die Waage nicht eingeschwungen ist, dann soll auch nichts weiter gemacht werden
- if( waageEingeschwungen == True):
-
-
- # Define the SQL query
- sql_query = "SELECT * FROM projectGeislinger.Einzelteile"
- # Execute the query
- cursor.execute(sql_query)
- # Fetch results
- results = cursor.fetchall()
- # Display data
- print("Ausgabe der Daten der Datenbank:")
- for row in results:
- print(row)
-
-
- # in der Folge wird nun berechnet, welcher Normalverteilung die Messung am ehesten entspricht
- dBId = 0
- maxPropDensity = 0
- for row in results:
- propDens = wahrscheinlichkeitsDichte(float(intString) ,row[2], row[3])
- if propDens > maxPropDensity:
- maxPropDensity = propDens
- dBId = row[0]
-
-
- #Ausgabe des Bauteiltypen, welchem die Messung am ehesten entspricht
- for row in results:
- if row[0] == dBId:
- print(row[1])
-
- #propDens = wahrscheinlichkeitsDichte(0.042 ,results[0][2], results[0][3])
- #print(propDens)
-
-
-
-
-
-
-
- ser.close()
- print("connection is open: ", ser.is_open)
-
-
-
-
-
-
-if __name__ == "__main__":
- main()
-
-
-
diff --git a/readScale_Stand1708.py b/readScale_Stand1708.py
deleted file mode 100644
index 90e0487..0000000
--- a/readScale_Stand1708.py
+++ /dev/null
@@ -1,206 +0,0 @@
-import serial
-import binascii
-import math
-import mariadb
-
-
-# aktuell ist es so programmiert, dass es annimmt, dass in kg gemessen wird (andere Einheiten liefern also flasche Ergebnisse)
-# das was man noch dazuprogrammieren kann, ist wenn mehrere Teile auf der Waage liegen, ob dann die Typen noch immer erkannt werden
-
-
-
-
-db_config = {
- 'user': 'dbUser',
- 'password': 'dbPassword',
- 'host': 'localhost',
- 'database': 'projectGeislinger',
- 'port': 3306 # Standard port for MariaDB
-}
-
-# Establishing the connection
-conn = mariadb.connect(**db_config)
-# Create a cursor to execute queries
-cursor = conn.cursor()
-
-# Konfiguration der seriellen Schnittstelle
-ser = serial.Serial('/dev/ttyUSB0', 9600)
-
-waageEingeschwungen = False
-
-def getDataOfArticleType(allArticles, articleType):
- # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
-
- for i in allArticles:
- if i[1] == articleType:
- return i
-
- return -1
-
-def getDataOfArticleNotType(allArticles, articleType):
- # die Funktion geht die Liste mit allen Artikeln durch und gibt jene Einträge, welche nicht mit dem "articleTypen" übereinstimmt zurück
- returnMatrix = []
-
- for i in allArticles:
- if i[1] != articleType:
- returnMatrix.append(i)
-
- return returnMatrix
-
-
-
-
-
-def wahrscheinlichkeitsDichte(x,mue, var):
- # in der Funktion wird der Wahrscheinlichkeitsdichtenwert der Variable x für eine bestimmte Normalverteilung berechnet
- standardabweichung = var**0.5
-
- result = 1/(standardabweichung * (2*math.pi)**0.5 ) * math.exp(-0.5 * ((x-mue)/standardabweichung)**2)
-
- return result
-
-
-def generateArticleProbabilities(articleType, allArticles, n, x, numberOfOtherTypes, measuredWeight):
- # es fehtl noch eine Datavariable, welche die Daten der Datenbank beinhaltet
-
- # articleType ... die Artikeltype, welche erwartet wird (also für welche n+x überprüft wird)
- # n ... Anzahl der Artikel, welche laut dem Auftrag vorhanden sein sollten
- # x ... Anzahl der Artikel vom Artikeltypen des Auftrages, welche über der Anzahl n noch überprüft werden sollen
- # numberofOtherTypes ... Anzahl an Artikeln, welch von anderen Typen überprüft werden sollen
- # measuredWeight ... das Gewicht, welches von der Waage gemessen wird
-
- # über alle Möglichkeiten drüberiterieren, die Wahrscheinlichkeitsdichte für diese berechnen und in einer Matrix speichern.
-
- # in der Folge werden die artikelbezogenen Daten in einer Matrix zusammengefasst
- articleData = getDataOfArticleType(allArticles, articleType)
- if articleData == -1:
- return -1
-
- otherArticleData = getDataOfArticleNotType(allArticles, articleType)
-
-
- #print("AData: ", articleData)
- print("NArticleData: ", otherArticleData)
-
- #print(wahrscheinlichkeitsDichte(measuredWeight, articleData[1], articleData[2]))
-
-
- articleProbMatix = []
-
- for i in range(numberOfOtherTypes+1):
- for j in range(n+x):
- anzArtikelToCheck = j+1
- propDensity = wahrscheinlichkeitsDichte(measuredWeight*anzArtikelToCheck, articleData[2], articleData[3])
- print(propDensity)
-
-
-
- return 0
-
-
-
-
-'''
-def numberSmallerObjects(numberBiggerObjects, messungWaage, mue1,mue2, sigma2):
- for i in range(1,10000):
- #damit wird geprüft, ob eh auch ein Objekt vom Typ1 auf der Waage liegt, oder nur ein Objekt vom Typ2
- # eigentlich müsste da 3*sigma drinnen stehen, um 99,7% der Fälle abzudecken, aber das ist nur bei einer gültigen Normalverteilung zutreffend (mit ausreichend Messungen)
- if (messungWaage-numberBiggerObjects*(mue2+10*sigma2))/mue1 > 0:
- print((messungWaage-numberBiggerObjects*(mue2+10*sigma2))/mue1)
-
- if i > (messungWaage-numberBiggerObjects*mue2)/mue1:
- return i
- else:
- return -1
-'''
-
-
-def main():
-
-
- print("connection is open: ", ser.is_open)
- print("port to which it is connected: ", ser.portstr)
-
-
- #an die Waage den Befehl senden, dass sie ausgelesen werden soll
- ser.write(b'getWeight\n')
- #ser.write(b'tare\n')
- serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
-
- # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
- lenString = len(serialString)-1
- if serialString[lenString] == "g" and serialString[lenString-1] == "k":
- print("ist eingeschwungen")
- waageEingeschwungen = True
- else:
- print("die Waage ist noch nicht eingeschwungen")
- waageEingeschwungen = False
-
- #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
- intString = ""
- for i in serialString:
- if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
- intString = intString + i
- print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
-
-
- # wenn die Waage nicht eingeschwungen ist, dann soll auch nichts weiter gemacht werden
- if( waageEingeschwungen == True):
-
- # new SWL-Query
- sql_query = "SELECT * FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id "
- # Execute the query
- cursor.execute(sql_query)
- # Fetch results
- auftragDaten = cursor.fetchall()
- # Display data
- print("Ausgabe der Daten der Datenbank:")
- for row in auftragDaten:
- print(row)
-
-
- # Define the SQL query
- sql_query = "SELECT * FROM projectGeislinger.Einzelteile"
- # Execute the query
- cursor.execute(sql_query)
- # Fetch results
- einzelteile = cursor.fetchall()
- # Display data
- print("Ausgabe der Daten der Datenbank:")
- for row in einzelteile:
- print(row)
-
-
-
-
- #print(einzelteile)
-
- #
- selectedRow = 0 #diese wird durch die GUI vorgegeben, oder automatische ausgewählt
-
- artikelBezeichnung = auftragDaten[selectedRow][5]
-
- # 10 Anzahl laut Auftrag, 3, Anzahl darüber, 1 Anzahl anderer Typ
- generateArticleProbabilities(artikelBezeichnung, einzelteile, 2, 0,1, float(intString))
-
-
-
-
-
-
-
-
-
- ser.close()
- print("connection is open: ", ser.is_open)
-
-
-
-
-
-
-if __name__ == "__main__":
- main()
-
-
-
diff --git a/saved_frames/hand_20241025_105036.jpg b/saved_frames/hand_20241025_105036.jpg
deleted file mode 100644
index bfd43ef..0000000
Binary files a/saved_frames/hand_20241025_105036.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_105916.jpg b/saved_frames/hand_20241025_105916.jpg
deleted file mode 100644
index 006733c..0000000
Binary files a/saved_frames/hand_20241025_105916.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_105917.jpg b/saved_frames/hand_20241025_105917.jpg
deleted file mode 100644
index 0874518..0000000
Binary files a/saved_frames/hand_20241025_105917.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_105918.jpg b/saved_frames/hand_20241025_105918.jpg
deleted file mode 100644
index 8053a19..0000000
Binary files a/saved_frames/hand_20241025_105918.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_105919.jpg b/saved_frames/hand_20241025_105919.jpg
deleted file mode 100644
index 0d1d516..0000000
Binary files a/saved_frames/hand_20241025_105919.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_105920.jpg b/saved_frames/hand_20241025_105920.jpg
deleted file mode 100644
index c7e8dc7..0000000
Binary files a/saved_frames/hand_20241025_105920.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_105921.jpg b/saved_frames/hand_20241025_105921.jpg
deleted file mode 100644
index 3625894..0000000
Binary files a/saved_frames/hand_20241025_105921.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_110016.jpg b/saved_frames/hand_20241025_110016.jpg
deleted file mode 100644
index df9ec14..0000000
Binary files a/saved_frames/hand_20241025_110016.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_110017.jpg b/saved_frames/hand_20241025_110017.jpg
deleted file mode 100644
index 867b261..0000000
Binary files a/saved_frames/hand_20241025_110017.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_110018.jpg b/saved_frames/hand_20241025_110018.jpg
deleted file mode 100644
index e8bada3..0000000
Binary files a/saved_frames/hand_20241025_110018.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_110021.jpg b/saved_frames/hand_20241025_110021.jpg
deleted file mode 100644
index 17f67a9..0000000
Binary files a/saved_frames/hand_20241025_110021.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_110028.jpg b/saved_frames/hand_20241025_110028.jpg
deleted file mode 100644
index 42b53cc..0000000
Binary files a/saved_frames/hand_20241025_110028.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_110031.jpg b/saved_frames/hand_20241025_110031.jpg
deleted file mode 100644
index 7c5736c..0000000
Binary files a/saved_frames/hand_20241025_110031.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_110032.jpg b/saved_frames/hand_20241025_110032.jpg
deleted file mode 100644
index bc5c6a2..0000000
Binary files a/saved_frames/hand_20241025_110032.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_114821.jpg b/saved_frames/hand_20241025_114821.jpg
deleted file mode 100644
index 6758f42..0000000
Binary files a/saved_frames/hand_20241025_114821.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_114826.jpg b/saved_frames/hand_20241025_114826.jpg
deleted file mode 100644
index 128bf45..0000000
Binary files a/saved_frames/hand_20241025_114826.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_114827.jpg b/saved_frames/hand_20241025_114827.jpg
deleted file mode 100644
index a9192a5..0000000
Binary files a/saved_frames/hand_20241025_114827.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_120810.jpg b/saved_frames/hand_20241025_120810.jpg
deleted file mode 100644
index c92a8ef..0000000
Binary files a/saved_frames/hand_20241025_120810.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_120811.jpg b/saved_frames/hand_20241025_120811.jpg
deleted file mode 100644
index 92f767c..0000000
Binary files a/saved_frames/hand_20241025_120811.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_120813.jpg b/saved_frames/hand_20241025_120813.jpg
deleted file mode 100644
index 915bc66..0000000
Binary files a/saved_frames/hand_20241025_120813.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241025_121052.jpg b/saved_frames/hand_20241025_121052.jpg
deleted file mode 100644
index 1c52200..0000000
Binary files a/saved_frames/hand_20241025_121052.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241028_081631.jpg b/saved_frames/hand_20241028_081631.jpg
deleted file mode 100644
index 217c759..0000000
Binary files a/saved_frames/hand_20241028_081631.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241028_090057.jpg b/saved_frames/hand_20241028_090057.jpg
deleted file mode 100644
index 7e63002..0000000
Binary files a/saved_frames/hand_20241028_090057.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241028_090058.jpg b/saved_frames/hand_20241028_090058.jpg
deleted file mode 100644
index 2df34ee..0000000
Binary files a/saved_frames/hand_20241028_090058.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241028_095023.jpg b/saved_frames/hand_20241028_095023.jpg
deleted file mode 100644
index cd4e74c..0000000
Binary files a/saved_frames/hand_20241028_095023.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241028_095024.jpg b/saved_frames/hand_20241028_095024.jpg
deleted file mode 100644
index 60b4a13..0000000
Binary files a/saved_frames/hand_20241028_095024.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241028_095025.jpg b/saved_frames/hand_20241028_095025.jpg
deleted file mode 100644
index 684fcb4..0000000
Binary files a/saved_frames/hand_20241028_095025.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241028_095026.jpg b/saved_frames/hand_20241028_095026.jpg
deleted file mode 100644
index a549477..0000000
Binary files a/saved_frames/hand_20241028_095026.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241028_095027.jpg b/saved_frames/hand_20241028_095027.jpg
deleted file mode 100644
index 9ec6b47..0000000
Binary files a/saved_frames/hand_20241028_095027.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241028_095028.jpg b/saved_frames/hand_20241028_095028.jpg
deleted file mode 100644
index 602af33..0000000
Binary files a/saved_frames/hand_20241028_095028.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241028_095029.jpg b/saved_frames/hand_20241028_095029.jpg
deleted file mode 100644
index 0f79999..0000000
Binary files a/saved_frames/hand_20241028_095029.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241028_095030.jpg b/saved_frames/hand_20241028_095030.jpg
deleted file mode 100644
index 48f8a7d..0000000
Binary files a/saved_frames/hand_20241028_095030.jpg and /dev/null differ
diff --git a/saved_frames/hand_20241028_095031.jpg b/saved_frames/hand_20241028_095031.jpg
deleted file mode 100644
index 0dfe8b5..0000000
Binary files a/saved_frames/hand_20241028_095031.jpg and /dev/null differ
diff --git a/saved_frames/oring_d300_b_20241028_095016.jpg b/saved_frames/oring_d300_b_20241028_095016.jpg
deleted file mode 100644
index a15991b..0000000
Binary files a/saved_frames/oring_d300_b_20241028_095016.jpg and /dev/null differ
diff --git a/saved_frames/ring_58mm_20241025_114822.jpg b/saved_frames/ring_58mm_20241025_114822.jpg
deleted file mode 100644
index 429f7e2..0000000
Binary files a/saved_frames/ring_58mm_20241025_114822.jpg and /dev/null differ
diff --git a/saved_frames/ring_58mm_20241025_114823.jpg b/saved_frames/ring_58mm_20241025_114823.jpg
deleted file mode 100644
index a2d526d..0000000
Binary files a/saved_frames/ring_58mm_20241025_114823.jpg and /dev/null differ
diff --git a/saved_frames/ring_58mm_20241025_114824.jpg b/saved_frames/ring_58mm_20241025_114824.jpg
deleted file mode 100644
index 1af5a41..0000000
Binary files a/saved_frames/ring_58mm_20241025_114824.jpg and /dev/null differ
diff --git a/saved_frames/ring_58mm_20241025_114825.jpg b/saved_frames/ring_58mm_20241025_114825.jpg
deleted file mode 100644
index 719b657..0000000
Binary files a/saved_frames/ring_58mm_20241025_114825.jpg and /dev/null differ
diff --git a/saved_frames/schraube_sk_m10x45_20241025_110317.jpg b/saved_frames/schraube_sk_m10x45_20241025_110317.jpg
deleted file mode 100644
index b3dc37d..0000000
Binary files a/saved_frames/schraube_sk_m10x45_20241025_110317.jpg and /dev/null differ
diff --git a/test.ui b/test.ui
deleted file mode 100644
index fb22795..0000000
--- a/test.ui
+++ /dev/null
@@ -1,230 +0,0 @@
-
-
- MainWindow
-
-
-
- 0
- 0
- 1090
- 675
-
-
-
- MainWindow
-
-
-
-
-
- 900
- 80
- 111
- 25
-
-
-
- load Auftrag
-
-
-
-
-
- 10
- 10
- 661
- 192
-
-
-
- QAbstractItemView::NoEditTriggers
-
-
-
- T1
-
-
-
-
- Pos.-Nr
-
-
-
- 8
-
-
-
-
-
- Matnr mit hoechster Version
-
-
-
- 8
-
-
-
-
-
- Bezeichnung + Werkstoff
-
-
-
- 8
-
-
-
-
-
- Menge
-
-
-
- 8
-
-
-
-
-
- Lgort
-
-
-
- 8
-
-
-
- -
-
- I1
-
-
-
-
-
-
- 900
- 20
- 121
- 17
-
-
-
- Auftragsnummer:
-
-
-
-
-
- 860
- 40
- 221
- 31
-
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html>
-
-
-
-
-
- 450
- 350
- 161
- 25
-
-
-
- Bauteiltype erkennen
-
-
-
-
-
- 620
- 350
- 221
- 31
-
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html>
-
-
-
-
-
- 640
- 330
- 181
- 20
-
-
-
- Bezeichnung
-
-
-
-
-
- 910
- 330
- 67
- 17
-
-
-
- Pos.-Nr:
-
-
-
-
-
- 850
- 350
- 191
- 31
-
-
-
-
-
-
- 460
- 420
- 151
- 23
-
-
-
- Bauteiltype locked
-
-
- false
-
-
-
-
-
-
-
-
-
diff --git a/test2.ui.py b/test2.ui.py
deleted file mode 100644
index 21a878b..0000000
--- a/test2.ui.py
+++ /dev/null
@@ -1,274 +0,0 @@
-
-
- MainWindow
-
-
-
- 0
- 0
- 1374
- 725
-
-
-
- MainWindow
-
-
-
- true
-
-
-
-
- 30
- 200
- 591
- 371
-
-
-
- false
-
-
- QAbstractItemView::NoEditTriggers
-
-
-
- T1
-
-
-
-
- Pos.-Nr
-
-
-
- 8
-
-
-
-
-
- Matnr mit hoechster Version
-
-
-
- 8
-
-
-
-
-
- Bezeichnung + Werkstoff
-
-
-
- 8
-
-
-
-
-
- Menge
-
-
-
- 8
-
-
-
-
-
- Lgort
-
-
-
- 8
-
-
-
- -
-
- I1
-
-
-
-
-
-
- 9
- 9
- 611
- 151
-
-
-
- Bauteile
-
-
-
-
- 170
- 30
- 221
- 71
-
-
-
- QFrame::StyledPanel
-
-
- QFrame::Raised
-
-
-
-
- 31
- 34
- 269
- 76
-
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-hr { height: 1px; border-width: 0; }
-li.unchecked::marker { content: "\2610"; }
-li.checked::marker { content: "\2612"; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt;"><br /></p></body></html>
-
-
-
-
-
- 31
- 11
- 73
- 17
-
-
-
- Bezeichnung
-
-
-
-
-
-
- 420
- 40
- 171
- 71
-
-
-
- -
-
-
- Pos.-Nr:
-
-
-
- -
-
-
-
-
-
-
-
- 20
- 40
- 161
- 81
-
-
-
- -
-
-
- Bauteiltype erkennen
-
-
- false
-
-
- false
-
-
- false
-
-
- false
-
-
-
- -
-
-
- Bauteiltype locked
-
-
- false
-
-
-
-
-
-
-
-
-
- 640
- 20
- 351
- 571
-
-
-
- -
-
-
- Auftrag
-
-
-
-
- 10
- 32
- 331
- 481
-
-
-
-
-
-
-
- Auftragsnummer:
-
-
-
- -
-
-
- load Auftrag
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/test_ui.py b/test_ui.py
deleted file mode 100644
index 7866ec7..0000000
--- a/test_ui.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/bjoern/git/GeislingerProject/test.ui'
-#
-# Created by: PyQt5 UI code generator 5.15.11
-#
-# WARNING: Any manual changes made to this file will be lost when pyuic5 is
-# run again. Do not edit this file unless you know what you are doing.
-
-
-from PyQt5 import QtCore, QtGui, QtWidgets
-
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1090, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.btn1 = QtWidgets.QPushButton(self.centralwidget)
- self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
- self.btn1.setObjectName("btn1")
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
- self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
- self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
- self.AuftragsdetailsTable.setColumnCount(5)
- self.AuftragsdetailsTable.setRowCount(1)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(0, 0, item)
- self.label = QtWidgets.QLabel(self.centralwidget)
- self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
- self.label.setObjectName("label")
- self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
- self.textEdit.setObjectName("textEdit")
- self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
- self.bauteilTypBtn.setGeometry(QtCore.QRect(450, 350, 161, 25))
- self.bauteilTypBtn.setObjectName("bauteilTypBtn")
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
- self.bauteiltypTextbox.setGeometry(QtCore.QRect(620, 350, 221, 31))
- self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
- self.label_3 = QtWidgets.QLabel(self.centralwidget)
- self.label_3.setGeometry(QtCore.QRect(640, 330, 181, 20))
- self.label_3.setObjectName("label_3")
- self.label_4 = QtWidgets.QLabel(self.centralwidget)
- self.label_4.setGeometry(QtCore.QRect(910, 330, 67, 17))
- self.label_4.setObjectName("label_4")
- self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit_3.setGeometry(QtCore.QRect(850, 350, 191, 31))
- self.textEdit_3.setObjectName("textEdit_3")
- self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
- self.checkBox.setGeometry(QtCore.QRect(460, 420, 151, 23))
- self.checkBox.setChecked(False)
- self.checkBox.setObjectName("checkBox")
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
- self.menubar.setObjectName("menubar")
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
-
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
- item = self.AuftragsdetailsTable.verticalHeaderItem(0)
- item.setText(_translate("MainWindow", "T1"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Pos.-Nr"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
- item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
- item.setText(_translate("MainWindow", "Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
- item.setText(_translate("MainWindow", "Lgort"))
- __sortingEnabled = self.AuftragsdetailsTable.isSortingEnabled()
- self.AuftragsdetailsTable.setSortingEnabled(False)
- item = self.AuftragsdetailsTable.item(0, 0)
- item.setText(_translate("MainWindow", "I1"))
- self.AuftragsdetailsTable.setSortingEnabled(__sortingEnabled)
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.textEdit.setHtml(_translate("MainWindow", "\n"
-"\n"
-"
"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
- self.bauteiltypTextbox.setHtml(_translate("MainWindow", "\n"
-"\n"
-"
"))
- self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
- self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
diff --git a/testbjoern.py b/testbjoern.py
deleted file mode 100644
index 38fb692..0000000
--- a/testbjoern.py
+++ /dev/null
@@ -1,189 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file 'test2.ui.py'
-#
-# Created by: PyQt5 UI code generator 5.15.11
-#
-# WARNING: Any manual changes made to this file will be lost when pyuic5 is
-# run again. Do not edit this file unless you know what you are doing.
-
-
-from PyQt5 import QtCore, QtGui, QtWidgets
-import signal
-
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1374, 725)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setEnabled(True)
- self.centralwidget.setObjectName("centralwidget")
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setGeometry(QtCore.QRect(30, 200, 591, 371))
- self.AuftragsdetailsTable.setAutoFillBackground(False)
- self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
- self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
- self.AuftragsdetailsTable.setColumnCount(5)
- self.AuftragsdetailsTable.setRowCount(1)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(0, 0, item)
- self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
- self.groupBox.setGeometry(QtCore.QRect(9, 9, 611, 151))
- self.groupBox.setObjectName("groupBox")
- self.frame = QtWidgets.QFrame(self.groupBox)
- self.frame.setGeometry(QtCore.QRect(170, 30, 221, 71))
- self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
- self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
- self.frame.setObjectName("frame")
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.frame)
- self.bauteiltypTextbox.setGeometry(QtCore.QRect(31, 34, 269, 76))
- self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
- self.label_3 = QtWidgets.QLabel(self.frame)
- self.label_3.setGeometry(QtCore.QRect(31, 11, 73, 17))
- self.label_3.setObjectName("label_3")
- self.widget = QtWidgets.QWidget(self.groupBox)
- self.widget.setGeometry(QtCore.QRect(420, 40, 171, 71))
- self.widget.setObjectName("widget")
- self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget)
- self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
- self.verticalLayout_2.setObjectName("verticalLayout_2")
- self.label_4 = QtWidgets.QLabel(self.widget)
- self.label_4.setObjectName("label_4")
- self.verticalLayout_2.addWidget(self.label_4)
- self.textEdit_3 = QtWidgets.QTextEdit(self.widget)
- self.textEdit_3.setObjectName("textEdit_3")
- self.verticalLayout_2.addWidget(self.textEdit_3)
- self.widget1 = QtWidgets.QWidget(self.groupBox)
- self.widget1.setGeometry(QtCore.QRect(20, 40, 161, 81))
- self.widget1.setObjectName("widget1")
- self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.widget1)
- self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
- self.verticalLayout_3.setObjectName("verticalLayout_3")
- self.bauteilTypBtn = QtWidgets.QPushButton(self.widget1)
- self.bauteilTypBtn.setCheckable(False)
- self.bauteilTypBtn.setAutoDefault(False)
- self.bauteilTypBtn.setDefault(False)
- self.bauteilTypBtn.setFlat(False)
- self.bauteilTypBtn.setObjectName("bauteilTypBtn")
- self.verticalLayout_3.addWidget(self.bauteilTypBtn)
- self.checkBox = QtWidgets.QCheckBox(self.widget1)
- self.checkBox.setChecked(False)
- self.checkBox.setObjectName("checkBox")
- self.verticalLayout_3.addWidget(self.checkBox)
- self.widget2 = QtWidgets.QWidget(self.centralwidget)
- self.widget2.setGeometry(QtCore.QRect(640, 20, 351, 571))
- self.widget2.setObjectName("widget2")
- self.verticalLayout = QtWidgets.QVBoxLayout(self.widget2)
- self.verticalLayout.setContentsMargins(0, 0, 0, 0)
- self.verticalLayout.setObjectName("verticalLayout")
- self.groupBox_2 = QtWidgets.QGroupBox(self.widget2)
- self.groupBox_2.setObjectName("groupBox_2")
- self.widget3 = QtWidgets.QWidget(self.groupBox_2)
- self.widget3.setGeometry(QtCore.QRect(10, 32, 331, 481))
- self.widget3.setObjectName("widget3")
- self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.widget3)
- self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
- self.verticalLayout_4.setObjectName("verticalLayout_4")
- self.label = QtWidgets.QLabel(self.widget3)
- self.label.setObjectName("label")
- self.verticalLayout_4.addWidget(self.label)
- self.btn1 = QtWidgets.QPushButton(self.widget3)
- self.btn1.setObjectName("btn1")
- self.verticalLayout_4.addWidget(self.btn1)
- self.graphicsView = QtWidgets.QGraphicsView(self.widget3)
- self.graphicsView.setObjectName("graphicsView")
- self.verticalLayout_4.addWidget(self.graphicsView)
- self.verticalLayout.addWidget(self.groupBox_2)
- MainWindow.setCentralWidget(self.centralwidget)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
-
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- item = self.AuftragsdetailsTable.verticalHeaderItem(0)
- item.setText(_translate("MainWindow", "T1"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Pos.-Nr"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
- item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
- item.setText(_translate("MainWindow", "Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
- item.setText(_translate("MainWindow", "Lgort"))
- __sortingEnabled = self.AuftragsdetailsTable.isSortingEnabled()
- self.AuftragsdetailsTable.setSortingEnabled(False)
- item = self.AuftragsdetailsTable.item(0, 0)
- item.setText(_translate("MainWindow", "I1"))
- self.AuftragsdetailsTable.setSortingEnabled(__sortingEnabled)
- self.groupBox.setTitle(_translate("MainWindow", "Bauteile"))
- self.bauteiltypTextbox.setHtml(_translate("MainWindow", "\n"
-"\n"
-"
"))
- self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
- self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
- self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
- self.groupBox_2.setTitle(_translate("MainWindow", "Auftrag"))
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
-
-def signal_handler(sig, frame):
- QtWidgets.QApplication.quit()
-
-if __name__ == "__main__":
- import sys
- app = QtWidgets.QApplication(sys.argv)
-
- # Handle Ctrl+C (SIGINT) to close the application
- signal.signal(signal.SIGINT, signal_handler)
-
- # Create a timer that runs in the background to process signals
- timer = QtCore.QTimer()
- timer.start(100) # Timer set to trigger every 100 ms
- timer.timeout.connect(lambda: None) # No-op to keep the event loop running
-
- MainWindow = QtWidgets.QMainWindow()
- ui = Ui_MainWindow()
- ui.setupUi(MainWindow)
- MainWindow.show()
- sys.exit(app.exec_())
diff --git a/testbjoern2.ui b/testbjoern2.ui
deleted file mode 100644
index 40da592..0000000
--- a/testbjoern2.ui
+++ /dev/null
@@ -1,246 +0,0 @@
-
-
- MainWindow
-
-
-
- 0
- 0
- 1090
- 675
-
-
-
- MainWindow
-
-
-
-
-
- 900
- 80
- 111
- 25
-
-
-
- load Auftrag
-
-
-
-
-
- 10
- 10
- 661
- 192
-
-
-
- QAbstractItemView::NoEditTriggers
-
-
-
- T1
-
-
-
-
- Pos.-Nr
-
-
-
- 8
-
-
-
-
-
- Matnr mit hoechster Version
-
-
-
- 8
-
-
-
-
-
- Bezeichnung + Werkstoff
-
-
-
- 8
-
-
-
-
-
- Menge
-
-
-
- 8
-
-
-
-
-
- Lgort
-
-
-
- 8
-
-
-
- -
-
- I1
-
-
-
-
-
-
- 900
- 20
- 121
- 17
-
-
-
- Auftragsnummer:
-
-
-
-
-
- 860
- 40
- 221
- 31
-
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-hr { height: 1px; border-width: 0; }
-li.unchecked::marker { content: "\2610"; }
-li.checked::marker { content: "\2612"; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt;"><br /></p></body></html>
-
-
-
-
-
- 60
- 340
- 161
- 25
-
-
-
- Bauteiltype erkennen
-
-
-
-
-
- 230
- 340
- 221
- 31
-
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-hr { height: 1px; border-width: 0; }
-li.unchecked::marker { content: "\2610"; }
-li.checked::marker { content: "\2612"; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt;"><br /></p></body></html>
-
-
-
-
-
- 250
- 320
- 181
- 20
-
-
-
- Bezeichnung
-
-
-
-
-
- 520
- 320
- 67
- 17
-
-
-
- Pos.-Nr:
-
-
-
-
-
- 460
- 340
- 191
- 31
-
-
-
-
-
-
- 70
- 410
- 151
- 23
-
-
-
- Bauteiltype locked
-
-
- false
-
-
-
-
-
- 800
- 280
- 256
- 192
-
-
-
-
-
-
-
-
-
-
diff --git a/testbjoern2_ui.py b/testbjoern2_ui.py
deleted file mode 100644
index 014d94f..0000000
--- a/testbjoern2_ui.py
+++ /dev/null
@@ -1,139 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/bjoern/git/GeislingerProject/testbjoern2.ui'
-#
-# Created by: PyQt5 UI code generator 5.15.11
-#
-# WARNING: Any manual changes made to this file will be lost when pyuic5 is
-# run again. Do not edit this file unless you know what you are doing.
-
-
-from PyQt5 import QtCore, QtGui, QtWidgets
-
-
-class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1090, 675)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.btn1 = QtWidgets.QPushButton(self.centralwidget)
- self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
- self.btn1.setObjectName("btn1")
- self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
- self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
- self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
- self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
- self.AuftragsdetailsTable.setColumnCount(5)
- self.AuftragsdetailsTable.setRowCount(1)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- font = QtGui.QFont()
- font.setPointSize(8)
- item.setFont(font)
- self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- self.AuftragsdetailsTable.setItem(0, 0, item)
- self.label = QtWidgets.QLabel(self.centralwidget)
- self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
- self.label.setObjectName("label")
- self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
- self.textEdit.setObjectName("textEdit")
- self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
- self.bauteilTypBtn.setGeometry(QtCore.QRect(60, 340, 161, 25))
- self.bauteilTypBtn.setObjectName("bauteilTypBtn")
- self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
- self.bauteiltypTextbox.setGeometry(QtCore.QRect(230, 340, 221, 31))
- self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
- self.label_3 = QtWidgets.QLabel(self.centralwidget)
- self.label_3.setGeometry(QtCore.QRect(250, 320, 181, 20))
- self.label_3.setObjectName("label_3")
- self.label_4 = QtWidgets.QLabel(self.centralwidget)
- self.label_4.setGeometry(QtCore.QRect(520, 320, 67, 17))
- self.label_4.setObjectName("label_4")
- self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
- self.textEdit_3.setGeometry(QtCore.QRect(460, 340, 191, 31))
- self.textEdit_3.setObjectName("textEdit_3")
- self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
- self.checkBox.setGeometry(QtCore.QRect(70, 410, 151, 23))
- self.checkBox.setChecked(False)
- self.checkBox.setObjectName("checkBox")
- self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
- self.graphicsView.setGeometry(QtCore.QRect(800, 280, 256, 192))
- self.graphicsView.setObjectName("graphicsView")
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
- self.menubar.setObjectName("menubar")
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
-
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.btn1.setText(_translate("MainWindow", "load Auftrag"))
- item = self.AuftragsdetailsTable.verticalHeaderItem(0)
- item.setText(_translate("MainWindow", "T1"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Pos.-Nr"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
- item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
- item.setText(_translate("MainWindow", "Menge"))
- item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
- item.setText(_translate("MainWindow", "Lgort"))
- __sortingEnabled = self.AuftragsdetailsTable.isSortingEnabled()
- self.AuftragsdetailsTable.setSortingEnabled(False)
- item = self.AuftragsdetailsTable.item(0, 0)
- item.setText(_translate("MainWindow", "I1"))
- self.AuftragsdetailsTable.setSortingEnabled(__sortingEnabled)
- self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
- self.textEdit.setHtml(_translate("MainWindow", "\n"
-"\n"
-"
"))
- self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
- self.bauteiltypTextbox.setHtml(_translate("MainWindow", "\n"
-"\n"
-"
"))
- self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
- self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
- self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
diff --git a/vaapitest.py b/vaapitest.py
deleted file mode 100644
index c3eea25..0000000
--- a/vaapitest.py
+++ /dev/null
@@ -1,43 +0,0 @@
-import cv2
-import numpy as np
-import subprocess
-
-# Define the FFmpeg command to read from the camera
-ffmpeg_command = [
- 'ffmpeg',
- '-f', 'v4l2', # Input format
- '-i', '/dev/video0', # Camera device
- '-f', 'rawvideo', # Output format
- '-pix_fmt', 'bgr24', # Pixel format
- '-an', # Disable audio
- '-sn', # Disable subtitles
- '-'
-]
-
-# Start the FFmpeg process
-process = subprocess.Popen(ffmpeg_command, stdout=subprocess.PIPE, bufsize=10**8)
-
-# Set the width and height for the camera resolution
-width = 1920
-height = 1080
-
-while True:
- # Read a frame from the FFmpeg output
- raw_frame = process.stdout.read(width * height * 3) # 3 bytes per pixel for BGR
- if not raw_frame:
- break # Exit the loop if no more frames
-
- # Convert the byte data to a numpy array and reshape it to an image
- frame = np.frombuffer(raw_frame, np.uint8).reshape((height, width, 3))
-
- # Display the frame using OpenCV
- cv2.imshow('Camera Stream', frame)
-
- # Break the loop on 'q' key press
- if cv2.waitKey(1) & 0xFF == ord('q'):
- break
-
-# Clean up
-process.stdout.close()
-process.wait()
-cv2.destroyAllWindows()