目錄
1.用PyQt5Designer設計窗體
主窗體
子窗體
2.項目功能及代碼
添加
子窗體函數
設置一個保存內容的文檔
主窗體函數
刪除
修改
主窗體代碼
子窗體代碼
搜索
菜單
其他
主窗體
子窗體
窗口開始界面
3.幾個優化項目界面的功能
QMessageBox函數
設置背景圖片
對提示欄進行設置
對控件設置透明化
日期控件
各個窗體控件的名字我都寫在了下面
首先在子窗體定義一個函數,之後用槽函數把添加按鈕和自定義函數連接起來。
# 添加圖書信息
def insert(self):
# 獲取借閱者的姓名並去除前面的空格1
# strip去除開頭或結尾的空格
name = self.lineEdit_2.text().strip()
books = self.lineEdit.text().strip()
time1 = self.dateEdit.text()
time2 = self.dateEdit_2.text()
if len(name) <= 0 or len(books) <= 0:
# 如果有一個為空位,提示消息並結束此函數
QMessageBox.information(self, "提示", "家人,咱這輸入的不對,要不把空格去掉。", QMessageBox.Ok)
return
# 創建對象並初始化屬性
newBook = mybook.Books(name, books, time1, time2)
# 把新學員對象追加到全局的學員列表中
mybook.Book.append(newBook)
# 獲取表格控件的行數量
# rowCount獲取當前表格部件中的行數
row = self.tableWidget.rowCount()
# 以數量做索引添加一行
# inserter_row用於在表格的指定位置插入一個新行
self.tableWidget.insertRow(row)
# 以借閱者為內容創建表格的一行
item1 = QTableWidgetItem(name)
item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 0, item1)
item2 = QTableWidgetItem(books)
item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 1, item2)
item3 = QTableWidgetItem(time1)
item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 2, item3)
item4 = QTableWidgetItem(time2)
item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 3, item4)
# QMessageBox添加對話框
result = QMessageBox.question(self, "消息", "添加成功,是否接著添加", QMessageBox.Yes | QMessageBox.No)
if result == QMessageBox.Yes:
self.lineEdit_2.setText('')
self.lineEdit.setText('')
if result == QMessageBox.No:
self.close()
因為我還沒有學習數據庫,所以想要保存到表格的內容只能暫時用一個文檔儲存起來
import os
Book = []
def saveStudents():
current_path = os.getcwd() + "\\Book.txt"
f = open(current_path, "w+")
for item in Book:
f.write(item.name + ' ' + item.books + ' ' + item.time1 + ' ' + item.time2 + '\n')
f.close()
class Books(object):
def __init__(self, name, books, time1, time2):
self.name = name
self.books = books
self.time1 = time1
self.time2 = time2
首先定義一個打開子窗體的函數
def openmainWindow(self):
# 創建子窗體對象,並傳參。
self.child = UiMainwindow(-1, "添加", self.tableWidget)
self.child.setWindowModality(Qt.ApplicationModal)
# 固定子窗體的大小
self.child.setFixedSize(self.child.width(), self.child.height())
# 設置子窗體以模態方式打開
self.child.setWindowModality(Qt.ApplicationModal)
# 展示
self.child.show()
# 刪除功能
def deleteStu(self):
# 獲取表格控件中的選中行索引
index = self.tableWidget.currentRow()
# 判斷是否有選中行
if index < 0:
# 如果沒有選中行,提示消息並結束此函數
QMessageBox.information(None, "提示", "請選中刪除行", QMessageBox.Ok)
return
# 消息框詢問是否繼續添加,接收返回值
result = QMessageBox.question(None, "消息", "是否刪除選中行?", QMessageBox.Yes | QMessageBox.No)
# 判斷返回值是否消息框的No按鈕
if result == QMessageBox.Yes:
# 獲取表格控件選中行第一列的內容
name = self.tableWidget.selectedItems()[0].text()
# 刪除表格控件中索引所在行
self.tableWidget.removeRow(index)
# 循環學員列表
for item in Book:
# 如果學員姓名等於刪除行第一列內容
if item.name == name:
# 從學員列表中刪除此學員
Book.remove(item)
break
# 打開修改窗體
def modifyDialogOpen(self):
index = self.tableWidget.currentRow()
# 如果沒有選中行
if index < 0:
QMessageBox.information(None, "提示", "請選中修改的信息", QMessageBox.Ok)
return
# 獲取表格控件中的行的第一行內容
name = self.tableWidget.selectedItems()[0].text()
# 定義變量保存選中學員列表中的索引
index = 0
# 循環學員列表
for item in Book:
if name == item.name:
break
# 學員列表索引+1
index += 1
# 創建窗口對象並傳參
self.child = UiMainwindow(index, "修改", self.tableWidget)
# 設置窗口以應用程序模態打開
self.child.setWindowModality(Qt.ApplicationModal)
# 設置窗口不可調整大小
self.child.setFixedSize(self.child.width(), self.child.height())
self.child.show()
# 修改信息
def alter(self):
# 獲取借閱者的姓名並去除前面的空格
# strip去除開頭或結尾的空格
name = self.lineEdit_2.text().strip()
books = self.lineEdit.text().strip()
time1 = self.dateEdit.text()
time2 = self.dateEdit_2.text()
# dateEdit = QDateTimeEdit(QDate.currentDate(), self)
if len(name) <= 0 or len(books) <= 0:
# 如果有一個為空位,提示消息並結束此函數
QMessageBox.information(self, "提示", "家人,咱這輸入的不對。", QMessageBox.Ok)
return
# 設置表格控件中選中列的文本文件
self.tableWidget.selectedItems()[0].setText(name)
self.tableWidget.selectedItems()[1].setText(books)
self.tableWidget.selectedItems()[2].setText(time1)
self.tableWidget.selectedItems()[3].setText(time2)
mybook.Book[self.index].name = name
mybook.Book[self.index].books = books
mybook.Book[self.index].time1 = time1
mybook.Book[self.index].time2 = time2
# 關閉
result = QMessageBox.question(self, "消息", "修改成功", QMessageBox.Ok)
if result == QMessageBox.Ok:
self.close()
self.close()
# 查找功能
def finding(self):
# 獲取查詢的文本框內容並取消前後空格
name = self.lineEdit.text().strip()
# 判斷查詢內容是否為空
if len(name) <= 0:
# 如果為空,提示用戶
QMessageBox.information(None, "提示", "請輸入借閱者姓名", QMessageBox.Ok)
# 結束此函數
return
# 設置表格控件的數據行為0
self.tableWidget.setRowCount(0)
# 清空表格控件的內容,與上面一行共同使用清空所有行
self.tableWidget.clearContents()
# 循環學員列表,重新加載學員信息顯示在表格控件
for item in Book:
if name == item.name:
# 獲取表格控件的行數
row = self.tableWidget.rowCount()
# 根據行數做索引添加一行
self.tableWidget.insertRow(row)
# 創建列對象,內容是學員名稱
item1 = QTableWidgetItem(item.name)
# 水平垂直方向居中
item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
# 把新建的列對象設置在表格控件索引row所在行,索引0所在列
self.tableWidget.setItem(row, 0, item1)
item2 = QTableWidgetItem(item.books)
item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
# 把新建的列對象設置在表格控件索引row所在行,索引1
self.tableWidget.setItem(row, 1, item2)
item3 = QTableWidgetItem(item.time1)
item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
# 把新建的列對象設置在表格控件索引row所在行,索引2所在列
self.tableWidget.setItem(row, 2, item3)
item4 = QTableWidgetItem(item.time2)
item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
# 把新建的列對象設置在表格控件索引row所在行,索引3 所在列
self.tableWidget.setItem(row, 3, item4)
break
搜索借閱者的名字,可以搜索到想要的同學
點擊鼠標右鍵,可彈出添加、刪除。修改。三個基本功能,另外我又添加了返回功能,是在搜索之後點擊菜單返回表格全部內容。
# 彈出菜單
def rightShowMenu(self):
rightMenu = QMenu()
menu1 = rightMenu.addAction("添加")
menu1.triggered.connect(self.openmainWindow)
menu2 = rightMenu.addAction("修改")
menu2.triggered.connect(self.modifyDialogOpen)
menu3 = rightMenu.addAction("刪除")
menu3.triggered.connect(self.deleteStu)
menu4 = rightMenu.addAction("返回")
menu4.triggered.connect(self.back)
rightMenu.show()
rightMenu.exec_(QCursor.pos())
返回功能很簡單,先把表格當前內容刪除,然後重新加載全部內容。
# 顯示——學員信息顯示在 tableWidget 中
def back(self):
# 設置表格控件的數據行為0
self.tableWidget.setRowCount(0)
# 清空表格控件的內容,與上面一行共同使用清空所有行
self.tableWidget.clearContents()
# 循環學員信息列表
for item in Book:
# 獲取表格控件的行數
row = self.tableWidget.rowCount()
self.tableWidget.insertRow(row)
item1 = QTableWidgetItem(item.name)
item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 0, item1)
item2 = QTableWidgetItem(item.books)
item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 1, item2)
item3 = QTableWidgetItem(item.time1)
item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 2, item3)
item4 = QTableWidgetItem(item.time2)
item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 3, item4)
# 學員信息顯示到table控件裡
def loadTable(self):
# 循環學員信息列表
for item in Book:
# 獲取表格控件的行數
row = self.tableWidget.rowCount()
# 根據行數做索引添加一列
self.tableWidget.insertRow(row)
# 創建列對象
item1 = QTableWidgetItem(item.name)
item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 0, item1)
item2 = QTableWidgetItem(item.books)
item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 1, item2)
item3 = QTableWidgetItem(item.time1)
item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 2, item3)
item4 = QTableWidgetItem(item.time2)
item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 3, item4)
def insert_expurgate(self):
# 判斷標題來進行修改或添加
if self.title == "添加":
self.insert()
else:
self.alter()
# 窗體加載時調用
def myInitWindow(self):
# 單擊保存按鈕調用函數
self.OK.clicked.connect(self.insert_expurgate)
# 如果標題是修改
if self.title == "修改":
self.lineEdit_2.setText(self.tableWidget.selectedItems()[0].text())
self.lineEdit.setText(self.tableWidget.selectedItems()[1].text()
self.dateEdit.setDate(QDate.currentDate())
self.dateEdit_2.setDate(QDate.currentDate().addDays(30))
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from untitled1 import *
class ManagerWindow(QMainWindow):
def closeEvent(self, event):
result = QtWidgets.QMessageBox.question(self, "退出", "是否保存後退出?",
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
if result == QtWidgets.QMessageBox.Yes:
saveStudents()
# 執行關閉功能
event.accept()
# 程序入口
if __name__ == '__main__': # python模擬程序入口
# 創建主窗體
app = QApplication(sys.argv)
# 設計的UI界面實體化
ui = Ui_Dialog()
# 創建主窗體對象,一個應用程序可以有多個窗體,但是一個窗體不能代表一個應用程序。
MainWindow = ManagerWindow()
# 把所有用到的控件化在主窗體上。
ui.setupUi(MainWindow)
# 設置窗體大小不能更改
MainWindow.setFixedSize(MainWindow.width(), MainWindow.height())
# 主窗體自己的寬 #主窗體自己的高
# 顯示主窗體
MainWindow.show()
sys.exit(app.exec_())
大家可能好奇QMessageBox函數,它的功能是產生一個提示框,在報錯或者刪除時彈出來提示。
result = QMessageBox.question(self, "消息", "添加成功,是否接著添加",
QMessageBox.Yes | QMessageBox.No)
QMessageBox.information(self, "提示", "家人,咱這輸入的不對,要不把空格去掉。", QMessageBox.Ok)
# 設置窗體背景圖片
palette = QPalette()
pix = QPixmap("項目圖片/feb1fe93862d873eacf66dd4d82d307e.jpg")
# # 自調背景圖大小和窗體適應
pix = pix.scaled(mainWindow.width(), mainWindow.height())
palette.setBrush(QPalette.Background, QBrush(pix))
mainWindow.setPalette(palette)
# 設置搜索欄提示信息
self.lineEdit.setPlaceholderText('請輸入要查詢的學生姓名……')
# 控件半透明設置
op = QtWidgets.QGraphicsOpacityEffect()
# 0.7是控件的半透明程度
op.setOpacity(0.7)
self.lineEdit.setGraphicsEffect(op)
self.lineEdit.setAutoFillBackground(True)
這個代碼可以讓日期控件上顯示當前日期
self.dateEdit.setDate(QDate.currentDate())
# addDays是在原基礎上增加的天數
self.dateEdit_2.setDate(QDate.currentDate().addDays(30))