PySide 弹出窗口显示列表和多个 select
PySide popup showing list and multiple select
我正在使用 PySide 编写 GUI。我目前有用户 select 一个目录,里面有很多数据文件。我将这些文件名加载到一个列表中。我希望 GUI 显示一个弹出菜单,显示文件名列表,允许用户 select 一个、多个或所有文件继续。现在我正在使用,
items, ok = QInputDialog.getItem(self, "Select files", "List of files", datafiles, 0, False)
这只允许用户 select 一个文件,而不是多个。我如何向用户显示项目列表并让他们根据需要突出显示,然后 return 列表?
谢谢!
QInputDialog class 提供了一个简单方便的对话框,可以从用户那里获取 单个 值,但我们可以创建自定义对话框。
import sys
from PySide.QtCore import Qt
from PySide.QtGui import QApplication, QDialog, QDialogButtonBox, QFormLayout, \
QLabel, QListView, QPushButton, QStandardItem, QStandardItemModel, QWidget
class MyDialog(QDialog):
def __init__(self, title, message, items, parent=None):
super(MyDialog, self).__init__(parent=parent)
form = QFormLayout(self)
form.addRow(QLabel(message))
self.listView = QListView(self)
form.addRow(self.listView)
model = QStandardItemModel(self.listView)
self.setWindowTitle(title)
for item in items:
# create an item with a caption
standardItem = QStandardItem(item)
standardItem.setCheckable(True)
model.appendRow(standardItem)
self.listView.setModel(model)
buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
form.addRow(buttonBox)
buttonBox.accepted.connect(self.accept)
buttonBox.rejected.connect(self.reject)
def itemsSelected(self):
selected = []
model = self.listView.model()
i = 0
while model.item(i):
if model.item(i).checkState():
selected.append(model.item(i).text())
i += 1
return selected
class Widget(QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent=parent)
self.btn = QPushButton('Select', self)
self.btn.move(20, 20)
self.btn.clicked.connect(self.showDialog)
self.setGeometry(300, 300, 290, 150)
self.setWindowTitle('Input dialog')
def showDialog(self):
items = [str(x) for x in range(10)]
dial = MyDialog("Select files", "List of files", items, self)
if dial.exec_() == QDialog.Accepted:
print(dial.itemsSelected())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Widget()
ex.show()
sys.exit(app.exec_())
点击按钮后:
输出:
['1', '2', '4', '5']
我正在使用 PySide 编写 GUI。我目前有用户 select 一个目录,里面有很多数据文件。我将这些文件名加载到一个列表中。我希望 GUI 显示一个弹出菜单,显示文件名列表,允许用户 select 一个、多个或所有文件继续。现在我正在使用,
items, ok = QInputDialog.getItem(self, "Select files", "List of files", datafiles, 0, False)
这只允许用户 select 一个文件,而不是多个。我如何向用户显示项目列表并让他们根据需要突出显示,然后 return 列表?
谢谢!
QInputDialog class 提供了一个简单方便的对话框,可以从用户那里获取 单个 值,但我们可以创建自定义对话框。
import sys
from PySide.QtCore import Qt
from PySide.QtGui import QApplication, QDialog, QDialogButtonBox, QFormLayout, \
QLabel, QListView, QPushButton, QStandardItem, QStandardItemModel, QWidget
class MyDialog(QDialog):
def __init__(self, title, message, items, parent=None):
super(MyDialog, self).__init__(parent=parent)
form = QFormLayout(self)
form.addRow(QLabel(message))
self.listView = QListView(self)
form.addRow(self.listView)
model = QStandardItemModel(self.listView)
self.setWindowTitle(title)
for item in items:
# create an item with a caption
standardItem = QStandardItem(item)
standardItem.setCheckable(True)
model.appendRow(standardItem)
self.listView.setModel(model)
buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
form.addRow(buttonBox)
buttonBox.accepted.connect(self.accept)
buttonBox.rejected.connect(self.reject)
def itemsSelected(self):
selected = []
model = self.listView.model()
i = 0
while model.item(i):
if model.item(i).checkState():
selected.append(model.item(i).text())
i += 1
return selected
class Widget(QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent=parent)
self.btn = QPushButton('Select', self)
self.btn.move(20, 20)
self.btn.clicked.connect(self.showDialog)
self.setGeometry(300, 300, 290, 150)
self.setWindowTitle('Input dialog')
def showDialog(self):
items = [str(x) for x in range(10)]
dial = MyDialog("Select files", "List of files", items, self)
if dial.exec_() == QDialog.Accepted:
print(dial.itemsSelected())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Widget()
ex.show()
sys.exit(app.exec_())
点击按钮后:
输出:
['1', '2', '4', '5']