- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我开发了一个带有复选框的简单对话框,允许用户从列表中选择一个或多个项目。除了标准的确定和取消按钮外,它还添加了全选和取消全选按钮,允许用户一次选中/取消选中所有项目(这对于大型列表很方便)。
import os, sys
from PyQt4 import Qt, QtCore, QtGui
class ChecklistDialog(QtGui.QDialog):
def __init__(self, name, stringlist=None, checked=False, icon=None, parent=None):
super(ChecklistDialog, self).__init__(parent)
self.name = name
self.icon = icon
self.model = QtGui.QStandardItemModel()
self.listView = QtGui.QListView()
if stringlist is not None:
for i in range(len(stringlist)):
item = QtGui.QStandardItem(stringlist[i])
item.setCheckable(True)
check = QtCore.Qt.Checked if checked else QtCore.Qt.Unchecked
item.setCheckState(check)
self.model.appendRow(item)
self.listView.setModel(self.model)
self.okButton = QtGui.QPushButton("OK")
self.cancelButton = QtGui.QPushButton("Cancel")
self.selectButton = QtGui.QPushButton("Select All")
self.unselectButton = QtGui.QPushButton("Unselect All")
hbox = QtGui.QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(self.okButton)
hbox.addWidget(self.cancelButton)
hbox.addWidget(self.selectButton)
hbox.addWidget(self.unselectButton)
vbox = QtGui.QVBoxLayout()
vbox.addWidget(self.listView)
vbox.addStretch(1)
vbox.addLayout(hbox)
self.setLayout(vbox)
#self.setLayout(layout)
self.setWindowTitle(self.name)
if self.icon is not None: self.setWindowIcon(self.icon)
self.okButton.clicked.connect(self.accept)
self.cancelButton.clicked.connect(self.reject)
self.selectButton.clicked.connect(self.select)
self.unselectButton.clicked.connect(self.unselect)
def reject(self):
QtGui.QDialog.reject(self)
def accept(self):
self.choices = []
i = 0
while self.model.item(i):
if self.model.item(i).checkState():
self.choices.append(self.model.item(i).text())
i += 1
QtGui.QDialog.accept(self)
def select(self):
i = 0
while self.model.item(i):
item = self.model.item(i)
if not item.checkState():
item.setCheckState(True)
i += 1
def unselect(self):
i = 0
while self.model.item(i):
item = self.model.item(i)
item.setCheckState(False)
i += 1
if __name__ == "__main__":
fruits = ["Banana", "Apple", "Elderberry", "Clementine", "Fig",
"Guava", "Mango", "Honeydew Melon", "Date", "Watermelon",
"Tangerine", "Ugli Fruit", "Juniperberry", "Kiwi", "Lemon",
"Nectarine", "Plum", "Raspberry", "Strawberry", "Orange"]
app = QtGui.QApplication(sys.argv)
form = ChecklistDialog("Fruit", fruits, checked=True)
if form.exec_():
print("\n".join([str(s) for s in form.choices]))
上面的代码有效,但我对 QListView 的奇怪行为感到困扰:当对话框显示时“check”参数变为 True,所有复选框都显示为带有“X”标记的选中状态(如预期的那样)。但是,当单击“全选”按钮时,复选框会变成灰色(尽管正确选择了项目)。我希望它们显示有“X”标记,以便向用户呈现一致的外观。
见下图。
一般来说,我的问题是:如何控制复选框在 QListView 中的显示方式?
最佳答案
问题是因为states引起的QCheckBox
有 3 个:
Qt::Unchecked 0 The item is unchecked.
Qt::PartiallyChecked 1 The item is partially checked. Items in hierarchical models may be partially checked if some, but not all, of their children are checked.
Qt::Checked 2 The item is checked.
如您所见,它们是整数值,当您传递 True 的值时,它被转换为 1,这相当于 Qt::PartiallyChecked
那些您得到的是矩形而不是十字.
解决方案是向它传递正确的值:QtCore.Qt.Checked
,如下所示:
import sys
from PyQt4 import Qt, QtCore, QtGui
class ChecklistDialog(QtGui.QDialog):
def __init__(
self,
name,
stringlist=None,
checked=False,
icon=None,
parent=None,
):
super(ChecklistDialog, self).__init__(parent)
self.name = name
self.icon = icon
self.model = QtGui.QStandardItemModel()
self.listView = QtGui.QListView()
for string in stringlist:
item = QtGui.QStandardItem(string)
item.setCheckable(True)
check = \
(QtCore.Qt.Checked if checked else QtCore.Qt.Unchecked)
item.setCheckState(check)
self.model.appendRow(item)
self.listView.setModel(self.model)
self.okButton = QtGui.QPushButton('OK')
self.cancelButton = QtGui.QPushButton('Cancel')
self.selectButton = QtGui.QPushButton('Select All')
self.unselectButton = QtGui.QPushButton('Unselect All')
hbox = QtGui.QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(self.okButton)
hbox.addWidget(self.cancelButton)
hbox.addWidget(self.selectButton)
hbox.addWidget(self.unselectButton)
vbox = QtGui.QVBoxLayout(self)
vbox.addWidget(self.listView)
vbox.addStretch(1)
vbox.addLayout(hbox)
self.setWindowTitle(self.name)
if self.icon:
self.setWindowIcon(self.icon)
self.okButton.clicked.connect(self.onAccepted)
self.cancelButton.clicked.connect(self.reject)
self.selectButton.clicked.connect(self.select)
self.unselectButton.clicked.connect(self.unselect)
def onAccepted(self):
self.choices = [self.model.item(i).text() for i in
range(self.model.rowCount())
if self.model.item(i).checkState()
== QtCore.Qt.Checked]
self.accept()
def select(self):
for i in range(self.model.rowCount()):
item = self.model.item(i)
item.setCheckState(QtCore.Qt.Checked)
def unselect(self):
for i in range(self.model.rowCount()):
item = self.model.item(i)
item.setCheckState(QtCore.Qt.Unchecked)
if __name__ == '__main__':
fruits = [
'Banana',
'Apple',
'Elderberry',
'Clementine',
'Fig',
'Guava',
'Mango',
'Honeydew Melon',
'Date',
'Watermelon',
'Tangerine',
'Ugli Fruit',
'Juniperberry',
'Kiwi',
'Lemon',
'Nectarine',
'Plum',
'Raspberry',
'Strawberry',
'Orange',
]
app = QtGui.QApplication(sys.argv)
form = ChecklistDialog('Fruit', fruits, checked=True)
if form.exec_() == QtGui.QDialog.Accepted:
print '\n'.join([str(s) for s in form.choices])
关于python - QListView 中的复选框选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50666680/
我想从一个 QListView 实现拖放功能到另一个。拖放操作会将拖动项目的文本复制到另一个 QListView .我希望拖放是单向的,我的意思是仅来自 QListView A转QListView B
import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * class Widget(QWidget): def _
我有一个关于当模型对象在外部发生变化时更新 QTreeView(或 QAbstractItemView 的任何子类)的简单问题。假设一个列表显示了 QAbstractItemModel 的一个子类,并
我有一个 QListView 其中有 5 个项目。在我的 QListView 中说(美国、加拿大、丹麦、埃及、芬兰)。现在我想设置一个通用的 所有这些项目的标题为国家 .如何将标题设置为 QListV
我试图按名称、创建日期和上次访问日期(所有升序和降序)对 QFileSystemModel 进行排序。我使用 QSortFilterProxyModel 进行排序。更改排序顺序时不知何故有一个奇怪的效
当鼠标悬停在特定的 ListView 项上时,我想做一些事情。我尝试了 enter(QModelIndex) 信号,但是当光标移动到项目上时它似乎没有发出(即使当光标移动到项目上时它们会突出显示)。是
我正在尝试向 Qt QListView 添加上下文(右键单击)菜单。我在 Qt 3.3 中看到有“contextMenuRequested”(我可以使用) - http://doc.qt.digia.
我正在使用 QListView显示我可以拖放以更改其顺序的项目列表。 问题在于: 下降指示器只是一条非常小的线(1px 粗) 掉落区域非常狭窄,因此需要非常准确才能在其他两个元素之间正确放置元素。 我
当 QListView 中没有项目时,我想显示一些文本(例如“无项目”)。 我尝试重写QListView的paintEvent方法,但没有任何效果。 最佳答案 下面的代码显示了一种通过重载 View
需要在带有图标和复选框的 QListView 中按给定路径列出目录,然后将标记文件夹的名称传输到程序。对于列表目录,我使用代码: #include #include #include i
作为我上一篇文章的另一个问题的延伸。拥有QListView,可以保存和恢复QListview中项目的选择。恢复后所选项目的索引无法正确打印。 使用currentchange - slot方法更改索引,
我正在尝试将独占复选框作为 QListView 项目。我使用 QStandardItemModel 作为带有 QStandardItem 的模型。 我正在向列表中动态添加项目并将其设置为可检查: QS
我正在尝试编写一个 QListView 模型并将其链接到我的主 UI(来自 Qt Designer) 这是我的主要功能: #include "notepad.h" #include int main
我使用 QListView(在 PyQt5 中)来显示字符串。我想让该列表中每个项目的背景颜色在两种颜色之间变化,以使其更易于阅读。 我试过 Qt.DecorationRole 但这只会在每个项目的左
我不明白为什么我的 QListView 小部件不显示滚动条,或者有时将它们显示为黑色。我无法滚动,即使使用向上/向下键也无法滚动。 这是它的样子 这是小部件的 ui 部分
我开发了一个带有复选框的简单对话框,允许用户从列表中选择一个或多个项目。除了标准的确定和取消按钮外,它还添加了全选和取消全选按钮,允许用户一次选中/取消选中所有项目(这对于大型列表很方便)。 impo
我实现了一个继承 QListView 的新类,现在我想修改 sizeHint() 来计算我的新列表查看器的最佳宽度。 首先想到的是连接模型的插入,检索最大长度,但是怎么做呢?或者有更好的建议吗? 非常
我希望用 pyqt4 制作一个小 GUI,逐行显示“dir c:\windows\”的输出我正在寻找 QlistView 但我不明白该怎么做。谁能帮我吗? 最佳答案 import os for roo
总的来说,我对 PyQT 和 QT 还是(非常)陌生,必须快速设计一个与现代 2 Pane 邮件应用程序大致相似的用户界面:左边是邮件列表,右边是编辑器。我想提供更多的信息,而不仅仅是要在 QList
我有一个带有字符串列表的 QListView。 基本上,我将它用作自动完成过程的 QLineEdit 的弹出窗口。我不希望 QListView 显示空白行,只显示其中包含字符串的行。看到这个: 我希望
我是一名优秀的程序员,十分优秀!