So I have this (Code Snippet):
#------------------------------------------
# Database Dropdown
#------------------------------------------
#Choose a database to access
Databases = [MainDatabase, CategoryDatabase, UserDatabase]
self.DataBaseComboBox.addItems(Databases)
CurrentDatabase = self.DataBaseComboBox
CurrentDatabase.currentTextChanged.connect(self.DisplayDatabase)
def DisplayDatabase(self):
SelectedDatabase = self.DataBaseComboBox.currentText()
if SelectedDatabase == CategoryDatabase:
TableName = "Categories"
elif SelectedDatabase == UserDatabase:
TableName = "Users"
else:
TableName = ""
#------------------------------------------
# Category Database Display
#------------------------------------------
#Connect to Database
self.db = QSqlDatabase.addDatabase('QSQLITE')
self.db.setDatabaseName(SelectedDatabase)
self.model = QSqlTableModel()
self.delrow = -1
#Initialize Model
self.model.setTable(TableName)
self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
self.model.select()
self.sbar = self.statusBar()
self.CategoryTableView = QTableView()
self.CategoryTableView.setStyleSheet("background-color: rgb(255, 255, 255);")
self.CategoryTableView.setModel(self.model)
self.CategoryTableView.clicked.connect(self.findrow)
self.CategoryTableView.selectionModel().selectionChanged.connect(self.getCellText)
#-------------------------------------------------|
#For Testing: |
self.formLayout.addWidget(self.CategoryTableView)#|
self.setCentralWidget(self.centralwidget) #|
#-------------------------------------------------|
#Original:
# self.formLayout.setWidget(14,0, self.CategoryTableView)
#Only selects cells
self.CategoryTableView.setSelectionBehavior(0)
# 0 Selecting single items.
# 1 Selecting only rows.
# 2 Selecting only columns.
#----------------------------------
#Make Specific Columns Un-Editable/ReadOnly
#----------------------------------
class ReadOnlyDelegate(QStyledItemDelegate):
def createEditor(self, parent, option, index):
print('This column is Read-Only')
return
delegate = ReadOnlyDelegate(self)
self.CategoryTableView.setItemDelegateForColumn(0, delegate) #ID
self.CategoryTableView.setItemDelegateForColumn(3, delegate) #Privilege (for users.db)
#----------------------------------
def findrow(self, i):
self.delrow = i.row()
def getCellText(self):
if self.CategoryTableView.selectedIndexes():
model = self.CategoryTableView.model()
row = self.selectedRow()
column = 1
def selectedRow(self):
if self.CategoryTableView.selectionModel().hasSelection():
row = self.CategoryTableView.selectionModel().selectedIndexes()[0].row()
return int(row)
def selectedColumn(self):
column = self.CategoryTableView.selectionModel().selectedIndexes()[0].column()
return int(column)
#------------------------------------------
And it techinaclly works, but when I want to switch between tables, It opens a new one instead of getting rid of the old table and replacing it with the one I want to view (I have attached a screenshot below, showing the problem).
Any way I can fix this?
Full code:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
import sys
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel
from PyQt5.QtWidgets import QMessageBox, QTableView, QWidget, QStyledItemDelegate
from Constants import MainDatabase, UserDatabase, CategoryDatabase
class Ui_SettingsScreen(QtWidgets.QMainWindow):
def __init__(self, parent = None):
super(Ui_SettingsScreen, self).__init__(parent)
self.setObjectName("MainWindow")
self.setFixedSize(942, 841)
self.setStyleSheet("background-color: rgb(0, 170, 255);")
self.centralwidget = QWidget(self)
self.centralwidget.setObjectName("centralwidget")
self.formLayout = QtWidgets.QFormLayout(self.centralwidget)
self.formLayout.setObjectName("formLayout")
self.SettingsLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(15)
font.setBold(True)
font.setWeight(75)
self.SettingsLabel.setFont(font)
self.SettingsLabel.setStyleSheet("background-color: rgb(0, 0, 0);\n"
"color: rgb(255, 255, 255);\n"
"\n"
"border-style: outset;\n"
"border-width: 2px;\n"
"border-radius: 15px;\n"
"border-color: black;\n"
"padding: 4px;")
self.SettingsLabel.setAlignment(QtCore.Qt.AlignCenter)
self.SettingsLabel.setObjectName("SettingsLabel")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.SpanningRole, self.SettingsLabel)
spacerItem = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.formLayout.setItem(1, QtWidgets.QFormLayout.LabelRole, spacerItem)
self.DataBaseLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setItalic(False)
font.setWeight(75)
self.DataBaseLabel.setFont(font)
self.DataBaseLabel.setAlignment(QtCore.Qt.AlignCenter)
self.DataBaseLabel.setObjectName("DataBaseLabel")
self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.DataBaseLabel)
self.DataBaseComboBox = QtWidgets.QComboBox(self.centralwidget)
self.DataBaseComboBox.setStyleSheet("background-color: rgb(255, 255, 255);")
self.DataBaseComboBox.setObjectName("DataBaseComboBox")
self.formLayout.setWidget(7, QtWidgets.QFormLayout.LabelRole, self.DataBaseComboBox)
self.CategoryListLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.CategoryListLabel.setFont(font)
self.CategoryListLabel.setAlignment(QtCore.Qt.AlignCenter)
self.CategoryListLabel.setObjectName("CategoryListLabel")
self.formLayout.setWidget(12, QtWidgets.QFormLayout.LabelRole, self.CategoryListLabel)
self.SaveButton = QtWidgets.QPushButton(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.SaveButton.setFont(font)
self.SaveButton.setStyleSheet("background-color: rgb(225, 225, 225);\n"
"border-style: outset;\n"
"border-width: 2px;\n"
"border-color: black;\n"
"padding: 4px;")
self.SaveButton.setObjectName("SaveButton")
self.formLayout.setWidget(15, QtWidgets.QFormLayout.LabelRole, self.SaveButton)
spacerItem1 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.formLayout.setItem(16, QtWidgets.QFormLayout.LabelRole, spacerItem1)
self.RegisterUserLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(15)
font.setBold(True)
font.setUnderline(False)
font.setWeight(75)
font.setStrikeOut(False)
self.RegisterUserLabel.setFont(font)
self.RegisterUserLabel.setStyleSheet("background-color: rgb(0, 0, 0);\n"
"color: rgb(255, 255, 255);\n"
"\n"
"border-style: outset;\n"
"border-width: 2px;\n"
"border-radius: 15px;\n"
"border-color: black;\n"
"padding: 4px;\n"
"")
self.RegisterUserLabel.setAlignment(QtCore.Qt.AlignCenter)
self.RegisterUserLabel.setObjectName("RegisterUserLabel")
self.formLayout.setWidget(18, QtWidgets.QFormLayout.SpanningRole, self.RegisterUserLabel)
spacerItem2 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.formLayout.setItem(19, QtWidgets.QFormLayout.LabelRole, spacerItem2)
self.NameLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.NameLabel.setFont(font)
self.NameLabel.setObjectName("NameLabel")
self.formLayout.setWidget(20, QtWidgets.QFormLayout.LabelRole, self.NameLabel)
self.NameInput = QtWidgets.QLineEdit(self.centralwidget)
self.NameInput.setStyleSheet("background-color: rgb(255, 255, 255);")
self.NameInput.setObjectName("NameInput")
self.formLayout.setWidget(21, QtWidgets.QFormLayout.LabelRole, self.NameInput)
self.PasswordLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.PasswordLabel.setFont(font)
self.PasswordLabel.setObjectName("PasswordLabel")
self.formLayout.setWidget(22, QtWidgets.QFormLayout.LabelRole, self.PasswordLabel)
self.PasswordInput = QtWidgets.QLineEdit(self.centralwidget)
self.PasswordInput.setStyleSheet("background-color: rgb(255, 255, 255);")
self.PasswordInput.setObjectName("PasswordInput")
self.formLayout.setWidget(23, QtWidgets.QFormLayout.LabelRole, self.PasswordInput)
self.PrivilegeLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.PrivilegeLabel.setFont(font)
self.PrivilegeLabel.setObjectName("PrivilegeLabel")
self.formLayout.setWidget(24, QtWidgets.QFormLayout.LabelRole, self.PrivilegeLabel)
self.PrivilegeComboBox = QtWidgets.QComboBox(self.centralwidget)
self.PrivilegeComboBox.setStyleSheet("background-color: rgb(255, 255, 255);")
self.PrivilegeComboBox.setObjectName("PrivilegeComboBox")
self.formLayout.setWidget(25, QtWidgets.QFormLayout.LabelRole, self.PrivilegeComboBox)
self.SubmitUserButton = QtWidgets.QPushButton(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.SubmitUserButton.setFont(font)
self.SubmitUserButton.setStyleSheet("background-color: rgb(225, 225, 225);\n"
"border-style: outset;\n"
"border-width: 2px;\n"
"border-color: black;\n"
"padding: 4px;")
self.SubmitUserButton.setObjectName("SubmitUserButton")
self.formLayout.setWidget(26, QtWidgets.QFormLayout.LabelRole, self.SubmitUserButton)
spacerItem3 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.formLayout.setItem(27, QtWidgets.QFormLayout.LabelRole, spacerItem3)
self.MoreInfoLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(15)
font.setBold(True)
font.setWeight(75)
self.MoreInfoLabel.setFont(font)
self.MoreInfoLabel.setStyleSheet("background-color: rgb(0, 0, 0);\n"
"color: rgb(255, 255, 255);\n"
"\n"
"border-style: outset;\n"
"border-width: 2px;\n"
"border-radius: 15px;\n"
"border-color: black;\n"
"padding: 4px;\n"
"")
self.MoreInfoLabel.setAlignment(QtCore.Qt.AlignCenter)
self.MoreInfoLabel.setObjectName("MoreInfoLabel")
self.formLayout.setWidget(28, QtWidgets.QFormLayout.SpanningRole, self.MoreInfoLabel)
self.TotalValueLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.TotalValueLabel.setFont(font)
self.TotalValueLabel.setObjectName("TotalValueLabel")
self.formLayout.setWidget(29, QtWidgets.QFormLayout.LabelRole, self.TotalValueLabel)
self.TotalValueResultLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.TotalValueResultLabel.setFont(font)
self.TotalValueResultLabel.setStyleSheet("color: rgb(0, 150, 0);")
self.TotalValueResultLabel.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
self.TotalValueResultLabel.setObjectName("TotalValueResultLabel")
self.formLayout.setWidget(29, QtWidgets.QFormLayout.FieldRole, self.TotalValueResultLabel)
self.InfoLabel2 = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setItalic(True)
self.InfoLabel2.setFont(font)
self.InfoLabel2.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
self.InfoLabel2.setObjectName("InfoLabel2")
self.formLayout.setWidget(30, QtWidgets.QFormLayout.LabelRole, self.InfoLabel2)
spacerItem4 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.formLayout.setItem(31, QtWidgets.QFormLayout.LabelRole, spacerItem4)
self.TotalValueMarkUpLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.TotalValueMarkUpLabel.setFont(font)
self.TotalValueMarkUpLabel.setObjectName("TotalValueMarkUpLabel")
self.formLayout.setWidget(32, QtWidgets.QFormLayout.LabelRole, self.TotalValueMarkUpLabel)
self.TotalValueMarkUpResultLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.TotalValueMarkUpResultLabel.setFont(font)
self.TotalValueMarkUpResultLabel.setStyleSheet("color: rgb(0, 255, 0);")
self.TotalValueMarkUpResultLabel.setObjectName("TotalValueMarkUpResultLabel")
self.formLayout.setWidget(32, QtWidgets.QFormLayout.FieldRole, self.TotalValueMarkUpResultLabel)
self.InfoLabel3 = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setItalic(True)
self.InfoLabel3.setFont(font)
self.InfoLabel3.setObjectName("InfoLabel3")
self.formLayout.setWidget(33, QtWidgets.QFormLayout.LabelRole, self.InfoLabel3)
self.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar()
self.statusbar.setObjectName("statusbar")
self.setStatusBar(self.statusbar)
self.retranslateUi()
QtCore.QMetaObject.connectSlotsByName(self)
#------------------------------------------
# Database Dropdown
#------------------------------------------
#Choose a database to access
Databases = [MainDatabase, CategoryDatabase, UserDatabase]
self.DataBaseComboBox.addItems(Databases)
# #----------------------|
# #Placeholders: |
# SelectedDatabase = "" #|
# TableName = "" #|
# #----------------------|
CurrentDatabase = self.DataBaseComboBox
CurrentDatabase.currentTextChanged.connect(self.DisplayDatabase)
def DisplayDatabase(self):
SelectedDatabase = self.DataBaseComboBox.currentText()
if SelectedDatabase == CategoryDatabase:
TableName = "Categories"
elif SelectedDatabase == UserDatabase:
TableName = "Users"
else:
TableName = ""
#------------------------------------------
# Category Database Display
#------------------------------------------
#Connect to Database
self.db = QSqlDatabase.addDatabase('QSQLITE')
self.db.setDatabaseName(SelectedDatabase)
self.model = QSqlTableModel()
self.delrow = -1
#Initialize Model
self.model.setTable(TableName)
self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
self.model.select()
self.sbar = self.statusBar()
self.CategoryTableView = QTableView()
self.CategoryTableView.setStyleSheet("background-color: rgb(255, 255, 255);")
self.CategoryTableView.setModel(self.model)
self.CategoryTableView.clicked.connect(self.findrow)
self.CategoryTableView.selectionModel().selectionChanged.connect(self.getCellText)
#-------------------------------------------------|
#For Testing: |
self.formLayout.addWidget(self.CategoryTableView)#|
self.setCentralWidget(self.centralwidget) #|
#-------------------------------------------------|
#Original:
# self.formLayout.setWidget(14,0, self.CategoryTableView)
#Only selects cells
self.CategoryTableView.setSelectionBehavior(0)
# 0 Selecting single items.
# 1 Selecting only rows.
# 2 Selecting only columns.
#----------------------------------
#Make Specific Columns Un-Editable/ReadOnly
#----------------------------------
class ReadOnlyDelegate(QStyledItemDelegate):
def createEditor(self, parent, option, index):
print('This column is Read-Only')
return
delegate = ReadOnlyDelegate(self)
self.CategoryTableView.setItemDelegateForColumn(0, delegate) #ID
self.CategoryTableView.setItemDelegateForColumn(3, delegate) #Privilege (for users.db)
#----------------------------------
def findrow(self, i):
self.delrow = i.row()
def getCellText(self):
if self.CategoryTableView.selectedIndexes():
model = self.CategoryTableView.model()
row = self.selectedRow()
column = 1
def selectedRow(self):
if self.CategoryTableView.selectionModel().hasSelection():
row = self.CategoryTableView.selectionModel().selectedIndexes()[0].row()
return int(row)
def selectedColumn(self):
column = self.CategoryTableView.selectionModel().selectedIndexes()[0].column()
return int(column)
# def DisplayDatabase(self):
# SelectedDatabase = self.DataBaseComboBox.currentText()
# # if SelectedDatabase == CategoryDatabase:
# # TableName = "Categories"
# if SelectedDatabase == UserDatabase:
# TableName = "Users"
# else:
# TableName = "Categories"
# return TableName
#------------------------------------------
def retranslateUi(self):
_translate = QtCore.QCoreApplication.translate
self.setWindowTitle(_translate("MainWindow", "Settings"))
self.SettingsLabel.setText(_translate("MainWindow", "Settings"))
self.DataBaseLabel.setText(_translate("MainWindow", "Database"))
self.CategoryListLabel.setText(_translate("MainWindow", "Category List"))
self.SaveButton.setText(_translate("MainWindow", "Save"))
self.RegisterUserLabel.setText(_translate("MainWindow", "Register New User"))
self.NameLabel.setText(_translate("MainWindow", "Name:"))
self.PasswordLabel.setText(_translate("MainWindow", "Password:"))
self.PrivilegeLabel.setText(_translate("MainWindow", "Privilege:"))
self.SubmitUserButton.setText(_translate("MainWindow", "Submit User"))
self.MoreInfoLabel.setText(_translate("MainWindow", "More Info"))
self.TotalValueLabel.setText(_translate("MainWindow", "Total Inventory Value Without Markup:"))
self.TotalValueResultLabel.setText(_translate("MainWindow", "$ "))
self.InfoLabel2.setText(_translate("MainWindow", "(Quantity*Price)"))
self.TotalValueMarkUpLabel.setText(_translate("MainWindow", "Total Inventory Value With Markup:"))
self.TotalValueMarkUpResultLabel.setText(_translate("MainWindow", "$ "))
self.InfoLabel3.setText(_translate("MainWindow", "(Quantity*SellPrice)"))
#----------------------------------------------------------------------------------------------------
#------------------------------------------
# Register New User
#------------------------------------------
#Define Privilege Levels
PrivilegeList = ['Admin','Standard']
self.PrivilegeComboBox.addItems(PrivilegeList)
#When the Submit User button is clicked -> SubmitUserClicked Function
SubmitUserButton = self.SubmitUserButton
SubmitUserButton.clicked.connect(self.SubmitUserClicked)
#----------------------------------
# Submit User Clicked Function
#----------------------------------
def SubmitUserClicked(self):
#Store the inputted values
userInputName = self.NameInput.text()
userInputPassword = self.PasswordInput.text()
userInputPrivilege = self.PrivilegeComboBox.currentText()
myList = [userInputName, userInputPassword, userInputPrivilege]
if userInputName == "":
self.NameLabel.setStyleSheet("color: rgb(255,0,0);")
self.PasswordLabel.setStyleSheet("color: rgb(0,0,0);")
elif userInputPassword == "":
self.PasswordLabel.setStyleSheet("color: rgb(255,0,0);")
self.NameLabel.setStyleSheet("color: rgb(0,0,0);")
else:
#Add the user to the users database
import sqlite3
connection = sqlite3.connect(UserDatabase)
cursor = connection.cursor()
cursor = connection.cursor()
cursor.execute('''
insert into Users (Name, Password, Privilege)
values (?,?,?)
''', myList)
connection.commit()
connection.close()
#Call User Added Popup
self.UserAdded()
#Clear the inputs
self.NameInput.clear()
self.PasswordInput.clear()
#----------------------------------
# User Added Popup
#----------------------------------
def UserAdded(self):
msgBox = QMessageBox()
msgBox.setIcon(QMessageBox.Information)
msgBox.setText("The user was successfully added to the database")
msgBox.setWindowTitle("User Added")
msgBox.setStandardButtons(QMessageBox.Ok)
returnValue = msgBox.exec()
if returnValue == QMessageBox.Ok:
print('The Ok button was clicked')
#------------------------------------------
#----------------------------------------------------------------------------------------------------
#----------------------------------------------------------------------------------------------------
# Run this Program
#----------------------------------------------------------------------------------------------------
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
ui = Ui_SettingsScreen()
ui.show()
sys.exit(app.exec_())
#----------------------------------------------------------------------------------------------------