[英]In Python Django, how do I assign a charfield to a column in SQL based on the user's selection from a combobox?
[英]How to add another column in a QColumnView based on the user's selection?
使用 PySide2,我有一個包含 QColumnView 小部件的界面,我正在嘗試為其創建類似於聯系人查找的功能:選擇一個人的姓名和下一列,然后顯示有關該選擇的更多選項/詳細信息。
目前,我在 UI 加載時填充視圖,並顯示用戶可用的第一級選項。
期望的功能:當用戶進行選擇時,另一列被添加到 QColumnView,它根據用戶的選擇顯示可用的選項。
當前問題:當用戶進行選擇時,由於我不確定如何向 QColumnView 添加另一列/級別,而是更新 QColumnView 的模型並且只顯示下一級選項 - 意味着以前的值是可以這么說,在視圖中被覆蓋。 雖然這是功能性的,但並不理想,因為前一列仍在視圖中,使用戶能夠看到他們當前正在搜索的類別。
如此處所見,用戶選擇了“地址”,然后會在右側的列中顯示與“地址”相關聯的選項。
只是為了創建一個包含 QColumnView 的基本界面,它看起來像這樣:
import sys
from PySide2 import QtWidgets, QtCore
import PySide2
class UserInput(object):
def setupUi(self, get_user_input=None):
# Basic shape
self.width = 425
get_user_input.setObjectName("get_user_input")
get_user_input.resize(425, self.width)
self.frame = QtWidgets.QFrame(get_user_input)
self.frame.setGeometry(QtCore.QRect(11, 10, 401, 381))
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Sunken)
self.frame.setObjectName("frame")
# Creating the grid layout for most of the display elements
self.gridLayoutWidget = QtWidgets.QWidget(self.frame)
self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 381, 361))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.get_user_input_layout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.get_user_input_layout.setContentsMargins(5, 5, 5, 5)
self.get_user_input_layout.setObjectName("get_user_input_layout")
# Grid layout for the buttons
self.buttonLayoutGrid = QtWidgets.QWidget(get_user_input)
self.buttonLayoutGrid.setGeometry(QtCore.QRect(10, 390, 401, 41))
self.buttonLayoutGrid.setObjectName("buttonLayoutGrid")
self.buttonLayout = QtWidgets.QGridLayout(self.buttonLayoutGrid)
self.buttonLayout.setContentsMargins(0, 0, 0, 0)
self.buttonLayout.setObjectName("buttonLayout")
# Buttons
self.buttonOK = QtWidgets.QPushButton(self.buttonLayoutGrid)
self.buttonOK.setObjectName("buttonOK")
self.buttonOK.setText("OK")
self.buttonLayout.addWidget(self.buttonOK, 0, 1, 1, 1)
self.buttonCancel = QtWidgets.QPushButton(self.buttonLayoutGrid)
self.buttonCancel.setObjectName("buttonCancel")
self.buttonCancel.setText("CANCEL")
self.buttonLayout.addWidget(self.buttonCancel, 0, 2, 1, 1)
#Column View Data
self.t = PySide2.QtWidgets.QColumnView()
self.t.setColumnWidths([10,10])
model = PySide2.QtGui.QStandardItemModel()
model.setColumnCount(1)
model.setHorizontalHeaderLabels(['Data Collections'])
self._dict = {'Test 1': [1, 2, 3], 'Test 2': [4, 5, 6], 'Test 3': [7, 8, 9]}
_data = []
for each in self._dict:
resultItem = PySide2.QtGui.QStandardItem()
insertText = each
resultItem.setText(str(insertText))
model.appendRow(resultItem)
self.t.setModel(model)
self.t.clicked.connect(self.column_view_clicked)
self.get_user_input_layout.addWidget(self.t, 2,0,1,1)
def column_view_clicked(self, row):
model = PySide2.QtGui.QStandardItemModel()
model.setColumnCount(1)
model.setHorizontalHeaderLabels(['Analysis Variables'])
_data = []
for i in self._dict[row.data()]:
resultItem = PySide2.QtGui.QStandardItem()
resultItem.setText(str(i))
model.appendRow(resultItem)
self.t.createColumn(row)
class UserInputPrompt(PySide2.QtWidgets.QDialog, UserInput):
def __init__(self, path_to_image=None):
app = PySide2.QtWidgets.QApplication(sys.argv)
super(UserInputPrompt, self).__init__()
self.setupUi(self)
super(UserInputPrompt, self).exec_()
def get_user_input(self):
print("Get user selection")
def main():
UserInputPrompt()
if __name__ == '__main__':
main()
當你運行上面的代碼時,點擊界面左邊的任何一項('Test 1', 'Test 2' or 'Test 3'),結果會在現有列的右側添加一列但沒有數據目前正在那里居住 - 因為我目前不知道該怎么做。
OP 指出的要求只是 ColumnView 的功能,問題是您沒有傳遞具有正確結構化數據的模型。 如您所見,結構是一棵樹,其中有父節點和子節點,因此您必須使用該結構創建模型。 在這種情況下,我使用了 QStandardItemModel 來處理數據,如下所示:
import sys
from PySide2 import QtCore, QtGui, QtWidgets
def populateTree(children, parent):
for child in children:
child_item = QtGui.QStandardItem(child)
parent.appendRow(child_item)
if isinstance(children, dict):
populateTree(children[child], child_item)
class Dialog(QtWidgets.QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.frame = QtWidgets.QFrame(
frameShape=QtWidgets.QFrame.StyledPanel, frameShadow=QtWidgets.QFrame.Sunken
)
self.buttonOK = QtWidgets.QPushButton(self.tr("OK"))
self.buttonCancel = QtWidgets.QPushButton(self.tr("CANCEL"))
self.columnview = QtWidgets.QColumnView()
grid_layout = QtWidgets.QGridLayout(self)
grid_layout.addWidget(self.frame, 0, 0, 1, 2)
grid_layout.addWidget(self.buttonOK, 1, 0)
grid_layout.addWidget(self.buttonCancel, 1, 1)
lay = QtWidgets.QVBoxLayout(self.frame)
lay.addWidget(self.columnview)
data = {
"root1": {
"child11": ["subchild111", "subchild112"],
"child12": ["subchild121"],
},
"root2": {
"child21": ["subchild211"],
"child22": ["subchild221", "subchild222"],
},
}
self.model = QtGui.QStandardItemModel(self)
self.columnview.setModel(self.model)
populateTree(data, self.model.invisibleRootItem())
self.resize(1280, 480)
def main():
app = QtWidgets.QApplication(sys.argv)
w = Dialog()
w.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.