Skip to content

Commit fbd850b

Browse files
committed
UI交互和输入字段处理部分完成
1 parent e234c5b commit fbd850b

File tree

3 files changed

+198
-17
lines changed

3 files changed

+198
-17
lines changed

formater.py

Lines changed: 174 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,19 @@
33
# @Filename : formater.py
44
# @Date : 18-1-26 下午5:48
55
# @Author : DebuggerX
6+
from functools import partial
67

78
from mainwindow import *
89
import json
910

11+
# 定义显示的json格式化字符串的缩进量为4个空格
12+
indent = ' '
1013

14+
# 临时存储
15+
last_list_com_box = None
16+
17+
18+
# 验证json字符串是否合法
1119
def is_json(myjson):
1220
try:
1321
json.loads(myjson)
@@ -16,25 +24,189 @@ def is_json(myjson):
1624
return True
1725

1826

27+
# 传入未格式化的单行json字符串,返回指定缩进的多行json字符串
1928
def jformat(inp):
2029
obj = json.loads(inp)
2130
outp = json.dumps(obj, skipkeys=False, ensure_ascii=False, check_circular=True, allow_nan=True, cls=None, indent=' ', separators=None,
2231
default=None, sort_keys=True)
2332
return outp
2433

2534

35+
def analyse_json_obj(json_obj, level=0, res=None, json_key=None):
36+
if res is None:
37+
res = []
38+
39+
# 对字典对象的属性按照基本数据类型->list类型->dict类型的次序排序
40+
if isinstance(json_obj, dict):
41+
json_obj = sorted(
42+
json_obj.items(), key=lambda x:
43+
(
44+
isinstance(x[1], dict),
45+
isinstance(x[1], list),
46+
isinstance(x[1], str),
47+
isinstance(x[1], bool),
48+
isinstance(x[1], float),
49+
isinstance(x[1], int),
50+
x[0]
51+
)
52+
)
53+
54+
# 插入父层级数据为dict类型,类型序号为8,层级深度+1,遍历解析所有子属性
55+
if json_key is None:
56+
res.append('%s<[dict]>8' % (indent * level))
57+
else:
58+
res.append('%s<%s> : <[dict]>8' % (indent * level, json_key))
59+
level += 1
60+
for key, value in json_obj:
61+
analyse_json_obj(value, level, res, key)
62+
63+
elif isinstance(json_obj, list):
64+
# 插入父层级数据为list类型,类型序号为9,层级深度+1,并取其第一个元素继续解析
65+
if json_key is None:
66+
res.append('%s<[list]>9' % (indent * level))
67+
else:
68+
res.append('%s <%s> : <[list]>9' % (indent * level, json_key))
69+
if len(json_obj) > 0:
70+
analyse_json_obj(json_obj[0], level + 1, res)
71+
72+
else:
73+
# 针对基本数据类型,在插入的键值对数据后再加入类型序号标志位
74+
obj_type = type(json_obj)
75+
if obj_type is int:
76+
obj_type = 1
77+
elif obj_type is float:
78+
obj_type = 2
79+
elif obj_type is bool:
80+
obj_type = 3
81+
elif obj_type is str:
82+
obj_type = 4
83+
else:
84+
obj_type = 0
85+
res.append('%s<%s> : <%s>%d' % (indent * level, json_key, json_obj, obj_type))
86+
87+
return res
88+
89+
90+
def change_text(com_box, current_text):
91+
com_box.setCurrentText('List<%s>' % current_text)
92+
93+
94+
# 生成字段类型下拉框
95+
def get_type_combobox(line):
96+
com_box = QtWidgets.QComboBox()
97+
com_box.setEditable(True)
98+
obj_type = int(line[-1]) if line[-1].isdigit() else 0
99+
100+
if last_list_com_box is not None:
101+
com_box.currentTextChanged.connect(partial(change_text, last_list_com_box))
102+
last_list_com_box = None
103+
104+
# 根据字段数据的最后一位数字标记指定下拉框默认类型
105+
if obj_type < 8:
106+
com_box.addItem('Object')
107+
com_box.addItem('int')
108+
com_box.addItem('double')
109+
com_box.addItem('bool')
110+
com_box.addItem('String')
111+
112+
com_box.setCurrentIndex(obj_type)
113+
elif obj_type == 8:
114+
com_box.setCurrentText('')
115+
elif obj_type == 9:
116+
com_box.setCurrentText('List<>')
117+
# 将该list字段的编辑框临时保存,用于与下一个字段的类型绑定
118+
global last_list_com_box
119+
last_list_com_box = com_box
120+
121+
return com_box
122+
123+
124+
def get_name_text_edit(line):
125+
te = QtWidgets.QTextEdit(line[line.find('<') + 1:line.find('>')])
126+
127+
return te
128+
129+
130+
def update_list(json_str):
131+
json_obj = json.loads(json_str)
132+
# 传入json对象,返回所需要的格式化协议数据数组
133+
res = analyse_json_obj(json_obj)
134+
135+
ui.tv_fields.setRowCount(len(res))
136+
137+
for i in range(len(res)):
138+
line = res[i]
139+
assert isinstance(line, str)
140+
index = line.find('<')
141+
142+
ui.tv_fields.setCellWidget(i, 1, get_type_combobox(line))
143+
if line.strip() == '<[dict]>8':
144+
label = QtWidgets.QLabel("")
145+
label.setStyleSheet("background-color: rgb(200,200,200);")
146+
ui.tv_fields.setCellWidget(i, 2, label)
147+
else:
148+
ui.tv_fields.setCellWidget(i, 2, get_name_text_edit(line))
149+
150+
if index == 0:
151+
field = line.replace('<', '').replace('>', '')
152+
else:
153+
field = ("%s※==》%s" % (' ' * (index - 4), line[index:])).replace('<', '').replace('>', '')
154+
155+
label = QtWidgets.QLabel()
156+
label.setText(field[0:60] + '...' if len(field) > 60 else field[0:-1])
157+
label.setToolTip(field[0:-1])
158+
159+
ui.tv_fields.setCellWidget(i, 0, label)
160+
161+
ui.tv_fields.resizeColumnToContents(0)
162+
163+
26164
def json_format():
165+
# 从文本编辑框获取json字符串
27166
json_str = ui.te_json.toPlainText()
28167
if is_json(json_str):
168+
# 将格式化后的json字符串覆盖到文本编辑框中
29169
ui.te_json.setText(jformat(json_str.replace('\n', '')))
170+
171+
# 根据json更新表格条目
172+
update_list(json_str)
173+
30174
else:
31175
msg = QtWidgets.QMessageBox()
32176
msg.information(ui.te_json, "警告", "JSON不合法", QtWidgets.QMessageBox.Ok)
33177

