是否可以将 QInputDialog 与嵌套列表或类似的东西一起使用?
Is it possible to use QInputDialog with nested list or something like that?
我发现的关于 PyQt5 QInputDialog 的所有示例或文档都使用简单的经典列表,每个 "row" 仅限一个项目(就像在我的代码示例中("Red"、"Blue" 或 "Green")).
我正在寻找一种构建更详细的多维列表的好方法,例如 table,用户可以在其中看到 select 整行(将多个值作为一个项目) 在输入对话框中而不是单个值。
例如像这样的嵌套列表:
[['Ryan', 24, 'm'], ['Lisa', 22, 'f'], ['Joe', 30, 'm']]
--> 假设列表中的三个列表中的每一个都应该是 QInputDialog 中可以 selected 的一行(条目)。就像在 table 中一样,每行都有一个复选框。
这样的事情可能吗?有人知道吗?
#The normal (limited) version with a simple list I am referring to looks like that:
def getChoice(self):
itemlist = ("Red","Blue","Green")
item, okPressed = QInputDialog.getItem(self, "Get item","Color:", itemlist, 0, False)
if okPressed and item:
print(item)
join()
方法获取一个可迭代对象中的所有项目并将它们连接成一个字符串。
语法:string.join(iterable)
import sys
from PyQt5.QtCore import QTimer
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QLineEdit, QInputDialog, QLabel, QVBoxLayout
class PopupDialog(QtWidgets.QDialog):
def __init__(self):
super(PopupDialog, self).__init__()
self.selected_item = None
layout = QtWidgets.QFormLayout()
self.setLayout(layout)
self.setWindowTitle("New Popup")
self.setMinimumWidth(400)
# items = (['Ryan', 24, 'm'], ['Lisa', 22, 'f'], ['Joe', 30, 'm'])
items = (['Ryan', '24', 'm'], ['Lisa', '22', 'f'], ['Joe', '30', 'm'])
items = [ " ".join(item) for item in items ] # <<<-----<
item, okPressed = QInputDialog.getItem(self, "Get item",
"Color:", items, 0, False)
if okPressed and item:
self.selected_item = item
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.setMinimumWidth(600)
self.setWindowTitle("Main Window")
self.le = QtWidgets.QLineEdit()
button = QtWidgets.QPushButton("Select...")
button.clicked.connect(self.get_input)
layout = QtWidgets.QHBoxLayout()
layout.addWidget(self.le)
layout.addWidget(button)
self.setLayout(layout)
def get_input(self):
popup = PopupDialog()
print("got selection data: ", popup.selected_item)
self.le.setText(popup.selected_item)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
我发现的关于 PyQt5 QInputDialog 的所有示例或文档都使用简单的经典列表,每个 "row" 仅限一个项目(就像在我的代码示例中("Red"、"Blue" 或 "Green")).
我正在寻找一种构建更详细的多维列表的好方法,例如 table,用户可以在其中看到 select 整行(将多个值作为一个项目) 在输入对话框中而不是单个值。
例如像这样的嵌套列表: [['Ryan', 24, 'm'], ['Lisa', 22, 'f'], ['Joe', 30, 'm']]
--> 假设列表中的三个列表中的每一个都应该是 QInputDialog 中可以 selected 的一行(条目)。就像在 table 中一样,每行都有一个复选框。
这样的事情可能吗?有人知道吗?
#The normal (limited) version with a simple list I am referring to looks like that:
def getChoice(self):
itemlist = ("Red","Blue","Green")
item, okPressed = QInputDialog.getItem(self, "Get item","Color:", itemlist, 0, False)
if okPressed and item:
print(item)
join()
方法获取一个可迭代对象中的所有项目并将它们连接成一个字符串。
语法:string.join(iterable)
import sys
from PyQt5.QtCore import QTimer
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QLineEdit, QInputDialog, QLabel, QVBoxLayout
class PopupDialog(QtWidgets.QDialog):
def __init__(self):
super(PopupDialog, self).__init__()
self.selected_item = None
layout = QtWidgets.QFormLayout()
self.setLayout(layout)
self.setWindowTitle("New Popup")
self.setMinimumWidth(400)
# items = (['Ryan', 24, 'm'], ['Lisa', 22, 'f'], ['Joe', 30, 'm'])
items = (['Ryan', '24', 'm'], ['Lisa', '22', 'f'], ['Joe', '30', 'm'])
items = [ " ".join(item) for item in items ] # <<<-----<
item, okPressed = QInputDialog.getItem(self, "Get item",
"Color:", items, 0, False)
if okPressed and item:
self.selected_item = item
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.setMinimumWidth(600)
self.setWindowTitle("Main Window")
self.le = QtWidgets.QLineEdit()
button = QtWidgets.QPushButton("Select...")
button.clicked.connect(self.get_input)
layout = QtWidgets.QHBoxLayout()
layout.addWidget(self.le)
layout.addWidget(button)
self.setLayout(layout)
def get_input(self):
popup = PopupDialog()
print("got selection data: ", popup.selected_item)
self.le.setText(popup.selected_item)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())