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 - - - - - - - 0 - 0 - 1090 - 22 - - - - - - - - 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 - - - - - - - - 0 - 0 - 1090 - 22 - - - - - - - - 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()