import sys
from PyQt5.QtCore import Qt
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel
from PyQt5.QtWidgets import *
from mv_contact_model import ContactsModel
class AddDialog(QDialog):
"""Add Contact dialog."""
def __init__(self, parent=None):
"""Initializer."""
super().__init__(parent=parent)
self.setWindowTitle("Add Contact")
self.layout = QVBoxLayout()
self.setLayout(self.layout)
self.data = None
self.setupUI()
def setupUI(self):
"""Setup the Add Contact dialog's GUI."""
# Create line edits for data fields
self.nameField = QLineEdit()
self.nameField.setObjectName("Name")
self.jobField = QLineEdit()
self.jobField.setObjectName("Job")
self.emailField = QLineEdit()
self.emailField.setObjectName("Email")
# Lay out the data fields
layout = QFormLayout()
layout.addRow("Name:", self.nameField)
layout.addRow("Job:", self.jobField)
layout.addRow("Email:", self.emailField)
self.layout.addLayout(layout)
# Add standard buttons to the dialog and connect them
self.buttonsBox = QDialogButtonBox(self)
self.buttonsBox.setOrientation(Qt.Horizontal)
self.buttonsBox.setStandardButtons(
QDialogButtonBox.Ok | QDialogButtonBox.Cancel
)
self.buttonsBox.accepted.connect(self.accept)
self.buttonsBox.rejected.connect(self.reject)
self.layout.addWidget(self.buttonsBox)
def accept(self):
"""Accept the data provided through the dialog."""
self.data = []
for field in (self.nameField, self.jobField, self.emailField):
if not field.text():
QMessageBox.critical(
self,
"Error!",
f"You must provide a contact's {field.objectName()}",
)
self.data = None # Reset .data
return
self.data.append(field.text())
if not self.data:
return
super().accept()
class Contacts(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("QTableView Example")
self.resize(800, 400)
# Set up the model
self.ContactsModel = ContactsModel()
# Set up the view
self.view = QTableView()
self.view.setModel(self.ContactsModel.model)
self.view.resizeColumnsToContents()
self.view.setSelectionBehavior(QAbstractItemView.SelectRows)
# Create buttons
self.addButton = QPushButton("添加记录")
self.addButton.clicked.connect(self.openAddDialog)
self.deleteButton = QPushButton("删除记录")
self.deleteButton.clicked.connect(self.deleteContact)
self.clearAllButton = QPushButton("删除所有")
self.clearAllButton.clicked.connect(self.deleteAll)
# 布局
hbox = QHBoxLayout()
vbox = QVBoxLayout()
vbox.addWidget(self.addButton)
vbox.addWidget(self.deleteButton)
vbox.addStretch()
vbox.addWidget(self.clearAllButton)
hbox.addWidget(self.view)
hbox.addLayout(vbox)
mywidget = QWidget()
mywidget.setLayout(hbox)
self.setCentralWidget(mywidget)
def openAddDialog(self):
"""Open the Add Contact dialog."""
dialog = AddDialog(self)
if dialog.exec() == QDialog.Accepted:
self.ContactsModel.addContact(dialog.data)
self.view.resizeColumnsToContents()
def deleteContact(self):
"""Delete the selected contact from the database."""
row = self.view.currentIndex().row()
if row < 0:
return
messageBox = QMessageBox.warning(
self,
"Warning!",
"Do you want to remove the selected contact?",
QMessageBox.Ok | QMessageBox.Cancel,
)
if messageBox == QMessageBox.Ok:
self.ContactsModel.deleteContact(row)
def deleteAll(self):
"""delete all records in the contacts table"""
QMessageBox.warning(
self,
"Info!",
"暂时不支持清除全部记录",
QMessageBox.Ok,
)
def createConnection():
con = QSqlDatabase.addDatabase("QSQLITE")
con.setDatabaseName("./contacts.sqlite")
if not con.open():
QMessageBox.critical(
None,
"QTableView Example - Error!",
"Database Error: %s" % con.lastError().databaseText(),
)
return False
return True
app = QApplication(sys.argv)
if not createConnection():
sys.exit(1)
win = Contacts()
win.show()
sys.exit(app.exec_())