34178

179+
def generate_bean():
180+
ui.te_json.setText("OK")
181+
182+
183+
def init_event():
184+
# 绑定json解析按钮事件
185+
ui.btn_format.clicked.connect(json_format)
186+
ui.btn_generate.clicked.connect(generate_bean)
187+
188+
189+
# 设置表格基础样式
190+
def init_table():
191+
# 设置表头,表头文字居中
192+
ui.tv_fields.setHorizontalHeaderLabels(['Fields', 'Types', 'Name'])
193+
ui.tv_fields.horizontalHeader().setDefaultAlignment(QtCore.Qt.AlignHCenter)
194+
# 表头自动平分宽度
195+
ui.tv_fields.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
196+
# 设置第一列为固定宽度,不参与平分
197+
ui.tv_fields.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.Fixed)
198+
ui.tv_fields.resizeColumnToContents(0)
199+
# 隐藏左侧垂直表头
200+
ui.tv_fields.verticalHeader().setVisible(False)
201+
202+
203+
def init_view():
204+
init_table()
205+
206+
35207
def customUI():
36-
ui.te_json.format = json_format
37-
ui.btn_format.clicked.connect(ui.te_json.format)
208+
init_view()
209+
init_event()
38210

39211

40212
if __name__ == "__main__":

mainwindow.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,31 +36,33 @@ def setupUi(self, MainWindow):
3636
self.splitter = QtWidgets.QSplitter(self.frame)
3737
self.splitter.setOrientation(QtCore.Qt.Horizontal)
3838
self.splitter.setObjectName("splitter")
39-
self.widget = QtWidgets.QWidget(self.splitter)
40-
self.widget.setObjectName("widget")
41-
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.widget)
39+
self.layoutWidget = QtWidgets.QWidget(self.splitter)
40+
self.layoutWidget.setObjectName("layoutWidget")
41+
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.layoutWidget)
4242
self.verticalLayout_3.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
4343
self.verticalLayout_3.setContentsMargins(11, 11, 11, 11)
4444
self.verticalLayout_3.setSpacing(6)
4545
self.verticalLayout_3.setObjectName("verticalLayout_3")
46-
self.btn_format = QtWidgets.QPushButton(self.widget)
46+
self.btn_format = QtWidgets.QPushButton(self.layoutWidget)
4747
self.btn_format.setObjectName("btn_format")
4848
self.verticalLayout_3.addWidget(self.btn_format)
49-
self.te_json = QtWidgets.QTextEdit(self.widget)
49+
self.te_json = QtWidgets.QTextEdit(self.layoutWidget)
5050
self.te_json.setObjectName("te_json")
5151
self.verticalLayout_3.addWidget(self.te_json)
52-
self.widget1 = QtWidgets.QWidget(self.splitter)
53-
self.widget1.setObjectName("widget1")
54-
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget1)
52+
self.layoutWidget1 = QtWidgets.QWidget(self.splitter)
53+
self.layoutWidget1.setObjectName("layoutWidget1")
54+
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget1)
5555
self.verticalLayout_2.setContentsMargins(11, 11, 11, 11)
5656
self.verticalLayout_2.setSpacing(6)
5757
self.verticalLayout_2.setObjectName("verticalLayout_2")
58-
self.btn_generate = QtWidgets.QPushButton(self.widget1)
58+
self.btn_generate = QtWidgets.QPushButton(self.layoutWidget1)
5959
self.btn_generate.setObjectName("btn_generate")
6060
self.verticalLayout_2.addWidget(self.btn_generate)
61-
self.lv_fields = QtWidgets.QListWidget(self.widget1)
62-
self.lv_fields.setObjectName("lv_fields")
63-
self.verticalLayout_2.addWidget(self.lv_fields)
61+
self.tv_fields = QtWidgets.QTableWidget(self.layoutWidget1)
62+
self.tv_fields.setColumnCount(3)
63+
self.tv_fields.setObjectName("tv_fields")
64+
self.tv_fields.setRowCount(0)
65+
self.verticalLayout_2.addWidget(self.tv_fields)
6466
self.verticalLayout_4.addWidget(self.splitter)
6567
self.verticalLayout.addWidget(self.frame)
6668
MainWindow.setCentralWidget(self.centralWidget)

mainwindow.ui

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
<property name="orientation">
4848
<enum>Qt::Horizontal</enum>
4949
</property>
50-
<widget class="QWidget" name="">
50+
<widget class="QWidget" name="layoutWidget">
5151
<layout class="QVBoxLayout" name="verticalLayout_3">
5252
<property name="sizeConstraint">
5353
<enum>QLayout::SetDefaultConstraint</enum>
@@ -64,7 +64,7 @@
6464
</item>
6565
</layout>
6666
</widget>
67-
<widget class="QWidget" name="">
67+
<widget class="QWidget" name="layoutWidget">
6868
<layout class="QVBoxLayout" name="verticalLayout_2">
6969
<item>
7070
<widget class="QPushButton" name="btn_generate">
@@ -74,7 +74,14 @@
7474
</widget>
7575
</item>
7676
<item>
77-
<widget class="QListWidget" name="lv_fields"/>
77+
<widget class="QTableWidget" name="tv_fields">
78+
<property name="columnCount">
79+
<number>3</number>
80+
</property>
81+
<column/>
82+
<column/>
83+
<column/>
84+
</widget>
7885
</item>
7986
</layout>
8087
</widget>

0 commit comments

Comments
 (0)