|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
|
|
import sqlite3
|
|
|
|
|
|
|
|
|
class Ui_Form(object):
|
|
|
def setupUi(self, Form):
|
|
|
Form.setObjectName("Form")
|
|
|
Form.resize(994, 710)
|
|
|
self.gridLayout_2 = QtWidgets.QGridLayout(Form)
|
|
|
self.gridLayout_2.setObjectName("gridLayout_2")
|
|
|
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
|
|
self.horizontalLayout.setObjectName("horizontalLayout")
|
|
|
|
|
|
self.label = QtWidgets.QLabel(Form)
|
|
|
self.label.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
|
|
|
self.label.setObjectName("label")
|
|
|
self.horizontalLayout.addWidget(self.label)
|
|
|
|
|
|
self.dateEdit = QtWidgets.QDateEdit(Form)
|
|
|
self.dateEdit.setObjectName("dateEdit")
|
|
|
self.horizontalLayout.addWidget(self.dateEdit)
|
|
|
|
|
|
spacerItem = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout.addItem(spacerItem)
|
|
|
|
|
|
self.label_2 = QtWidgets.QLabel(Form)
|
|
|
self.label_2.setObjectName("label_2")
|
|
|
self.horizontalLayout.addWidget(self.label_2)
|
|
|
|
|
|
self.dateEdit_2 = QtWidgets.QDateEdit(Form)
|
|
|
self.dateEdit_2.setObjectName("dateEdit_2")
|
|
|
self.horizontalLayout.addWidget(self.dateEdit_2)
|
|
|
|
|
|
spacerItem1 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout.addItem(spacerItem1)
|
|
|
|
|
|
self.label_3 = QtWidgets.QLabel(Form)
|
|
|
self.label_3.setObjectName("label_3")
|
|
|
self.horizontalLayout.addWidget(self.label_3)
|
|
|
|
|
|
self.lineEdit = QtWidgets.QLineEdit(Form)
|
|
|
self.lineEdit.setObjectName("lineEdit")
|
|
|
self.horizontalLayout.addWidget(self.lineEdit)
|
|
|
|
|
|
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout.addItem(spacerItem2)
|
|
|
|
|
|
self.pushButton = QtWidgets.QPushButton(Form)
|
|
|
self.pushButton.setObjectName("pushButton")
|
|
|
self.horizontalLayout.addWidget(self.pushButton)
|
|
|
|
|
|
self.horizontalLayout.setStretch(1, 2)
|
|
|
self.horizontalLayout.setStretch(4, 2)
|
|
|
|
|
|
self.gridLayout_2.addLayout(self.horizontalLayout, 0, 0, 1, 1)
|
|
|
|
|
|
self.tableView = QtWidgets.QTableView(Form)
|
|
|
self.tableView.setObjectName("tableView")
|
|
|
self.gridLayout_2.addWidget(self.tableView, 1, 0, 1, 1)
|
|
|
|
|
|
self.signalconnect()
|
|
|
self.set_dates()
|
|
|
self.tableView.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
|
|
|
self.tableView.doubleClicked.connect(self.on_table_item_double_clicked) # 连接双击事件
|
|
|
self.retranslateUi(Form)
|
|
|
QtCore.QMetaObject.connectSlotsByName(Form)
|
|
|
|
|
|
def retranslateUi(self, Form):
|
|
|
_translate = QtCore.QCoreApplication.translate
|
|
|
Form.setWindowTitle(_translate("Form", "Form"))
|
|
|
self.label.setText(_translate("Form", "起始日期:"))
|
|
|
self.label_2.setText(_translate("Form", "终止日期:"))
|
|
|
self.label_3.setText(_translate("Form", "编号:"))
|
|
|
self.pushButton.setText(_translate("Form", "查询"))
|
|
|
|
|
|
def signalconnect(self):
|
|
|
# 连接按钮点击信号到 searchButton 方法
|
|
|
self.pushButton.clicked.connect(self.searchButton)
|
|
|
# 连接日期编辑的变化信号
|
|
|
self.dateEdit.dateChanged.connect(self.update_dateEdit_2_min_date)
|
|
|
|
|
|
def searchButton(self):
|
|
|
# 获取用户输入的日期范围和编号
|
|
|
start_date = self.dateEdit.date().toString("yyyy-MM-dd")
|
|
|
end_date = self.dateEdit_2.date().toString("yyyy-MM-dd")
|
|
|
search_text = self.lineEdit.text()
|
|
|
|
|
|
# 根据输入的条件查询数据库
|
|
|
filtered_data = self.get_filtered_data_from_db(start_date, end_date, search_text)
|
|
|
|
|
|
# 显示查询结果到 tableView
|
|
|
self.display_data_in_table(filtered_data)
|
|
|
|
|
|
def set_dates(self):
|
|
|
# 获取数据库中最早的日期
|
|
|
earliest_date = self.get_earliest_date_from_db()
|
|
|
|
|
|
# 设置 dateEdit 为数据库中最早的日期
|
|
|
if earliest_date:
|
|
|
self.dateEdit.setDate(QtCore.QDate.fromString(earliest_date, "yyyy-MM-dd"))
|
|
|
self.dateEdit.setMinimumDate(QtCore.QDate.fromString(earliest_date, "yyyy-MM-dd")) # 限制不能低于最早日期
|
|
|
|
|
|
# 设置 dateEdit_2 为今天的日期
|
|
|
today = QtCore.QDate.currentDate()
|
|
|
self.dateEdit_2.setDate(today)
|
|
|
|
|
|
# 设置 dateEdit_2 的最小日期为 dateEdit 的当前日期
|
|
|
self.dateEdit_2.setMinimumDate(self.dateEdit.date())
|
|
|
|
|
|
# 初始化数据:加载初始范围内的数据到 tableView
|
|
|
start_date = self.dateEdit.date().toString("yyyy-MM-dd")
|
|
|
end_date = self.dateEdit_2.date().toString("yyyy-MM-dd")
|
|
|
filtered_data = self.get_filtered_data_from_db(start_date, end_date, "")
|
|
|
|
|
|
self.display_data_in_table(filtered_data)
|
|
|
|
|
|
def get_earliest_date_from_db(self):
|
|
|
# 假设你使用 SQLite 数据库,获取最早日期的查询语句
|
|
|
try:
|
|
|
connection = sqlite3.connect("PCB_database.db") # 替换为你的数据库文件路径
|
|
|
cursor = connection.cursor()
|
|
|
cursor.execute("SELECT MIN(date_added) FROM results") # 替换为你的表和日期列
|
|
|
earliest_date = cursor.fetchone()[0]
|
|
|
connection.close()
|
|
|
return earliest_date # 返回最早的日期字符串,格式为 "yyyy-MM-dd"
|
|
|
except Exception as e:
|
|
|
print(f"Error fetching earliest date: {e}")
|
|
|
return None
|
|
|
|
|
|
def get_filtered_data_from_db(self, start_date, end_date, search_text):
|
|
|
# 假设你使用 SQLite 数据库,查询在 start_date 和 end_date 之间的数据,并根据 search_text 筛选
|
|
|
try:
|
|
|
connection = sqlite3.connect("PCB_database.db") # 替换为你的数据库文件路径
|
|
|
cursor = connection.cursor()
|
|
|
query = f"""
|
|
|
SELECT * FROM results
|
|
|
WHERE date_added BETWEEN ? AND ? AND id LIKE ?
|
|
|
"""
|
|
|
cursor.execute(query, (start_date, end_date, f"%{search_text}%"))
|
|
|
data = cursor.fetchall()
|
|
|
connection.close()
|
|
|
return data # 返回查询结果
|
|
|
except Exception as e:
|
|
|
print(f"Error fetching filtered data: {e}")
|
|
|
return []
|
|
|
|
|
|
def display_data_in_table(self, data):
|
|
|
# 将数据填充到 tableView 中
|
|
|
model = QtGui.QStandardItemModel()
|
|
|
model.setHorizontalHeaderLabels(["编号", "类别", "位置","置信度", "图片位置", "检测时间"]) # 替换为你的列名
|
|
|
|
|
|
# 添加数据行到 model
|
|
|
for row in data:
|
|
|
row_items = [QtGui.QStandardItem(str(cell)) for cell in row]
|
|
|
model.appendRow(row_items)
|
|
|
|
|
|
# 设置模型到 tableView
|
|
|
self.tableView.setModel(model)
|
|
|
|
|
|
# 调整列宽以适应内容
|
|
|
self.tableView.resizeColumnsToContents() # 自动调整列宽
|
|
|
|
|
|
# 确保最后一列填满剩余空间
|
|
|
header = self.tableView.horizontalHeader()
|
|
|
header.setStretchLastSection(True) # 使最后一列占据剩余空间
|
|
|
|
|
|
# 调整窗口大小
|
|
|
self.adjust_window_size()
|
|
|
|
|
|
def update_dateEdit_2_min_date(self):
|
|
|
# 更新 dateEdit_2 的最小日期为 dateEdit 的当前日期
|
|
|
self.dateEdit_2.setMinimumDate(self.dateEdit.date()) # 仅设置最小日期,显示的日期保持不变
|
|
|
|
|
|
def adjust_window_size(self):
|
|
|
# 获取父窗口的宽度
|
|
|
parent = self.tableView.parent()
|
|
|
if parent:
|
|
|
# 获取 tableView 的列宽总和
|
|
|
table_width = self.tableView.horizontalHeader().length()
|
|
|
new_width = table_width + 50 # 给窗口额外留出 50 的边距
|
|
|
|
|
|
# 更新父窗口的宽度,保持高度不变
|
|
|
parent.resize(new_width, parent.height()) # 仅修改宽度
|
|
|
|
|
|
def on_table_item_double_clicked(self, index):
|
|
|
# 获取双击的行号和列号
|
|
|
row = index.row()
|
|
|
column = index.column()
|
|
|
if column != 4: # 如果不是图片位置列,仍然处理
|
|
|
image_path = self.tableView.model().data(self.tableView.model().index(row, 4))
|
|
|
|
|
|
# 如果路径有效,打开图片
|
|
|
if image_path:
|
|
|
self.show_image(image_path)
|
|
|
|
|
|
def show_image(self, image_path):
|
|
|
# 打开图片
|
|
|
try:
|
|
|
# 使用QPixmap来加载图片
|
|
|
pixmap = QtGui.QPixmap(image_path)
|
|
|
|
|
|
if not pixmap.isNull():
|
|
|
# 创建图形视图窗口显示图片
|
|
|
image_window = QtWidgets.QDialog()
|
|
|
image_window.setWindowTitle("图片查看")
|
|
|
image_window.setFixedSize(pixmap.width(), pixmap.height())
|
|
|
|
|
|
# 创建一个图形视图(Graphics View)来显示图片
|
|
|
view = QtWidgets.QGraphicsView(image_window)
|
|
|
scene = QtWidgets.QGraphicsScene(view)
|
|
|
view.setScene(scene)
|
|
|
|
|
|
# 创建一个PixMap项,并将图片添加到场景中
|
|
|
pixmap_item = QtWidgets.QGraphicsPixmapItem(pixmap)
|
|
|
scene.addItem(pixmap_item)
|
|
|
|
|
|
image_window.exec_() # 显示窗口
|
|
|
else:
|
|
|
QtWidgets.QMessageBox.warning(None, "错误", "无法加载图片!")
|
|
|
except Exception as e:
|
|
|
QtWidgets.QMessageBox.warning(None, "错误", f"打开图片时出错: {str(e)}")
|
|
|
|
|
|
|
|
|
|