-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.py
More file actions
166 lines (156 loc) · 5.36 KB
/
main.py
File metadata and controls
166 lines (156 loc) · 5.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
import utils.database as db
import sys
import utils.slots as slots
import sqlite3
from utils.widgets import ImageViewer
from PySide6.QtWidgets import (
QApplication,
QWidget,
QVBoxLayout,
QHBoxLayout,
QSplitter,
QLabel,
QLineEdit,
QPushButton,
QListWidget,
QScrollArea,
QMainWindow,
)
from PySide6.QtCore import Qt
DB_PATH = "pics.db"
TARGET_DIR = "pics"
# 图像显示
app = QApplication(sys.argv)
mainwindow = QMainWindow()
mainwindow.setWindowTitle("HolyMyPics") # 设置窗口标题
mainwindow.resize(800, 600) # 设置窗口大小800x600
splitter = QSplitter(Qt.Vertical) # Qt.Vertical 表示垂直分割
splitter.setChildrenCollapsible(False) # 防止子窗口被折叠到看不见
#:imgViewer: 上半边文件预览器
imgViewer = QWidget()
top_layout = QVBoxLayout(imgViewer)
# 创建滚动区域
scroll_area = QScrollArea()
scroll_area.setWidgetResizable(True)
scroll_area.setAlignment(Qt.AlignCenter)
# 创建 ImageViewer 作为容器
container = ImageViewer(TARGET_DIR, mainwindow)
container.clear_images()
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
scroll_area.setWidget(container)
top_layout.addWidget(scroll_area)
#:imgViewer:加入布局
splitter.addWidget(imgViewer)
#:filterFrame: 下半边文件筛选器
filterFrame = QWidget()
bottom_layout = QVBoxLayout(filterFrame)
# :filterFrame:分区
horizontal_splitter = QSplitter(Qt.Horizontal)
horizontal_splitter.setChildrenCollapsible(False)
# :filterFrame:左半边
filterLeft = QWidget()
left_layout = QVBoxLayout(filterLeft)
# 标签输入行(水平布局)
tag_input_layout = QHBoxLayout()
# 标签输入框
tag_input = QLineEdit()
tag_input.setPlaceholderText("输入标签")
tag_input_layout.addWidget(tag_input)
# 添加标签按钮
add_tag_btn = QPushButton("添加")
add_tag_btn.clicked.connect( # 连接槽函数
lambda: slots.on_add_tag_clicked(tag_input, tag_list_widget)
)
tag_input_layout.addWidget(add_tag_btn)
# 移除最后一个标签按钮
remove_tag_btn = QPushButton("移除最后")
remove_tag_btn.clicked.connect(lambda: slots.on_remove_tag_clicked(tag_list_widget))
tag_input_layout.addWidget(remove_tag_btn)
# tag输入模块完成
left_layout.addLayout(tag_input_layout)
# 标签显示区域
left_layout.addWidget(QLabel("已添加的标签:"))
# 用于显示已添加标签的列表
tag_list_widget = QListWidget()
tag_list_widget.setMaximumHeight(150) # 限制高度,避免占用太多空间
left_layout.addWidget(tag_list_widget)
# 显示所有标签
show_all_tags_btn = QPushButton("显示所有标签")
show_all_tags_btn.clicked.connect(
lambda: slots.on_show_tags_clicked(
mainwindow, tag_list_widget, nickname_input, result_label, container
)
)
left_layout.addWidget(show_all_tags_btn)
# 添加弹性空间,让组件靠上排列
left_layout.addStretch()
# 左半边子组件加入布局
horizontal_splitter.addWidget(filterLeft)
# :filterFrame:右半边
filterRight = QWidget()
right_layout = QVBoxLayout(filterRight)
# 按昵称搜索
nickname_input = QLineEdit()
nickname_input.setPlaceholderText("输入昵称...")
right_layout.addWidget(nickname_input)
# 搜索按钮
search_btn = QPushButton("搜索")
# 迫于跨包,在main.py里实现按钮的搜索逻辑
def _on_search():
hashs = slots.on_search_clicked(tag_list_widget, nickname_input, result_label)
# 清空当前预览
container.clear_images()
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
for hashKey in hashs:
cursor.execute("SELECT * FROM files WHERE hash = ?", (hashKey,))
searchResult = cursor.fetchone()
# searchResult是以(hash, storageName, nickname, tags)格式的元组
# tags是一个json格式的数组
container.add_image(searchResult[0], searchResult[1], searchResult[2])
conn.close()
# 连接槽函数
search_btn.clicked.connect(lambda: _on_search())
right_layout.addWidget(search_btn)
# 显示找到的文件数量的标签
result_label = QLabel("找到 0 个文件")
result_label.setStyleSheet("font-weight: bold; color: #2ecc71;") # 可选样式
right_layout.addWidget(result_label)
right_layout.addStretch()
# 添加文件按钮
addfile_btn = QPushButton("添加文件")
addfile_btn.clicked.connect(
lambda: slots.on_addfile_btn_clicked(
mainwindow, tag_list_widget, nickname_input, result_label, container
)
)
right_layout.addWidget(addfile_btn)
# 子组件加入布局
horizontal_splitter.addWidget(filterRight)
# 把水平分割器添加到 filterFrame 的布局中
bottom_layout.addWidget(horizontal_splitter)
splitter.addWidget(filterFrame)
# 设置分割器布局
splitter.setSizes([480, 320]) # 上半500px,下半150px
mainwindow.setCentralWidget(splitter)
# 设置mw属性
mainwindow.tag_list_widget = tag_list_widget
mainwindow.nickname_input = nickname_input
mainwindow.result_label = result_label
mainwindow.container = container
# 初始化container里的图片
hashs = slots.on_search_clicked(tag_list_widget, nickname_input, result_label)
for hashKey in hashs:
cursor.execute("SELECT * FROM files WHERE hash = ?", (hashKey,))
searchResult = cursor.fetchone()
# searchResult是以(hash, storageName, nickname, tags)格式的元组
# tags是一个json格式的数组
container.add_image(searchResult[0], searchResult[1], searchResult[2])
conn.close()
def main():
mainwindow.showMaximized()
sys.exit(app.exec())
if __name__ == "__main__":
db.initDatabase()
main()